diff options
Diffstat (limited to 'target/linux/patches/3.13.6/raspberry.patch')
-rw-r--r-- | target/linux/patches/3.13.6/raspberry.patch | 7944 |
1 files changed, 1402 insertions, 6542 deletions
diff --git a/target/linux/patches/3.13.6/raspberry.patch b/target/linux/patches/3.13.6/raspberry.patch index 980740e8d..1e2050a44 100644 --- a/target/linux/patches/3.13.6/raspberry.patch +++ b/target/linux/patches/3.13.6/raspberry.patch @@ -1,6 +1,6 @@ -diff -Nur linux-3.13.6.orig/arch/arm/configs/bcmrpi_cutdown_defconfig linux-3.13.6/arch/arm/configs/bcmrpi_cutdown_defconfig ---- linux-3.13.6.orig/arch/arm/configs/bcmrpi_cutdown_defconfig 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/configs/bcmrpi_cutdown_defconfig 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/configs/bcmrpi_cutdown_defconfig linux-raspberry-pi/arch/arm/configs/bcmrpi_cutdown_defconfig +--- linux-3.13.6/arch/arm/configs/bcmrpi_cutdown_defconfig 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/configs/bcmrpi_cutdown_defconfig 2014-03-11 16:54:55.000000000 +0100 @@ -0,0 +1,503 @@ +CONFIG_EXPERIMENTAL=y +# CONFIG_LOCALVERSION_AUTO is not set @@ -505,10 +505,10 @@ diff -Nur linux-3.13.6.orig/arch/arm/configs/bcmrpi_cutdown_defconfig linux-3.13 +CONFIG_SPI=y +CONFIG_SPI_MASTER=y +CONFIG_SPI_BCM2708=m -diff -Nur linux-3.13.6.orig/arch/arm/configs/bcmrpi_defconfig linux-3.13.6/arch/arm/configs/bcmrpi_defconfig ---- linux-3.13.6.orig/arch/arm/configs/bcmrpi_defconfig 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/configs/bcmrpi_defconfig 2014-03-10 14:41:55.000000000 +0100 -@@ -0,0 +1,1088 @@ +diff -Nur linux-3.13.6/arch/arm/configs/bcmrpi_defconfig linux-raspberry-pi/arch/arm/configs/bcmrpi_defconfig +--- linux-3.13.6/arch/arm/configs/bcmrpi_defconfig 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/configs/bcmrpi_defconfig 2014-03-11 16:54:55.000000000 +0100 +@@ -0,0 +1,1089 @@ +# CONFIG_ARM_PATCH_PHYS_VIRT is not set +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_SYSVIPC=y @@ -901,6 +901,7 @@ diff -Nur linux-3.13.6.orig/arch/arm/configs/bcmrpi_defconfig linux-3.13.6/arch/ +CONFIG_CHR_DEV_ST=m +CONFIG_CHR_DEV_OSST=m +CONFIG_BLK_DEV_SR=m ++CONFIG_CHR_DEV_SG=m +CONFIG_SCSI_MULTI_LUN=y +CONFIG_SCSI_ISCSI_ATTRS=y +CONFIG_ISCSI_TCP=m @@ -1597,9 +1598,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/configs/bcmrpi_defconfig linux-3.13.6/arch/ +# CONFIG_CRYPTO_HW is not set +CONFIG_CRC_ITU_T=y +CONFIG_LIBCRC32C=y -diff -Nur linux-3.13.6.orig/arch/arm/configs/bcmrpi_emergency_defconfig linux-3.13.6/arch/arm/configs/bcmrpi_emergency_defconfig ---- linux-3.13.6.orig/arch/arm/configs/bcmrpi_emergency_defconfig 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/configs/bcmrpi_emergency_defconfig 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/configs/bcmrpi_emergency_defconfig linux-raspberry-pi/arch/arm/configs/bcmrpi_emergency_defconfig +--- linux-3.13.6/arch/arm/configs/bcmrpi_emergency_defconfig 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/configs/bcmrpi_emergency_defconfig 2014-03-11 16:51:54.000000000 +0100 @@ -0,0 +1,532 @@ +CONFIG_EXPERIMENTAL=y +# CONFIG_LOCALVERSION_AUTO is not set @@ -2133,9 +2134,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/configs/bcmrpi_emergency_defconfig linux-3. +# CONFIG_CRYPTO_HW is not set +CONFIG_CRC_ITU_T=y +CONFIG_LIBCRC32C=y -diff -Nur linux-3.13.6.orig/arch/arm/configs/bcmrpi_quick_defconfig linux-3.13.6/arch/arm/configs/bcmrpi_quick_defconfig ---- linux-3.13.6.orig/arch/arm/configs/bcmrpi_quick_defconfig 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/configs/bcmrpi_quick_defconfig 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/configs/bcmrpi_quick_defconfig linux-raspberry-pi/arch/arm/configs/bcmrpi_quick_defconfig +--- linux-3.13.6/arch/arm/configs/bcmrpi_quick_defconfig 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/configs/bcmrpi_quick_defconfig 2014-03-11 16:51:54.000000000 +0100 @@ -0,0 +1,197 @@ +# CONFIG_ARM_PATCH_PHYS_VIRT is not set +CONFIG_LOCALVERSION="-quick" @@ -2334,9 +2335,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/configs/bcmrpi_quick_defconfig linux-3.13.6 +# CONFIG_CRYPTO_HW is not set +CONFIG_CRC_ITU_T=y +CONFIG_LIBCRC32C=y -diff -Nur linux-3.13.6.orig/arch/arm/include/asm/fiq.h linux-3.13.6/arch/arm/include/asm/fiq.h ---- linux-3.13.6.orig/arch/arm/include/asm/fiq.h 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/arch/arm/include/asm/fiq.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/include/asm/fiq.h linux-raspberry-pi/arch/arm/include/asm/fiq.h +--- linux-3.13.6/arch/arm/include/asm/fiq.h 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/include/asm/fiq.h 2014-03-11 16:51:54.000000000 +0100 @@ -42,6 +42,7 @@ /* helpers defined in fiqasm.S: */ extern void __set_fiq_regs(unsigned long const *regs); @@ -2345,9 +2346,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/include/asm/fiq.h linux-3.13.6/arch/arm/inc static inline void set_fiq_regs(struct pt_regs const *regs) { -diff -Nur linux-3.13.6.orig/arch/arm/Kconfig linux-3.13.6/arch/arm/Kconfig ---- linux-3.13.6.orig/arch/arm/Kconfig 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/arch/arm/Kconfig 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/Kconfig linux-raspberry-pi/arch/arm/Kconfig +--- linux-3.13.6/arch/arm/Kconfig 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/Kconfig 2014-03-11 16:54:55.000000000 +0100 @@ -373,6 +373,24 @@ This enables support for systems based on Atmel AT91RM9200 and AT91SAM9* processors. @@ -2381,9 +2382,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/Kconfig linux-3.13.6/arch/arm/Kconfig source "arch/arm/mach-zynq/Kconfig" -diff -Nur linux-3.13.6.orig/arch/arm/Kconfig.debug linux-3.13.6/arch/arm/Kconfig.debug ---- linux-3.13.6.orig/arch/arm/Kconfig.debug 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/arch/arm/Kconfig.debug 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/Kconfig.debug linux-raspberry-pi/arch/arm/Kconfig.debug +--- linux-3.13.6/arch/arm/Kconfig.debug 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/Kconfig.debug 2014-03-11 16:54:55.000000000 +0100 @@ -882,6 +882,14 @@ options; the platform specific options are deprecated and will be soon removed. @@ -2399,9 +2400,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/Kconfig.debug linux-3.13.6/arch/arm/Kconfig endchoice config DEBUG_EXYNOS_UART -diff -Nur linux-3.13.6.orig/arch/arm/kernel/fiqasm.S linux-3.13.6/arch/arm/kernel/fiqasm.S ---- linux-3.13.6.orig/arch/arm/kernel/fiqasm.S 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/arch/arm/kernel/fiqasm.S 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/kernel/fiqasm.S linux-raspberry-pi/arch/arm/kernel/fiqasm.S +--- linux-3.13.6/arch/arm/kernel/fiqasm.S 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/kernel/fiqasm.S 2014-03-11 16:51:54.000000000 +0100 @@ -25,6 +25,9 @@ ENTRY(__set_fiq_regs) mov r2, #PSR_I_BIT | PSR_F_BIT | FIQ_MODE @@ -2420,9 +2421,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/kernel/fiqasm.S linux-3.13.6/arch/arm/kerne +ENTRY(__FIQ_Branch) + mov pc, r8 +ENDPROC(__FIQ_Branch) -diff -Nur linux-3.13.6.orig/arch/arm/kernel/fiq.c linux-3.13.6/arch/arm/kernel/fiq.c ---- linux-3.13.6.orig/arch/arm/kernel/fiq.c 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/arch/arm/kernel/fiq.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/kernel/fiq.c linux-raspberry-pi/arch/arm/kernel/fiq.c +--- linux-3.13.6/arch/arm/kernel/fiq.c 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/kernel/fiq.c 2014-03-11 16:51:54.000000000 +0100 @@ -142,6 +142,7 @@ EXPORT_SYMBOL(set_fiq_handler); EXPORT_SYMBOL(__set_fiq_regs); /* defined in fiqasm.S */ @@ -2431,9 +2432,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/kernel/fiq.c linux-3.13.6/arch/arm/kernel/f EXPORT_SYMBOL(claim_fiq); EXPORT_SYMBOL(release_fiq); EXPORT_SYMBOL(enable_fiq); -diff -Nur linux-3.13.6.orig/arch/arm/kernel/process.c linux-3.13.6/arch/arm/kernel/process.c ---- linux-3.13.6.orig/arch/arm/kernel/process.c 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/arch/arm/kernel/process.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/kernel/process.c linux-raspberry-pi/arch/arm/kernel/process.c +--- linux-3.13.6/arch/arm/kernel/process.c 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/kernel/process.c 2014-03-11 16:54:55.000000000 +0100 @@ -176,6 +176,16 @@ default_idle(); } @@ -2451,9 +2452,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/kernel/process.c linux-3.13.6/arch/arm/kern /* * Called by kexec, immediately prior to machine_kexec(). * -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/armctrl.c linux-3.13.6/arch/arm/mach-bcm2708/armctrl.c ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/armctrl.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/armctrl.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/armctrl.c linux-raspberry-pi/arch/arm/mach-bcm2708/armctrl.c +--- linux-3.13.6/arch/arm/mach-bcm2708/armctrl.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/armctrl.c 2014-03-11 16:51:54.000000000 +0100 @@ -0,0 +1,219 @@ +/* + * linux/arch/arm/mach-bcm2708/armctrl.c @@ -2674,9 +2675,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/armctrl.c linux-3.13.6/arch/ar + init_FIQ(FIQ_START); + return 0; +} -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/armctrl.h linux-3.13.6/arch/arm/mach-bcm2708/armctrl.h ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/armctrl.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/armctrl.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/armctrl.h linux-raspberry-pi/arch/arm/mach-bcm2708/armctrl.h +--- linux-3.13.6/arch/arm/mach-bcm2708/armctrl.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/armctrl.h 2014-03-11 16:51:54.000000000 +0100 @@ -0,0 +1,27 @@ +/* + * linux/arch/arm/mach-bcm2708/armctrl.h @@ -2705,9 +2706,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/armctrl.h linux-3.13.6/arch/ar + u32 armctrl_sources, u32 resume_sources); + +#endif -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/bcm2708.c linux-3.13.6/arch/arm/mach-bcm2708/bcm2708.c ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/bcm2708.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/bcm2708.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/bcm2708.c linux-raspberry-pi/arch/arm/mach-bcm2708/bcm2708.c +--- linux-3.13.6/arch/arm/mach-bcm2708/bcm2708.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/bcm2708.c 2014-03-11 16:54:55.000000000 +0100 @@ -0,0 +1,1129 @@ +/* + * linux/arch/arm/mach-bcm2708/bcm2708.c @@ -3838,9 +3839,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/bcm2708.c linux-3.13.6/arch/ar +module_param(disk_led_gpio, uint, 0644); +module_param(disk_led_active_low, uint, 0644); +module_param(reboot_part, uint, 0644); -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/bcm2708_gpio.c linux-3.13.6/arch/arm/mach-bcm2708/bcm2708_gpio.c ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/bcm2708_gpio.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/bcm2708_gpio.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/bcm2708_gpio.c linux-raspberry-pi/arch/arm/mach-bcm2708/bcm2708_gpio.c +--- linux-3.13.6/arch/arm/mach-bcm2708/bcm2708_gpio.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/bcm2708_gpio.c 2014-03-11 16:51:54.000000000 +0100 @@ -0,0 +1,361 @@ +/* + * linux/arch/arm/mach-bcm2708/bcm2708_gpio.c @@ -4203,9 +4204,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/bcm2708_gpio.c linux-3.13.6/ar + +MODULE_DESCRIPTION("Broadcom BCM2708 GPIO driver"); +MODULE_LICENSE("GPL"); -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/bcm2708.h linux-3.13.6/arch/arm/mach-bcm2708/bcm2708.h ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/bcm2708.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/bcm2708.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/bcm2708.h linux-raspberry-pi/arch/arm/mach-bcm2708/bcm2708.h +--- linux-3.13.6/arch/arm/mach-bcm2708/bcm2708.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/bcm2708.h 2014-03-11 16:54:55.000000000 +0100 @@ -0,0 +1,49 @@ +/* + * linux/arch/arm/mach-bcm2708/bcm2708.h @@ -4256,9 +4257,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/bcm2708.h linux-3.13.6/arch/ar +} + +#endif -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/clock.c linux-3.13.6/arch/arm/mach-bcm2708/clock.c ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/clock.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/clock.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/clock.c linux-raspberry-pi/arch/arm/mach-bcm2708/clock.c +--- linux-3.13.6/arch/arm/mach-bcm2708/clock.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/clock.c 2014-03-11 16:51:54.000000000 +0100 @@ -0,0 +1,61 @@ +/* + * linux/arch/arm/mach-bcm2708/clock.c @@ -4321,9 +4322,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/clock.c linux-3.13.6/arch/arm/ + return -EIO; +} +EXPORT_SYMBOL(clk_set_rate); -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/clock.h linux-3.13.6/arch/arm/mach-bcm2708/clock.h ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/clock.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/clock.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/clock.h linux-raspberry-pi/arch/arm/mach-bcm2708/clock.h +--- linux-3.13.6/arch/arm/mach-bcm2708/clock.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/clock.h 2014-03-11 16:51:54.000000000 +0100 @@ -0,0 +1,24 @@ +/* + * linux/arch/arm/mach-bcm2708/clock.h @@ -4349,9 +4350,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/clock.h linux-3.13.6/arch/arm/ +struct clk { + unsigned long rate; +}; -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/dma.c linux-3.13.6/arch/arm/mach-bcm2708/dma.c ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/dma.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/dma.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/dma.c linux-raspberry-pi/arch/arm/mach-bcm2708/dma.c +--- linux-3.13.6/arch/arm/mach-bcm2708/dma.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/dma.c 2014-03-11 16:51:54.000000000 +0100 @@ -0,0 +1,407 @@ +/* + * linux/arch/arm/mach-bcm2708/dma.c @@ -4760,9 +4761,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/dma.c linux-3.13.6/arch/arm/ma +MODULE_LICENSE("GPL"); + +MODULE_PARM_DESC(dmachans, "Bitmap of DMA channels available to the ARM"); -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/arm_control.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/arm_control.h ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/arm_control.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/arm_control.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/arm_control.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/arm_control.h +--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/arm_control.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/arm_control.h 2014-03-11 16:51:54.000000000 +0100 @@ -0,0 +1,419 @@ +/* + * linux/arch/arm/mach-bcm2708/arm_control.h @@ -5183,9 +5184,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/arm_control.h lin +#define AJBTDO HW_REGISTER_RW(AJB_BASE+0x0c) + +#endif -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/arm_power.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/arm_power.h ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/arm_power.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/arm_power.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/arm_power.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/arm_power.h +--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/arm_power.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/arm_power.h 2014-03-11 16:51:54.000000000 +0100 @@ -0,0 +1,60 @@ +/* + * linux/arch/arm/mach-bcm2708/include/mach/arm_power.h @@ -5247,9 +5248,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/arm_power.h linux +}; + +#endif -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/clkdev.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/clkdev.h ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/clkdev.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/clkdev.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/clkdev.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/clkdev.h +--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/clkdev.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/clkdev.h 2014-03-11 16:51:54.000000000 +0100 @@ -0,0 +1,7 @@ +#ifndef __ASM_MACH_CLKDEV_H +#define __ASM_MACH_CLKDEV_H @@ -5258,9 +5259,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/clkdev.h linux-3. +#define __clk_put(clk) do { } while (0) + +#endif -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/debug-macro.S linux-3.13.6/arch/arm/mach-bcm2708/include/mach/debug-macro.S ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/debug-macro.S 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/debug-macro.S 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/debug-macro.S linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/debug-macro.S +--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/debug-macro.S 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/debug-macro.S 2014-03-11 16:54:55.000000000 +0100 @@ -0,0 +1,22 @@ +/* arch/arm/mach-bcm2708/include/mach/debug-macro.S + * @@ -5284,9 +5285,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/debug-macro.S lin + .endm + +#include <debug/pl01x.S> -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/dma.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/dma.h ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/dma.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/dma.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/dma.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/dma.h +--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/dma.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/dma.h 2014-03-11 16:51:54.000000000 +0100 @@ -0,0 +1,90 @@ +/* + * linux/arch/arm/mach-bcm2708/include/mach/dma.h @@ -5378,9 +5379,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/dma.h linux-3.13. + + +#endif /* _MACH_BCM2708_DMA_H */ -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/entry-macro.S linux-3.13.6/arch/arm/mach-bcm2708/include/mach/entry-macro.S ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/entry-macro.S 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/entry-macro.S 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/entry-macro.S linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/entry-macro.S +--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/entry-macro.S 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/entry-macro.S 2014-03-11 16:51:54.000000000 +0100 @@ -0,0 +1,69 @@ +/* + * arch/arm/mach-bcm2708/include/mach/entry-macro.S @@ -5451,9 +5452,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/entry-macro.S lin +1020: @ EQ will be set if no irqs pending + + .endm -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/frc.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/frc.h ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/frc.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/frc.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/frc.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/frc.h +--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/frc.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/frc.h 2014-03-11 16:51:54.000000000 +0100 @@ -0,0 +1,38 @@ +/* + * arch/arm/mach-bcm2708/include/mach/timex.h @@ -5493,9 +5494,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/frc.h linux-3.13. +extern unsigned long long frc_clock_ticks63(void); + +#endif -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/gpio.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/gpio.h ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/gpio.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/gpio.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/gpio.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/gpio.h +--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/gpio.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/gpio.h 2014-03-11 16:54:55.000000000 +0100 @@ -0,0 +1,17 @@ +/* + * arch/arm/mach-bcm2708/include/mach/gpio.h @@ -5514,9 +5515,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/gpio.h linux-3.13 +#define irq_to_gpio(x) ((x) - GPIO_IRQ_START) + +#endif -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/hardware.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/hardware.h ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/hardware.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/hardware.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/hardware.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/hardware.h +--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/hardware.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/hardware.h 2014-03-11 16:51:54.000000000 +0100 @@ -0,0 +1,28 @@ +/* + * arch/arm/mach-bcm2708/include/mach/hardware.h @@ -5546,9 +5547,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/hardware.h linux- +#include <mach/platform.h> + +#endif -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/io.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/io.h ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/io.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/io.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/io.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/io.h +--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/io.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/io.h 2014-03-11 16:51:54.000000000 +0100 @@ -0,0 +1,27 @@ +/* + * arch/arm/mach-bcm2708/include/mach/io.h @@ -5577,9 +5578,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/io.h linux-3.13.6 +#define __io(a) __typesafe_io(a) + +#endif -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/irqs.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/irqs.h ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/irqs.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/irqs.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/irqs.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/irqs.h +--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/irqs.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/irqs.h 2014-03-11 16:51:54.000000000 +0100 @@ -0,0 +1,199 @@ +/* + * arch/arm/mach-bcm2708/include/mach/irqs.h @@ -5780,9 +5781,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/irqs.h linux-3.13 + + +#endif /* _BCM2708_IRQS_H_ */ -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/memory.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/memory.h ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/memory.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/memory.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/memory.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/memory.h +--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/memory.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/memory.h 2014-03-11 16:51:54.000000000 +0100 @@ -0,0 +1,57 @@ +/* + * arch/arm/mach-bcm2708/include/mach/memory.h @@ -5841,9 +5842,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/memory.h linux-3. +#define __bus_to_pfn(x) __phys_to_pfn((x) - (BUS_OFFSET - PLAT_PHYS_OFFSET)) + +#endif -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/platform.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/platform.h ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/platform.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/platform.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/platform.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/platform.h +--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/platform.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/platform.h 2014-03-11 16:51:54.000000000 +0100 @@ -0,0 +1,228 @@ +/* + * arch/arm/mach-bcm2708/include/mach/platform.h @@ -6073,9 +6074,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/platform.h linux- +#endif + +/* END */ -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/power.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/power.h ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/power.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/power.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/power.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/power.h +--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/power.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/power.h 2014-03-11 16:51:54.000000000 +0100 @@ -0,0 +1,26 @@ +/* + * linux/arch/arm/mach-bcm2708/power.h @@ -6103,9 +6104,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/power.h linux-3.1 +extern int bcm_power_close(BCM_POWER_HANDLE_T handle); + +#endif -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/system.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/system.h ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/system.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/system.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/system.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/system.h +--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/system.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/system.h 2014-03-11 16:51:54.000000000 +0100 @@ -0,0 +1,38 @@ +/* + * arch/arm/mach-bcm2708/include/mach/system.h @@ -6145,9 +6146,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/system.h linux-3. +} + +#endif -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/timex.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/timex.h ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/timex.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/timex.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/timex.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/timex.h +--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/timex.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/timex.h 2014-03-11 16:51:54.000000000 +0100 @@ -0,0 +1,23 @@ +/* + * arch/arm/mach-bcm2708/include/mach/timex.h @@ -6172,9 +6173,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/timex.h linux-3.1 + */ + +#define CLOCK_TICK_RATE (1000000) -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/uncompress.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/uncompress.h ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/uncompress.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/uncompress.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/uncompress.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/uncompress.h +--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/uncompress.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/uncompress.h 2014-03-11 16:54:55.000000000 +0100 @@ -0,0 +1,84 @@ +/* + * arch/arm/mach-bcn2708/include/mach/uncompress.h @@ -6260,9 +6261,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/uncompress.h linu + * nothing to do + */ +#define arch_decomp_wdog() -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/vcio.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/vcio.h ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/vcio.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/vcio.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/vcio.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/vcio.h +--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/vcio.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/vcio.h 2014-03-11 16:54:55.000000000 +0100 @@ -0,0 +1,141 @@ +/* + * arch/arm/mach-bcm2708/include/mach/vcio.h @@ -6405,9 +6406,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/vcio.h linux-3.13 +#define DEVICE_FILE_NAME "char_dev" + +#endif -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/vc_mem.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/vc_mem.h ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/vc_mem.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/vc_mem.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/vc_mem.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/vc_mem.h +--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/vc_mem.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/vc_mem.h 2014-03-11 16:54:55.000000000 +0100 @@ -0,0 +1,35 @@ +/***************************************************************************** +* Copyright 2010 - 2011 Broadcom Corporation. All rights reserved. @@ -6444,9 +6445,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/vc_mem.h linux-3. +#endif + +#endif /* VC_MEM_H */ -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/vmalloc.h linux-3.13.6/arch/arm/mach-bcm2708/include/mach/vmalloc.h ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/vmalloc.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/include/mach/vmalloc.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/include/mach/vmalloc.h linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/vmalloc.h +--- linux-3.13.6/arch/arm/mach-bcm2708/include/mach/vmalloc.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/include/mach/vmalloc.h 2014-03-11 16:51:54.000000000 +0100 @@ -0,0 +1,20 @@ +/* + * arch/arm/mach-bcm2708/include/mach/vmalloc.h @@ -6468,9 +6469,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/include/mach/vmalloc.h linux-3 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#define VMALLOC_END (0xe8000000) -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/Kconfig linux-3.13.6/arch/arm/mach-bcm2708/Kconfig ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/Kconfig 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/Kconfig 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/Kconfig linux-raspberry-pi/arch/arm/mach-bcm2708/Kconfig +--- linux-3.13.6/arch/arm/mach-bcm2708/Kconfig 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/Kconfig 2014-03-11 16:54:55.000000000 +0100 @@ -0,0 +1,41 @@ +menu "Broadcom BCM2708 Implementations" + depends on ARCH_BCM2708 @@ -6513,9 +6514,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/Kconfig linux-3.13.6/arch/arm/ + help + Binds spidev driver to the SPI0 master +endmenu -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/Makefile linux-3.13.6/arch/arm/mach-bcm2708/Makefile ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/Makefile 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/Makefile linux-raspberry-pi/arch/arm/mach-bcm2708/Makefile +--- linux-3.13.6/arch/arm/mach-bcm2708/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/Makefile 2014-03-11 16:54:55.000000000 +0100 @@ -0,0 +1,7 @@ +# +# Makefile for the linux kernel. @@ -6524,16 +6525,16 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/Makefile linux-3.13.6/arch/arm +obj-$(CONFIG_MACH_BCM2708) += clock.o bcm2708.o armctrl.o vcio.o power.o dma.o +obj-$(CONFIG_BCM2708_GPIO) += bcm2708_gpio.o +obj-$(CONFIG_BCM2708_VCMEM) += vc_mem.o -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/Makefile.boot linux-3.13.6/arch/arm/mach-bcm2708/Makefile.boot ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/Makefile.boot 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/Makefile.boot 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/Makefile.boot linux-raspberry-pi/arch/arm/mach-bcm2708/Makefile.boot +--- linux-3.13.6/arch/arm/mach-bcm2708/Makefile.boot 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/Makefile.boot 2014-03-11 16:51:54.000000000 +0100 @@ -0,0 +1,3 @@ + zreladdr-y := 0x00008000 +params_phys-y := 0x00000100 +initrd_phys-y := 0x00800000 -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/power.c linux-3.13.6/arch/arm/mach-bcm2708/power.c ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/power.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/power.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/power.c linux-raspberry-pi/arch/arm/mach-bcm2708/power.c +--- linux-3.13.6/arch/arm/mach-bcm2708/power.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/power.c 2014-03-11 16:51:54.000000000 +0100 @@ -0,0 +1,194 @@ +/* + * linux/arch/arm/mach-bcm2708/power.c @@ -6729,9 +6730,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/power.c linux-3.13.6/arch/arm/ +MODULE_AUTHOR("Phil Elwell"); +MODULE_DESCRIPTION("Interface to BCM2708 power management"); +MODULE_LICENSE("GPL"); -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/vcio.c linux-3.13.6/arch/arm/mach-bcm2708/vcio.c ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/vcio.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/vcio.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/vcio.c linux-raspberry-pi/arch/arm/mach-bcm2708/vcio.c +--- linux-3.13.6/arch/arm/mach-bcm2708/vcio.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/vcio.c 2014-03-11 16:54:55.000000000 +0100 @@ -0,0 +1,474 @@ +/* + * linux/arch/arm/mach-bcm2708/vcio.c @@ -7207,9 +7208,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/vcio.c linux-3.13.6/arch/arm/m +MODULE_DESCRIPTION("ARM I/O to VideoCore processor"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:bcm-mbox"); -diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/vc_mem.c linux-3.13.6/arch/arm/mach-bcm2708/vc_mem.c ---- linux-3.13.6.orig/arch/arm/mach-bcm2708/vc_mem.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/arch/arm/mach-bcm2708/vc_mem.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mach-bcm2708/vc_mem.c linux-raspberry-pi/arch/arm/mach-bcm2708/vc_mem.c +--- linux-3.13.6/arch/arm/mach-bcm2708/vc_mem.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mach-bcm2708/vc_mem.c 2014-03-11 16:51:54.000000000 +0100 @@ -0,0 +1,432 @@ +/***************************************************************************** +* Copyright 2010 - 2011 Broadcom Corporation. All rights reserved. @@ -7643,9 +7644,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mach-bcm2708/vc_mem.c linux-3.13.6/arch/arm +module_param(mem_size, uint, 0644); +module_param(mem_base, uint, 0644); + -diff -Nur linux-3.13.6.orig/arch/arm/Makefile linux-3.13.6/arch/arm/Makefile ---- linux-3.13.6.orig/arch/arm/Makefile 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/arch/arm/Makefile 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/Makefile linux-raspberry-pi/arch/arm/Makefile +--- linux-3.13.6/arch/arm/Makefile 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/Makefile 2014-03-11 16:54:55.000000000 +0100 @@ -147,6 +147,7 @@ # by CONFIG_* macro name. machine-$(CONFIG_ARCH_AT91) += at91 @@ -7654,9 +7655,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/Makefile linux-3.13.6/arch/arm/Makefile machine-$(CONFIG_ARCH_BCM2835) += bcm2835 machine-$(CONFIG_ARCH_CLPS711X) += clps711x machine-$(CONFIG_ARCH_CNS3XXX) += cns3xxx -diff -Nur linux-3.13.6.orig/arch/arm/mm/Kconfig linux-3.13.6/arch/arm/mm/Kconfig ---- linux-3.13.6.orig/arch/arm/mm/Kconfig 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/arch/arm/mm/Kconfig 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mm/Kconfig linux-raspberry-pi/arch/arm/mm/Kconfig +--- linux-3.13.6/arch/arm/mm/Kconfig 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mm/Kconfig 2014-03-11 16:54:55.000000000 +0100 @@ -358,7 +358,7 @@ # ARMv6 @@ -7666,9 +7667,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mm/Kconfig linux-3.13.6/arch/arm/mm/Kconfig select CPU_32v6 select CPU_ABRT_EV6 select CPU_CACHE_V6 -diff -Nur linux-3.13.6.orig/arch/arm/mm/proc-v6.S linux-3.13.6/arch/arm/mm/proc-v6.S ---- linux-3.13.6.orig/arch/arm/mm/proc-v6.S 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/arch/arm/mm/proc-v6.S 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/mm/proc-v6.S linux-raspberry-pi/arch/arm/mm/proc-v6.S +--- linux-3.13.6/arch/arm/mm/proc-v6.S 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/mm/proc-v6.S 2014-03-11 16:54:55.000000000 +0100 @@ -73,10 +73,19 @@ * * IRQs are already disabled. @@ -7692,9 +7693,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/mm/proc-v6.S linux-3.13.6/arch/arm/mm/proc- mov pc, lr ENTRY(cpu_v6_dcache_clean_area) -diff -Nur linux-3.13.6.orig/arch/arm/tools/mach-types linux-3.13.6/arch/arm/tools/mach-types ---- linux-3.13.6.orig/arch/arm/tools/mach-types 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/arch/arm/tools/mach-types 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/arch/arm/tools/mach-types linux-raspberry-pi/arch/arm/tools/mach-types +--- linux-3.13.6/arch/arm/tools/mach-types 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/arch/arm/tools/mach-types 2014-03-11 16:51:56.000000000 +0100 @@ -522,6 +522,7 @@ prima2_evb MACH_PRIMA2_EVB PRIMA2_EVB 3103 paz00 MACH_PAZ00 PAZ00 3128 @@ -7703,9 +7704,9 @@ diff -Nur linux-3.13.6.orig/arch/arm/tools/mach-types linux-3.13.6/arch/arm/tool ag5evm MACH_AG5EVM AG5EVM 3189 ics_if_voip MACH_ICS_IF_VOIP ICS_IF_VOIP 3206 wlf_cragg_6410 MACH_WLF_CRAGG_6410 WLF_CRAGG_6410 3207 -diff -Nur linux-3.13.6.orig/Documentation/video4linux/bcm2835-v4l2.txt linux-3.13.6/Documentation/video4linux/bcm2835-v4l2.txt ---- linux-3.13.6.orig/Documentation/video4linux/bcm2835-v4l2.txt 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/Documentation/video4linux/bcm2835-v4l2.txt 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/Documentation/video4linux/bcm2835-v4l2.txt linux-raspberry-pi/Documentation/video4linux/bcm2835-v4l2.txt +--- linux-3.13.6/Documentation/video4linux/bcm2835-v4l2.txt 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/Documentation/video4linux/bcm2835-v4l2.txt 2014-03-11 16:51:47.000000000 +0100 @@ -0,0 +1,60 @@ + +BCM2835 (aka Raspberry Pi) V4L2 driver @@ -7767,9 +7768,9 @@ diff -Nur linux-3.13.6.orig/Documentation/video4linux/bcm2835-v4l2.txt linux-3.1 +List of available formats: + +$ v4l2-ctl --list-formats -diff -Nur linux-3.13.6.orig/drivers/char/broadcom/Kconfig linux-3.13.6/drivers/char/broadcom/Kconfig ---- linux-3.13.6.orig/drivers/char/broadcom/Kconfig 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/char/broadcom/Kconfig 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/char/broadcom/Kconfig linux-raspberry-pi/drivers/char/broadcom/Kconfig +--- linux-3.13.6/drivers/char/broadcom/Kconfig 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/char/broadcom/Kconfig 2014-03-11 16:54:56.000000000 +0100 @@ -0,0 +1,16 @@ +# +# Broadcom char driver config @@ -7787,14 +7788,14 @@ diff -Nur linux-3.13.6.orig/drivers/char/broadcom/Kconfig linux-3.13.6/drivers/c + help + Helper for videocore CMA access. + -diff -Nur linux-3.13.6.orig/drivers/char/broadcom/Makefile linux-3.13.6/drivers/char/broadcom/Makefile ---- linux-3.13.6.orig/drivers/char/broadcom/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/char/broadcom/Makefile 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/char/broadcom/Makefile linux-raspberry-pi/drivers/char/broadcom/Makefile +--- linux-3.13.6/drivers/char/broadcom/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/char/broadcom/Makefile 2014-03-11 16:54:56.000000000 +0100 @@ -0,0 +1 @@ +obj-$(CONFIG_BCM_VC_CMA) += vc_cma/ -diff -Nur linux-3.13.6.orig/drivers/char/broadcom/vc_cma/Makefile linux-3.13.6/drivers/char/broadcom/vc_cma/Makefile ---- linux-3.13.6.orig/drivers/char/broadcom/vc_cma/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/char/broadcom/vc_cma/Makefile 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/char/broadcom/vc_cma/Makefile linux-raspberry-pi/drivers/char/broadcom/vc_cma/Makefile +--- linux-3.13.6/drivers/char/broadcom/vc_cma/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/char/broadcom/vc_cma/Makefile 2014-03-11 16:54:56.000000000 +0100 @@ -0,0 +1,14 @@ +EXTRA_CFLAGS += -Wall -Wstrict-prototypes -Wno-trigraphs +EXTRA_CFLAGS += -Werror @@ -7810,9 +7811,9 @@ diff -Nur linux-3.13.6.orig/drivers/char/broadcom/vc_cma/Makefile linux-3.13.6/d +obj-$(CONFIG_BCM_VC_CMA) += vc-cma.o + +vc-cma-objs := vc_cma.o -diff -Nur linux-3.13.6.orig/drivers/char/broadcom/vc_cma/vc_cma.c linux-3.13.6/drivers/char/broadcom/vc_cma/vc_cma.c ---- linux-3.13.6.orig/drivers/char/broadcom/vc_cma/vc_cma.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/char/broadcom/vc_cma/vc_cma.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/char/broadcom/vc_cma/vc_cma.c linux-raspberry-pi/drivers/char/broadcom/vc_cma/vc_cma.c +--- linux-3.13.6/drivers/char/broadcom/vc_cma/vc_cma.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/char/broadcom/vc_cma/vc_cma.c 2014-03-11 16:54:56.000000000 +0100 @@ -0,0 +1,1143 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -8957,9 +8958,9 @@ diff -Nur linux-3.13.6.orig/drivers/char/broadcom/vc_cma/vc_cma.c linux-3.13.6/d +module_exit(vc_cma_exit); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Broadcom Corporation"); -diff -Nur linux-3.13.6.orig/drivers/char/hw_random/bcm2708-rng.c linux-3.13.6/drivers/char/hw_random/bcm2708-rng.c ---- linux-3.13.6.orig/drivers/char/hw_random/bcm2708-rng.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/char/hw_random/bcm2708-rng.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/char/hw_random/bcm2708-rng.c linux-raspberry-pi/drivers/char/hw_random/bcm2708-rng.c +--- linux-3.13.6/drivers/char/hw_random/bcm2708-rng.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/char/hw_random/bcm2708-rng.c 2014-03-11 16:52:29.000000000 +0100 @@ -0,0 +1,117 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -9078,9 +9079,9 @@ diff -Nur linux-3.13.6.orig/drivers/char/hw_random/bcm2708-rng.c linux-3.13.6/dr + +MODULE_DESCRIPTION("BCM2708 H/W Random Number Generator (RNG) driver"); +MODULE_LICENSE("GPL and additional rights"); -diff -Nur linux-3.13.6.orig/drivers/char/hw_random/Kconfig linux-3.13.6/drivers/char/hw_random/Kconfig ---- linux-3.13.6.orig/drivers/char/hw_random/Kconfig 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/char/hw_random/Kconfig 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/char/hw_random/Kconfig linux-raspberry-pi/drivers/char/hw_random/Kconfig +--- linux-3.13.6/drivers/char/hw_random/Kconfig 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/char/hw_random/Kconfig 2014-03-11 16:54:56.000000000 +0100 @@ -341,6 +341,17 @@ If unsure, say Y. @@ -9099,18 +9100,18 @@ diff -Nur linux-3.13.6.orig/drivers/char/hw_random/Kconfig linux-3.13.6/drivers/ config HW_RANDOM_MSM tristate "Qualcomm MSM Random Number Generator support" depends on HW_RANDOM && ARCH_MSM -diff -Nur linux-3.13.6.orig/drivers/char/hw_random/Makefile linux-3.13.6/drivers/char/hw_random/Makefile ---- linux-3.13.6.orig/drivers/char/hw_random/Makefile 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/char/hw_random/Makefile 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/char/hw_random/Makefile linux-raspberry-pi/drivers/char/hw_random/Makefile +--- linux-3.13.6/drivers/char/hw_random/Makefile 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/char/hw_random/Makefile 2014-03-11 16:54:56.000000000 +0100 @@ -29,4 +29,5 @@ obj-$(CONFIG_HW_RANDOM_EXYNOS) += exynos-rng.o obj-$(CONFIG_HW_RANDOM_TPM) += tpm-rng.o obj-$(CONFIG_HW_RANDOM_BCM2835) += bcm2835-rng.o +obj-$(CONFIG_HW_RANDOM_BCM2708) += bcm2708-rng.o obj-$(CONFIG_HW_RANDOM_MSM) += msm-rng.o -diff -Nur linux-3.13.6.orig/drivers/char/Kconfig linux-3.13.6/drivers/char/Kconfig ---- linux-3.13.6.orig/drivers/char/Kconfig 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/char/Kconfig 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/char/Kconfig linux-raspberry-pi/drivers/char/Kconfig +--- linux-3.13.6/drivers/char/Kconfig 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/char/Kconfig 2014-03-11 16:54:56.000000000 +0100 @@ -580,6 +580,8 @@ source "drivers/s390/char/Kconfig" @@ -9120,18 +9121,18 @@ diff -Nur linux-3.13.6.orig/drivers/char/Kconfig linux-3.13.6/drivers/char/Kconf config MSM_SMD_PKT bool "Enable device interface for some SMD packet ports" default n -diff -Nur linux-3.13.6.orig/drivers/char/Makefile linux-3.13.6/drivers/char/Makefile ---- linux-3.13.6.orig/drivers/char/Makefile 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/char/Makefile 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/char/Makefile linux-raspberry-pi/drivers/char/Makefile +--- linux-3.13.6/drivers/char/Makefile 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/char/Makefile 2014-03-11 16:54:56.000000000 +0100 @@ -62,3 +62,5 @@ js-rtc-y = rtc.o obj-$(CONFIG_TILE_SROM) += tile-srom.o + +obj-$(CONFIG_BRCM_CHAR_DRIVERS) += broadcom/ -diff -Nur linux-3.13.6.orig/drivers/cpufreq/bcm2835-cpufreq.c linux-3.13.6/drivers/cpufreq/bcm2835-cpufreq.c ---- linux-3.13.6.orig/drivers/cpufreq/bcm2835-cpufreq.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/cpufreq/bcm2835-cpufreq.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/cpufreq/bcm2835-cpufreq.c linux-raspberry-pi/drivers/cpufreq/bcm2835-cpufreq.c +--- linux-3.13.6/drivers/cpufreq/bcm2835-cpufreq.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/cpufreq/bcm2835-cpufreq.c 2014-03-11 16:54:56.000000000 +0100 @@ -0,0 +1,239 @@ +/***************************************************************************** +* Copyright 2011 Broadcom Corporation. All rights reserved. @@ -9372,9 +9373,9 @@ diff -Nur linux-3.13.6.orig/drivers/cpufreq/bcm2835-cpufreq.c linux-3.13.6/drive + +module_init(bcm2835_cpufreq_module_init); +module_exit(bcm2835_cpufreq_module_exit); -diff -Nur linux-3.13.6.orig/drivers/cpufreq/Kconfig.arm linux-3.13.6/drivers/cpufreq/Kconfig.arm ---- linux-3.13.6.orig/drivers/cpufreq/Kconfig.arm 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/cpufreq/Kconfig.arm 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/cpufreq/Kconfig.arm linux-raspberry-pi/drivers/cpufreq/Kconfig.arm +--- linux-3.13.6/drivers/cpufreq/Kconfig.arm 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/cpufreq/Kconfig.arm 2014-03-11 16:54:56.000000000 +0100 @@ -218,6 +218,14 @@ help This adds the CPUFreq driver support for SPEAr SOCs. @@ -9390,9 +9391,9 @@ diff -Nur linux-3.13.6.orig/drivers/cpufreq/Kconfig.arm linux-3.13.6/drivers/cpu config ARM_TEGRA_CPUFREQ bool "TEGRA CPUFreq support" depends on ARCH_TEGRA -diff -Nur linux-3.13.6.orig/drivers/cpufreq/Makefile linux-3.13.6/drivers/cpufreq/Makefile ---- linux-3.13.6.orig/drivers/cpufreq/Makefile 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/cpufreq/Makefile 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/cpufreq/Makefile linux-raspberry-pi/drivers/cpufreq/Makefile +--- linux-3.13.6/drivers/cpufreq/Makefile 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/cpufreq/Makefile 2014-03-11 16:54:56.000000000 +0100 @@ -73,6 +73,7 @@ obj-$(CONFIG_ARM_SA1100_CPUFREQ) += sa1100-cpufreq.o obj-$(CONFIG_ARM_SA1110_CPUFREQ) += sa1110-cpufreq.o @@ -9401,9 +9402,9 @@ diff -Nur linux-3.13.6.orig/drivers/cpufreq/Makefile linux-3.13.6/drivers/cpufre obj-$(CONFIG_ARM_TEGRA_CPUFREQ) += tegra-cpufreq.o obj-$(CONFIG_ARM_VEXPRESS_SPC_CPUFREQ) += vexpress-spc-cpufreq.o -diff -Nur linux-3.13.6.orig/drivers/dma/bcm2708-dmaengine.c linux-3.13.6/drivers/dma/bcm2708-dmaengine.c ---- linux-3.13.6.orig/drivers/dma/bcm2708-dmaengine.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/dma/bcm2708-dmaengine.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/dma/bcm2708-dmaengine.c linux-raspberry-pi/drivers/dma/bcm2708-dmaengine.c +--- linux-3.13.6/drivers/dma/bcm2708-dmaengine.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/dma/bcm2708-dmaengine.c 2014-03-11 16:54:56.000000000 +0100 @@ -0,0 +1,588 @@ +/* + * BCM2708 DMA engine support @@ -9993,9 +9994,9 @@ diff -Nur linux-3.13.6.orig/drivers/dma/bcm2708-dmaengine.c linux-3.13.6/drivers +MODULE_DESCRIPTION("BCM2708 DMA engine driver"); +MODULE_AUTHOR("Florian Meier <florian.meier@koalo.de>"); +MODULE_LICENSE("GPL v2"); -diff -Nur linux-3.13.6.orig/drivers/dma/Kconfig linux-3.13.6/drivers/dma/Kconfig ---- linux-3.13.6.orig/drivers/dma/Kconfig 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/dma/Kconfig 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/dma/Kconfig linux-raspberry-pi/drivers/dma/Kconfig +--- linux-3.13.6/drivers/dma/Kconfig 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/dma/Kconfig 2014-03-11 16:54:56.000000000 +0100 @@ -312,6 +312,12 @@ The Communications Port Programming Interface (CPPI) 4.1 DMA engine is currently used by the USB driver on AM335x platforms. @@ -10009,9 +10010,9 @@ diff -Nur linux-3.13.6.orig/drivers/dma/Kconfig linux-3.13.6/drivers/dma/Kconfig config MMP_PDMA bool "MMP PDMA support" depends on (ARCH_MMP || ARCH_PXA) -diff -Nur linux-3.13.6.orig/drivers/dma/Makefile linux-3.13.6/drivers/dma/Makefile ---- linux-3.13.6.orig/drivers/dma/Makefile 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/dma/Makefile 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/dma/Makefile linux-raspberry-pi/drivers/dma/Makefile +--- linux-3.13.6/drivers/dma/Makefile 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/dma/Makefile 2014-03-11 16:54:56.000000000 +0100 @@ -38,6 +38,7 @@ obj-$(CONFIG_DMA_SA11X0) += sa11x0-dma.o obj-$(CONFIG_MMP_TDMA) += mmp_tdma.o @@ -10020,9 +10021,9 @@ diff -Nur linux-3.13.6.orig/drivers/dma/Makefile linux-3.13.6/drivers/dma/Makefi obj-$(CONFIG_MMP_PDMA) += mmp_pdma.o obj-$(CONFIG_DMA_JZ4740) += dma-jz4740.o obj-$(CONFIG_TI_CPPI41) += cppi41.o -diff -Nur linux-3.13.6.orig/drivers/hwmon/bcm2835-hwmon.c linux-3.13.6/drivers/hwmon/bcm2835-hwmon.c ---- linux-3.13.6.orig/drivers/hwmon/bcm2835-hwmon.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/hwmon/bcm2835-hwmon.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/hwmon/bcm2835-hwmon.c linux-raspberry-pi/drivers/hwmon/bcm2835-hwmon.c +--- linux-3.13.6/drivers/hwmon/bcm2835-hwmon.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/hwmon/bcm2835-hwmon.c 2014-03-11 16:52:40.000000000 +0100 @@ -0,0 +1,219 @@ +/***************************************************************************** +* Copyright 2011 Broadcom Corporation. All rights reserved. @@ -10243,9 +10244,9 @@ diff -Nur linux-3.13.6.orig/drivers/hwmon/bcm2835-hwmon.c linux-3.13.6/drivers/h +MODULE_DESCRIPTION("HW Monitor driver for bcm2835 chip"); + +module_platform_driver(bcm2835_hwmon_driver); -diff -Nur linux-3.13.6.orig/drivers/hwmon/Kconfig linux-3.13.6/drivers/hwmon/Kconfig ---- linux-3.13.6.orig/drivers/hwmon/Kconfig 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/hwmon/Kconfig 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/hwmon/Kconfig linux-raspberry-pi/drivers/hwmon/Kconfig +--- linux-3.13.6/drivers/hwmon/Kconfig 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/hwmon/Kconfig 2014-03-11 16:54:57.000000000 +0100 @@ -1554,6 +1554,16 @@ help Support for the A/D converter on MC13783 and MC13892 PMIC. @@ -10263,9 +10264,9 @@ diff -Nur linux-3.13.6.orig/drivers/hwmon/Kconfig linux-3.13.6/drivers/hwmon/Kco if ACPI comment "ACPI drivers" -diff -Nur linux-3.13.6.orig/drivers/hwmon/Makefile linux-3.13.6/drivers/hwmon/Makefile ---- linux-3.13.6.orig/drivers/hwmon/Makefile 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/hwmon/Makefile 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/hwmon/Makefile linux-raspberry-pi/drivers/hwmon/Makefile +--- linux-3.13.6/drivers/hwmon/Makefile 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/hwmon/Makefile 2014-03-11 16:54:57.000000000 +0100 @@ -142,6 +142,7 @@ obj-$(CONFIG_SENSORS_W83L786NG) += w83l786ng.o obj-$(CONFIG_SENSORS_WM831X) += wm831x-hwmon.o @@ -10274,9 +10275,9 @@ diff -Nur linux-3.13.6.orig/drivers/hwmon/Makefile linux-3.13.6/drivers/hwmon/Ma obj-$(CONFIG_PMBUS) += pmbus/ -diff -Nur linux-3.13.6.orig/drivers/i2c/busses/i2c-bcm2708.c linux-3.13.6/drivers/i2c/busses/i2c-bcm2708.c ---- linux-3.13.6.orig/drivers/i2c/busses/i2c-bcm2708.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/i2c/busses/i2c-bcm2708.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/i2c/busses/i2c-bcm2708.c linux-raspberry-pi/drivers/i2c/busses/i2c-bcm2708.c +--- linux-3.13.6/drivers/i2c/busses/i2c-bcm2708.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/i2c/busses/i2c-bcm2708.c 2014-03-11 16:54:57.000000000 +0100 @@ -0,0 +1,408 @@ +/* + * Driver for Broadcom BCM2708 BSC Controllers @@ -10686,9 +10687,9 @@ diff -Nur linux-3.13.6.orig/drivers/i2c/busses/i2c-bcm2708.c linux-3.13.6/driver +MODULE_AUTHOR("Chris Boot <bootc@bootc.net>"); +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS("platform:" DRV_NAME); -diff -Nur linux-3.13.6.orig/drivers/i2c/busses/Kconfig linux-3.13.6/drivers/i2c/busses/Kconfig ---- linux-3.13.6.orig/drivers/i2c/busses/Kconfig 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/i2c/busses/Kconfig 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/i2c/busses/Kconfig linux-raspberry-pi/drivers/i2c/busses/Kconfig +--- linux-3.13.6/drivers/i2c/busses/Kconfig 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/i2c/busses/Kconfig 2014-03-11 16:54:57.000000000 +0100 @@ -347,6 +347,25 @@ This support is also available as a module. If so, the module will be called i2c-bcm2835. @@ -10715,9 +10716,9 @@ diff -Nur linux-3.13.6.orig/drivers/i2c/busses/Kconfig linux-3.13.6/drivers/i2c/ config I2C_BCM_KONA tristate "BCM Kona I2C adapter" depends on ARCH_BCM_MOBILE -diff -Nur linux-3.13.6.orig/drivers/i2c/busses/Makefile linux-3.13.6/drivers/i2c/busses/Makefile ---- linux-3.13.6.orig/drivers/i2c/busses/Makefile 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/i2c/busses/Makefile 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/i2c/busses/Makefile linux-raspberry-pi/drivers/i2c/busses/Makefile +--- linux-3.13.6/drivers/i2c/busses/Makefile 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/i2c/busses/Makefile 2014-03-11 16:54:57.000000000 +0100 @@ -32,6 +32,7 @@ obj-$(CONFIG_I2C_AT91) += i2c-at91.o obj-$(CONFIG_I2C_AU1550) += i2c-au1550.o @@ -10726,9 +10727,9 @@ diff -Nur linux-3.13.6.orig/drivers/i2c/busses/Makefile linux-3.13.6/drivers/i2c obj-$(CONFIG_I2C_BLACKFIN_TWI) += i2c-bfin-twi.o obj-$(CONFIG_I2C_CBUS_GPIO) += i2c-cbus-gpio.o obj-$(CONFIG_I2C_CPM) += i2c-cpm.o -diff -Nur linux-3.13.6.orig/drivers/media/dvb-core/dvb-usb-ids.h linux-3.13.6/drivers/media/dvb-core/dvb-usb-ids.h ---- linux-3.13.6.orig/drivers/media/dvb-core/dvb-usb-ids.h 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/media/dvb-core/dvb-usb-ids.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/media/dvb-core/dvb-usb-ids.h linux-raspberry-pi/drivers/media/dvb-core/dvb-usb-ids.h +--- linux-3.13.6/drivers/media/dvb-core/dvb-usb-ids.h 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/media/dvb-core/dvb-usb-ids.h 2014-03-11 16:54:57.000000000 +0100 @@ -366,6 +366,7 @@ #define USB_PID_TERRATEC_DVBS2CI_V2 0x10ac #define USB_PID_TECHNISAT_USB2_HDCI_V1 0x0001 @@ -10737,10 +10738,10 @@ diff -Nur linux-3.13.6.orig/drivers/media/dvb-core/dvb-usb-ids.h linux-3.13.6/dr #define USB_PID_TECHNISAT_AIRSTAR_TELESTICK_2 0x0004 #define USB_PID_TECHNISAT_USB2_DVB_S2 0x0500 #define USB_PID_CPYTO_REDI_PC50A 0xa803 -diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linux-3.13.6/drivers/media/platform/bcm2835/bcm2835-camera.c ---- linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/media/platform/bcm2835/bcm2835-camera.c 2014-03-10 14:41:55.000000000 +0100 -@@ -0,0 +1,1622 @@ +diff -Nur linux-3.13.6/drivers/media/platform/bcm2835/bcm2835-camera.c linux-raspberry-pi/drivers/media/platform/bcm2835/bcm2835-camera.c +--- linux-3.13.6/drivers/media/platform/bcm2835/bcm2835-camera.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/media/platform/bcm2835/bcm2835-camera.c 2014-03-11 16:52:42.000000000 +0100 +@@ -0,0 +1,1695 @@ +/* + * Broadcom BM2835 V4L2 driver + * @@ -10779,7 +10780,8 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu + +#define BM2835_MMAL_VERSION "0.0.2" +#define BM2835_MMAL_MODULE_NAME "bcm2835-v4l2" -+ ++#define MIN_WIDTH 16 ++#define MIN_HEIGHT 16 +#define MAX_WIDTH 2592 +#define MAX_HEIGHT 1944 +#define MIN_BUFFER_SIZE (80*1024) @@ -10799,7 +10801,7 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu +static struct bm2835_mmal_dev *gdev; /* global device data */ + +#define FPS_MIN 1 -+#define FPS_MAX 30 ++#define FPS_MAX 90 + +/* timeperframe: min/max and default */ +static const struct v4l2_fract @@ -10812,6 +10814,7 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu + { + .name = "4:2:0, packed YUV", + .fourcc = V4L2_PIX_FMT_YUV420, ++ .flags = 0, + .mmal = MMAL_ENCODING_I420, + .depth = 12, + .mmal_component = MMAL_COMPONENT_CAMERA, @@ -10819,13 +10822,15 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu + { + .name = "4:2:2, packed, YUYV", + .fourcc = V4L2_PIX_FMT_YUYV, ++ .flags = 0, + .mmal = MMAL_ENCODING_YUYV, + .depth = 16, + .mmal_component = MMAL_COMPONENT_CAMERA, + }, + { -+ .name = "RGB24 (BE)", -+ .fourcc = V4L2_PIX_FMT_BGR24, ++ .name = "RGB24 (LE)", ++ .fourcc = V4L2_PIX_FMT_RGB24, ++ .flags = 0, + .mmal = MMAL_ENCODING_BGR24, + .depth = 24, + .mmal_component = MMAL_COMPONENT_CAMERA, @@ -10833,6 +10838,7 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu + { + .name = "JPEG", + .fourcc = V4L2_PIX_FMT_JPEG, ++ .flags = V4L2_FMT_FLAG_COMPRESSED, + .mmal = MMAL_ENCODING_JPEG, + .depth = 8, + .mmal_component = MMAL_COMPONENT_IMAGE_ENCODE, @@ -10840,10 +10846,51 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu + { + .name = "H264", + .fourcc = V4L2_PIX_FMT_H264, ++ .flags = V4L2_FMT_FLAG_COMPRESSED, + .mmal = MMAL_ENCODING_H264, + .depth = 8, + .mmal_component = MMAL_COMPONENT_VIDEO_ENCODE, -+ } ++ }, ++ { ++ .name = "MJPEG", ++ .fourcc = V4L2_PIX_FMT_MJPEG, ++ .flags = V4L2_FMT_FLAG_COMPRESSED, ++ .mmal = MMAL_ENCODING_MJPEG, ++ .depth = 8, ++ .mmal_component = MMAL_COMPONENT_VIDEO_ENCODE, ++ }, ++ { ++ .name = "4:2:2, packed, YVYU", ++ .fourcc = V4L2_PIX_FMT_YVYU, ++ .flags = 0, ++ .mmal = MMAL_ENCODING_YVYU, ++ .depth = 16, ++ .mmal_component = MMAL_COMPONENT_CAMERA, ++ }, ++ { ++ .name = "4:2:2, packed, VYUY", ++ .fourcc = V4L2_PIX_FMT_VYUY, ++ .flags = 0, ++ .mmal = MMAL_ENCODING_VYUY, ++ .depth = 16, ++ .mmal_component = MMAL_COMPONENT_CAMERA, ++ }, ++ { ++ .name = "4:2:2, packed, UYVY", ++ .fourcc = V4L2_PIX_FMT_UYVY, ++ .flags = 0, ++ .mmal = MMAL_ENCODING_UYVY, ++ .depth = 16, ++ .mmal_component = MMAL_COMPONENT_CAMERA, ++ }, ++ { ++ .name = "4:2:0, packed, NV12", ++ .fourcc = V4L2_PIX_FMT_NV12, ++ .flags = 0, ++ .mmal = MMAL_ENCODING_NV12, ++ .depth = 12, ++ .mmal_component = MMAL_COMPONENT_CAMERA, ++ }, +}; + +static struct mmal_fmt *get_format(struct v4l2_format *f) @@ -11291,6 +11338,7 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu + + strlcpy(f->description, fmt->name, sizeof(f->description)); + f->pixelformat = fmt->fourcc; ++ f->flags = fmt->flags; + + return 0; +} @@ -11419,7 +11467,7 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu + a->fmt.bytesperline = (preview_port->es.video.width * 3)>>1; + a->fmt.sizeimage = (preview_port->es.video.width * + preview_port->es.video.height * 3)>>1; -+ a->fmt.colorspace = V4L2_COLORSPACE_SMPTE170M; ++ a->fmt.colorspace = V4L2_COLORSPACE_JPEG; + + return 0; +} @@ -11486,6 +11534,8 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu + + strlcpy(f->description, fmt->name, sizeof(f->description)); + f->pixelformat = fmt->fourcc; ++ f->flags = fmt->flags; ++ + return 0; +} + @@ -11630,10 +11680,8 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu + camera_port->es.video.crop.y = 0; + camera_port->es.video.crop.width = f->fmt.pix.width; + camera_port->es.video.crop.height = f->fmt.pix.height; -+ camera_port->es.video.frame_rate.num = -+ dev->capture.timeperframe.denominator; -+ camera_port->es.video.frame_rate.den = -+ dev->capture.timeperframe.numerator; ++ camera_port->es.video.frame_rate.num = 0; ++ camera_port->es.video.frame_rate.den = 1; + + ret = vchiq_mmal_port_set_format(dev->instance, camera_port); + @@ -11667,8 +11715,10 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu + preview_port->es.video.crop.y = 0; + preview_port->es.video.crop.width = f->fmt.pix.width; + preview_port->es.video.crop.height = f->fmt.pix.height; -+ preview_port->es.video.frame_rate.num = 30; -+ preview_port->es.video.frame_rate.den = 1; ++ preview_port->es.video.frame_rate.num = ++ dev->capture.timeperframe.denominator; ++ preview_port->es.video.frame_rate.den = ++ dev->capture.timeperframe.numerator; + ret = vchiq_mmal_port_set_format(dev->instance, preview_port); + if (overlay_enabled) { + ret = vchiq_mmal_port_connect_tunnel( @@ -11843,22 +11893,56 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu + } + + ret = mmal_setup_components(dev, f); -+ if (ret != 0) ++ if (ret != 0) { + v4l2_err(&dev->v4l2_dev, + "%s: failed to setup mmal components: %d\n", + __func__, ret); ++ ret = -EINVAL; ++ } + + return ret; +} + ++int vidioc_enum_framesizes(struct file *file, void *fh, ++ struct v4l2_frmsizeenum *fsize) ++{ ++ static const struct v4l2_frmsize_stepwise sizes = { ++ MIN_WIDTH, MAX_WIDTH, 2, ++ MIN_HEIGHT, MAX_HEIGHT, 2 ++ }; ++ int i; ++ ++ if (fsize->index) ++ return -EINVAL; ++ for (i = 0; i < ARRAY_SIZE(formats); i++) ++ if (formats[i].fourcc == fsize->pixel_format) ++ break; ++ if (i == ARRAY_SIZE(formats)) ++ return -EINVAL; ++ fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE; ++ fsize->stepwise = sizes; ++ return 0; ++} ++ +/* timeperframe is arbitrary and continous */ +static int vidioc_enum_frameintervals(struct file *file, void *priv, + struct v4l2_frmivalenum *fival) +{ ++ int i; ++ + if (fival->index) + return -EINVAL; + -+ /* regarding width & height - we support any */ ++ for (i = 0; i < ARRAY_SIZE(formats); i++) ++ if (formats[i].fourcc == fival->pixel_format) ++ break; ++ if (i == ARRAY_SIZE(formats)) ++ return -EINVAL; ++ ++ /* regarding width & height - we support any within range */ ++ if (fival->width < MIN_WIDTH || fival->width > MAX_WIDTH || ++ fival->height < MIN_HEIGHT || fival->height > MAX_HEIGHT) ++ return -EINVAL; + + fival->type = V4L2_FRMIVAL_TYPE_CONTINUOUS; + @@ -11894,7 +11978,6 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu + struct bm2835_mmal_dev *dev = video_drvdata(file); + struct v4l2_fract tpf; + struct mmal_parameter_rational fps_param; -+ int ret; + + if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) + return -EINVAL; @@ -11910,27 +11993,11 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu + parm->parm.capture.timeperframe = tpf; + parm->parm.capture.readbuffers = 1; + -+ fps_param.num = dev->capture.timeperframe.denominator; -+ fps_param.den = dev->capture.timeperframe.numerator; -+ ret = vchiq_mmal_port_parameter_set(dev->instance, -+ &dev->component[MMAL_COMPONENT_CAMERA]-> -+ output[MMAL_CAMERA_PORT_PREVIEW], -+ MMAL_PARAMETER_VIDEO_FRAME_RATE, -+ &fps_param, sizeof(fps_param)); -+ ret += vchiq_mmal_port_parameter_set(dev->instance, -+ &dev->component[MMAL_COMPONENT_CAMERA]-> -+ output[MMAL_CAMERA_PORT_VIDEO], -+ MMAL_PARAMETER_VIDEO_FRAME_RATE, -+ &fps_param, sizeof(fps_param)); -+ ret += vchiq_mmal_port_parameter_set(dev->instance, -+ &dev->component[MMAL_COMPONENT_CAMERA]-> -+ output[MMAL_CAMERA_PORT_CAPTURE], -+ MMAL_PARAMETER_VIDEO_FRAME_RATE, -+ &fps_param, sizeof(fps_param)); -+ if (ret) -+ v4l2_dbg(0, bcm2835_v4l2_debug, &dev->v4l2_dev, -+ "Failed to set fps ret %d\n", -+ ret); ++ fps_param.num = 0; /* Select variable fps, and then use ++ * FPS_RANGE to select the actual limits. ++ */ ++ fps_param.den = 1; ++ set_framerate_params(dev); + + return 0; +} @@ -11963,6 +12030,7 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu + .vidioc_querybuf = vb2_ioctl_querybuf, + .vidioc_qbuf = vb2_ioctl_qbuf, + .vidioc_dqbuf = vb2_ioctl_dqbuf, ++ .vidioc_enum_framesizes = vidioc_enum_framesizes, + .vidioc_enum_frameintervals = vidioc_enum_frameintervals, + .vidioc_g_parm = vidioc_g_parm, + .vidioc_s_parm = vidioc_s_parm, @@ -12058,10 +12126,8 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu + format->es->video.crop.y = 0; + format->es->video.crop.width = 1024; + format->es->video.crop.height = 768; -+ format->es->video.frame_rate.num = -+ dev->capture.timeperframe.denominator; -+ format->es->video.frame_rate.den = -+ dev->capture.timeperframe.numerator; ++ format->es->video.frame_rate.num = 0; /* Rely on fps_range */ ++ format->es->video.frame_rate.den = 1; + + format = + &dev->component[MMAL_COMPONENT_CAMERA]-> @@ -12076,10 +12142,8 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu + format->es->video.crop.y = 0; + format->es->video.crop.width = 1024; + format->es->video.crop.height = 768; -+ format->es->video.frame_rate.num = -+ dev->capture.timeperframe.denominator; -+ format->es->video.frame_rate.den = -+ dev->capture.timeperframe.numerator; ++ format->es->video.frame_rate.num = 0; /* Rely on fps_range */ ++ format->es->video.frame_rate.den = 1; + + format = + &dev->component[MMAL_COMPONENT_CAMERA]-> @@ -12093,7 +12157,7 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu + format->es->video.crop.y = 0; + format->es->video.crop.width = 2592; + format->es->video.crop.height = 1944; -+ format->es->video.frame_rate.num = 30; ++ format->es->video.frame_rate.num = 0; /* Rely on fps_range */ + format->es->video.frame_rate.den = 1; + + dev->capture.width = format->es->video.width; @@ -12101,6 +12165,8 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu + dev->capture.fmt = &formats[0]; + dev->capture.encode_component = NULL; + dev->capture.timeperframe = tpf_default; ++ dev->capture.enc_profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH; ++ dev->capture.enc_level = V4L2_MPEG_VIDEO_H264_LEVEL_4_0; + + /* get the preview component ready */ + ret = vchiq_mmal_component_init( @@ -12147,6 +12213,14 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu + } + + { ++ struct vchiq_mmal_port *encoder_port = ++ &dev->component[MMAL_COMPONENT_VIDEO_ENCODE]->output[0]; ++ encoder_port->format.encoding = MMAL_ENCODING_H264; ++ ret = vchiq_mmal_port_set_format(dev->instance, ++ encoder_port); ++ } ++ ++ { + unsigned int enable = 1; + vchiq_mmal_port_parameter_set( + dev->instance, @@ -12363,10 +12437,10 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.c linu + +module_init(bm2835_mmal_init); +module_exit(bm2835_mmal_exit); -diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.h linux-3.13.6/drivers/media/platform/bcm2835/bcm2835-camera.h ---- linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/media/platform/bcm2835/bcm2835-camera.h 2014-03-10 14:41:55.000000000 +0100 -@@ -0,0 +1,113 @@ +diff -Nur linux-3.13.6/drivers/media/platform/bcm2835/bcm2835-camera.h linux-raspberry-pi/drivers/media/platform/bcm2835/bcm2835-camera.h +--- linux-3.13.6/drivers/media/platform/bcm2835/bcm2835-camera.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/media/platform/bcm2835/bcm2835-camera.h 2014-03-11 16:52:42.000000000 +0100 +@@ -0,0 +1,123 @@ +/* + * Broadcom BM2835 V4L2 driver + * @@ -12384,7 +12458,7 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.h linu + * core driver device + */ + -+#define V4L2_CTRL_COUNT 21 /* number of v4l controls */ ++#define V4L2_CTRL_COUNT 25 /* number of v4l controls */ + +enum { + MMAL_COMPONENT_CAMERA = 0, @@ -12414,11 +12488,17 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.h linu + /* controls */ + struct v4l2_ctrl_handler ctrl_handler; + struct v4l2_ctrl *ctrls[V4L2_CTRL_COUNT]; ++ enum v4l2_scene_mode scene_mode; + struct mmal_colourfx colourfx; + int hflip; + int vflip; -+ enum mmal_parameter_exposuremode exposure_mode; ++ enum mmal_parameter_exposuremode exposure_mode_user; ++ enum v4l2_exposure_auto_type exposure_mode_v4l2_user; ++ /* active exposure mode may differ if selected via a scene mode */ ++ enum mmal_parameter_exposuremode exposure_mode_active; ++ enum mmal_parameter_exposuremeteringmode metering_mode; + unsigned int manual_shutter_speed; ++ bool exp_auto_priority; + + /* allocated mmal instance and components */ + struct vchiq_mmal_instance *instance; @@ -12432,12 +12512,16 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.h linu + unsigned int height; /* height */ + unsigned int stride; /* stride */ + struct mmal_fmt *fmt; -+ struct v4l2_fract timeperframe; ++ struct v4l2_fract timeperframe; + + /* H264 encode bitrate */ + int encode_bitrate; + /* H264 bitrate mode. CBR/VBR */ + int encode_bitrate_mode; ++ /* H264 profile */ ++ enum v4l2_mpeg_video_h264_profile enc_profile; ++ /* H264 level */ ++ enum v4l2_mpeg_video_h264_level enc_level; + /* JPEG Q-factor */ + int q_factor; + @@ -12467,7 +12551,7 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.h linu + struct v4l2_ctrl_handler *hdl); + +int bm2835_mmal_set_all_camera_controls(struct bm2835_mmal_dev *dev); -+ ++int set_framerate_params(struct bm2835_mmal_dev *dev); + +/* Debug helpers */ + @@ -12480,10 +12564,10 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/bcm2835-camera.h linu + (pix_fmt)->pixelformat, (pix_fmt)->bytesperline, \ + (pix_fmt)->sizeimage, (pix_fmt)->colorspace, (pix_fmt)->priv); \ +} -diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c linux-3.13.6/drivers/media/platform/bcm2835/controls.c ---- linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/media/platform/bcm2835/controls.c 2014-03-10 14:41:55.000000000 +0100 -@@ -0,0 +1,902 @@ +diff -Nur linux-3.13.6/drivers/media/platform/bcm2835/controls.c linux-raspberry-pi/drivers/media/platform/bcm2835/controls.c +--- linux-3.13.6/drivers/media/platform/bcm2835/controls.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/media/platform/bcm2835/controls.c 2014-03-11 16:52:42.000000000 +0100 +@@ -0,0 +1,1278 @@ +/* + * Broadcom BM2835 V4L2 driver + * @@ -12555,7 +12639,6 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c linux-3.13 + (s64)V4L2_MPEG_VIDEO_BITRATE_MODE_CBR, +}; + -+ +enum bm2835_mmal_ctrl_type { + MMAL_CONTROL_TYPE_STD, + MMAL_CONTROL_TYPE_STD_MENU, @@ -12632,6 +12715,25 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c linux-3.13 + 1, 1, 0, 0, 0, {0, 0, 0, 0, 0} } +}; + ++struct v4l2_mmal_scene_config { ++ enum v4l2_scene_mode v4l2_scene; ++ enum mmal_parameter_exposuremode exposure_mode; ++ enum mmal_parameter_exposuremeteringmode metering_mode; ++}; ++ ++static const struct v4l2_mmal_scene_config scene_configs[] = { ++ /* V4L2_SCENE_MODE_NONE automatically added */ ++ { ++ V4L2_SCENE_MODE_NIGHT, ++ MMAL_PARAM_EXPOSUREMODE_NIGHT, ++ MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE ++ }, ++ { ++ V4L2_SCENE_MODE_SPORTS, ++ MMAL_PARAM_EXPOSUREMODE_SPORTS, ++ MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE ++ }, ++}; + +/* control handlers*/ + @@ -12783,7 +12885,7 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c linux-3.13 + struct v4l2_ctrl *ctrl, + const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl) +{ -+ enum mmal_parameter_exposuremode exp_mode = dev->exposure_mode; ++ enum mmal_parameter_exposuremode exp_mode = dev->exposure_mode_user; + u32 shutter_speed = 0; + struct vchiq_mmal_port *control; + int ret = 0; @@ -12804,28 +12906,34 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c linux-3.13 + case V4L2_EXPOSURE_MANUAL: + exp_mode = MMAL_PARAM_EXPOSUREMODE_OFF; + break; -+ -+ case V4L2_EXPOSURE_SHUTTER_PRIORITY: -+ exp_mode = MMAL_PARAM_EXPOSUREMODE_SPORTS; -+ break; -+ -+ case V4L2_EXPOSURE_APERTURE_PRIORITY: -+ exp_mode = MMAL_PARAM_EXPOSUREMODE_NIGHT; -+ break; -+ + } -+ dev->exposure_mode = exp_mode; -+ } -+ -+ if (dev->exposure_mode == MMAL_PARAM_EXPOSUREMODE_OFF) -+ shutter_speed = dev->manual_shutter_speed; ++ dev->exposure_mode_user = exp_mode; ++ dev->exposure_mode_v4l2_user = ctrl->val; ++ } else if (mmal_ctrl->id == V4L2_CID_EXPOSURE_AUTO_PRIORITY) { ++ dev->exp_auto_priority = ctrl->val; ++ } ++ ++ if (dev->scene_mode == V4L2_SCENE_MODE_NONE) { ++ if (exp_mode == MMAL_PARAM_EXPOSUREMODE_OFF) ++ shutter_speed = dev->manual_shutter_speed; ++ ++ ret = vchiq_mmal_port_parameter_set(dev->instance, ++ control, ++ MMAL_PARAMETER_SHUTTER_SPEED, ++ &shutter_speed, ++ sizeof(shutter_speed)); ++ ret += vchiq_mmal_port_parameter_set(dev->instance, ++ control, ++ MMAL_PARAMETER_EXPOSURE_MODE, ++ &exp_mode, ++ sizeof(u32)); ++ dev->exposure_mode_active = exp_mode; ++ } ++ /* exposure_dynamic_framerate (V4L2_CID_EXPOSURE_AUTO_PRIORITY) should ++ * always apply irrespective of scene mode. ++ */ ++ ret += set_framerate_params(dev); + -+ ret = vchiq_mmal_port_parameter_set(dev->instance, control, -+ MMAL_PARAMETER_SHUTTER_SPEED, -+ &shutter_speed, sizeof(shutter_speed)); -+ ret += vchiq_mmal_port_parameter_set(dev->instance, control, -+ MMAL_PARAMETER_EXPOSURE_MODE, -+ &exp_mode, sizeof(u32)); + return ret; +} + @@ -12833,35 +12941,38 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c linux-3.13 + struct v4l2_ctrl *ctrl, + const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl) +{ -+ u32 u32_value; -+ struct vchiq_mmal_port *control; -+ -+ control = &dev->component[MMAL_COMPONENT_CAMERA]->control; -+ + switch (ctrl->val) { + case V4L2_EXPOSURE_METERING_AVERAGE: -+ u32_value = MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE; ++ dev->metering_mode = MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE; + break; + + case V4L2_EXPOSURE_METERING_CENTER_WEIGHTED: -+ u32_value = MMAL_PARAM_EXPOSUREMETERINGMODE_BACKLIT; ++ dev->metering_mode = MMAL_PARAM_EXPOSUREMETERINGMODE_BACKLIT; + break; + + case V4L2_EXPOSURE_METERING_SPOT: -+ u32_value = MMAL_PARAM_EXPOSUREMETERINGMODE_SPOT; ++ dev->metering_mode = MMAL_PARAM_EXPOSUREMETERINGMODE_SPOT; + break; + + /* todo matrix weighting not added to Linux API till 3.9 + case V4L2_EXPOSURE_METERING_MATRIX: -+ u32_value = MMAL_PARAM_EXPOSUREMETERINGMODE_MATRIX; ++ dev->metering_mode = MMAL_PARAM_EXPOSUREMETERINGMODE_MATRIX; + break; + */ + + } + -+ return vchiq_mmal_port_parameter_set(dev->instance, control, ++ if (dev->scene_mode == V4L2_SCENE_MODE_NONE) { ++ struct vchiq_mmal_port *control; ++ u32 u32_value = dev->metering_mode; ++ ++ control = &dev->component[MMAL_COMPONENT_CAMERA]->control; ++ ++ return vchiq_mmal_port_parameter_set(dev->instance, control, + mmal_ctrl->mmal_id, + &u32_value, sizeof(u32_value)); ++ } else ++ return 0; +} + +static int ctrl_set_flicker_avoidance(struct bm2835_mmal_dev *dev, @@ -13026,8 +13137,8 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c linux-3.13 + &dev->colourfx, sizeof(dev->colourfx)); + + v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, -+ "After: mmal_ctrl:%p ctrl id:0x%x ctrl val:%d ret %d(%d)\n", -+ mmal_ctrl, ctrl->id, ctrl->val, ret, ++ "%s: After: mmal_ctrl:%p ctrl id:0x%x ctrl val:%d ret %d(%d)\n", ++ __func__, mmal_ctrl, ctrl->id, ctrl->val, ret, + (ret == 0 ? 0 : -EINVAL)); + return (ret == 0 ? 0 : EINVAL); +} @@ -13109,6 +13220,224 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c linux-3.13 + &u32_value, sizeof(u32_value)); +} + ++static int ctrl_set_video_encode_profile_level(struct bm2835_mmal_dev *dev, ++ struct v4l2_ctrl *ctrl, ++ const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl) ++{ ++ struct mmal_parameter_video_profile param; ++ int ret = 0; ++ ++ if (ctrl->id == V4L2_CID_MPEG_VIDEO_H264_PROFILE) { ++ switch (ctrl->val) { ++ case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE: ++ case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE: ++ case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN: ++ case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH: ++ dev->capture.enc_profile = ctrl->val; ++ break; ++ default: ++ ret = -EINVAL; ++ break; ++ } ++ } else if (ctrl->id == V4L2_CID_MPEG_VIDEO_H264_LEVEL) { ++ switch (ctrl->val) { ++ case V4L2_MPEG_VIDEO_H264_LEVEL_1_0: ++ case V4L2_MPEG_VIDEO_H264_LEVEL_1B: ++ case V4L2_MPEG_VIDEO_H264_LEVEL_1_1: ++ case V4L2_MPEG_VIDEO_H264_LEVEL_1_2: ++ case V4L2_MPEG_VIDEO_H264_LEVEL_1_3: ++ case V4L2_MPEG_VIDEO_H264_LEVEL_2_0: ++ case V4L2_MPEG_VIDEO_H264_LEVEL_2_1: ++ case V4L2_MPEG_VIDEO_H264_LEVEL_2_2: ++ case V4L2_MPEG_VIDEO_H264_LEVEL_3_0: ++ case V4L2_MPEG_VIDEO_H264_LEVEL_3_1: ++ case V4L2_MPEG_VIDEO_H264_LEVEL_3_2: ++ case V4L2_MPEG_VIDEO_H264_LEVEL_4_0: ++ dev->capture.enc_level = ctrl->val; ++ break; ++ default: ++ ret = -EINVAL; ++ break; ++ } ++ } ++ ++ if (!ret) { ++ switch (dev->capture.enc_profile) { ++ case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE: ++ param.profile = MMAL_VIDEO_PROFILE_H264_BASELINE; ++ break; ++ case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE: ++ param.profile = ++ MMAL_VIDEO_PROFILE_H264_CONSTRAINED_BASELINE; ++ break; ++ case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN: ++ param.profile = MMAL_VIDEO_PROFILE_H264_MAIN; ++ break; ++ case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH: ++ param.profile = MMAL_VIDEO_PROFILE_H264_HIGH; ++ break; ++ default: ++ /* Should never get here */ ++ break; ++ } ++ ++ switch (dev->capture.enc_level) { ++ case V4L2_MPEG_VIDEO_H264_LEVEL_1_0: ++ param.level = MMAL_VIDEO_LEVEL_H264_1; ++ break; ++ case V4L2_MPEG_VIDEO_H264_LEVEL_1B: ++ param.level = MMAL_VIDEO_LEVEL_H264_1b; ++ break; ++ case V4L2_MPEG_VIDEO_H264_LEVEL_1_1: ++ param.level = MMAL_VIDEO_LEVEL_H264_11; ++ break; ++ case V4L2_MPEG_VIDEO_H264_LEVEL_1_2: ++ param.level = MMAL_VIDEO_LEVEL_H264_12; ++ break; ++ case V4L2_MPEG_VIDEO_H264_LEVEL_1_3: ++ param.level = MMAL_VIDEO_LEVEL_H264_13; ++ break; ++ case V4L2_MPEG_VIDEO_H264_LEVEL_2_0: ++ param.level = MMAL_VIDEO_LEVEL_H264_2; ++ break; ++ case V4L2_MPEG_VIDEO_H264_LEVEL_2_1: ++ param.level = MMAL_VIDEO_LEVEL_H264_21; ++ break; ++ case V4L2_MPEG_VIDEO_H264_LEVEL_2_2: ++ param.level = MMAL_VIDEO_LEVEL_H264_22; ++ break; ++ case V4L2_MPEG_VIDEO_H264_LEVEL_3_0: ++ param.level = MMAL_VIDEO_LEVEL_H264_3; ++ break; ++ case V4L2_MPEG_VIDEO_H264_LEVEL_3_1: ++ param.level = MMAL_VIDEO_LEVEL_H264_31; ++ break; ++ case V4L2_MPEG_VIDEO_H264_LEVEL_3_2: ++ param.level = MMAL_VIDEO_LEVEL_H264_32; ++ break; ++ case V4L2_MPEG_VIDEO_H264_LEVEL_4_0: ++ param.level = MMAL_VIDEO_LEVEL_H264_4; ++ break; ++ default: ++ /* Should never get here */ ++ break; ++ } ++ ++ ret = vchiq_mmal_port_parameter_set(dev->instance, ++ &dev->component[MMAL_COMPONENT_VIDEO_ENCODE]->output[0], ++ mmal_ctrl->mmal_id, ++ ¶m, sizeof(param)); ++ } ++ return ret; ++} ++ ++static int ctrl_set_scene_mode(struct bm2835_mmal_dev *dev, ++ struct v4l2_ctrl *ctrl, ++ const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl) ++{ ++ int ret = 0; ++ int shutter_speed; ++ struct vchiq_mmal_port *control; ++ ++ v4l2_dbg(0, bcm2835_v4l2_debug, &dev->v4l2_dev, ++ "scene mode selected %d, was %d\n", ctrl->val, ++ dev->scene_mode); ++ control = &dev->component[MMAL_COMPONENT_CAMERA]->control; ++ ++ if (ctrl->val == dev->scene_mode) ++ return 0; ++ ++ if (ctrl->val == V4L2_SCENE_MODE_NONE) { ++ /* Restore all user selections */ ++ dev->scene_mode = V4L2_SCENE_MODE_NONE; ++ ++ if (dev->exposure_mode_user == MMAL_PARAM_EXPOSUREMODE_OFF) ++ shutter_speed = dev->manual_shutter_speed; ++ else ++ shutter_speed = 0; ++ ++ v4l2_dbg(0, bcm2835_v4l2_debug, &dev->v4l2_dev, ++ "%s: scene mode none: shut_speed %d, exp_mode %d, metering %d\n", ++ __func__, shutter_speed, dev->exposure_mode_user, ++ dev->metering_mode); ++ ret = vchiq_mmal_port_parameter_set(dev->instance, ++ control, ++ MMAL_PARAMETER_SHUTTER_SPEED, ++ &shutter_speed, ++ sizeof(shutter_speed)); ++ ret += vchiq_mmal_port_parameter_set(dev->instance, ++ control, ++ MMAL_PARAMETER_EXPOSURE_MODE, ++ &dev->exposure_mode_user, ++ sizeof(u32)); ++ dev->exposure_mode_active = dev->exposure_mode_user; ++ ret += vchiq_mmal_port_parameter_set(dev->instance, ++ control, ++ MMAL_PARAMETER_EXP_METERING_MODE, ++ &dev->metering_mode, ++ sizeof(u32)); ++ ret += set_framerate_params(dev); ++ } else { ++ /* Set up scene mode */ ++ int i; ++ const struct v4l2_mmal_scene_config *scene = NULL; ++ int shutter_speed; ++ enum mmal_parameter_exposuremode exposure_mode; ++ enum mmal_parameter_exposuremeteringmode metering_mode; ++ ++ for (i = 0; i < ARRAY_SIZE(scene_configs); i++) { ++ if (scene_configs[i].v4l2_scene == ++ ctrl->val) { ++ scene = &scene_configs[i]; ++ break; ++ } ++ } ++ if (i >= ARRAY_SIZE(scene_configs)) ++ return -EINVAL; ++ ++ /* Set all the values */ ++ dev->scene_mode = ctrl->val; ++ ++ if (scene->exposure_mode == MMAL_PARAM_EXPOSUREMODE_OFF) ++ shutter_speed = dev->manual_shutter_speed; ++ else ++ shutter_speed = 0; ++ exposure_mode = scene->exposure_mode; ++ metering_mode = scene->metering_mode; ++ ++ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, ++ "%s: scene mode none: shut_speed %d, exp_mode %d, metering %d\n", ++ __func__, shutter_speed, exposure_mode, metering_mode); ++ ++ ret = vchiq_mmal_port_parameter_set(dev->instance, control, ++ MMAL_PARAMETER_SHUTTER_SPEED, ++ &shutter_speed, ++ sizeof(shutter_speed)); ++ ret += vchiq_mmal_port_parameter_set(dev->instance, ++ control, ++ MMAL_PARAMETER_EXPOSURE_MODE, ++ &exposure_mode, ++ sizeof(u32)); ++ dev->exposure_mode_active = exposure_mode; ++ ret += vchiq_mmal_port_parameter_set(dev->instance, control, ++ MMAL_PARAMETER_EXPOSURE_MODE, ++ &exposure_mode, ++ sizeof(u32)); ++ ret += vchiq_mmal_port_parameter_set(dev->instance, control, ++ MMAL_PARAMETER_EXP_METERING_MODE, ++ &metering_mode, ++ sizeof(u32)); ++ ret += set_framerate_params(dev); ++ } ++ if (ret) { ++ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, ++ "%s: Setting scene to %d, ret=%d\n", ++ __func__, ctrl->val, ret); ++ ret = -EINVAL; ++ } ++ return 0; ++} ++ +static int bm2835_mmal_s_ctrl(struct v4l2_ctrl *ctrl) +{ + struct bm2835_mmal_dev *dev = @@ -13125,6 +13454,9 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c linux-3.13 + } + + ret = mmal_ctrl->setter(dev, ctrl, mmal_ctrl); ++ if (ret) ++ pr_warn("ctrl id:%d/MMAL param %08X- returned ret %d\n", ++ ctrl->id, mmal_ctrl->mmal_id, ret); + if (mmal_ctrl->ignore_errors) + ret = 0; + return ret; @@ -13211,6 +13543,14 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c linux-3.13 + false + }, + { ++ V4L2_CID_EXPOSURE_AUTO_PRIORITY, MMAL_CONTROL_TYPE_STD, ++ 0, 1, ++ 0, 1, NULL, ++ 0, /* Dummy MMAL ID as it gets mapped into FPS range*/ ++ &ctrl_set_exposure, ++ false ++ }, ++ { + V4L2_CID_EXPOSURE_METERING, + MMAL_CONTROL_TYPE_STD_MENU, + ~0x7, 2, V4L2_EXPOSURE_METERING_AVERAGE, 0, NULL, @@ -13300,6 +13640,48 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c linux-3.13 + &ctrl_set_video_encode_param_output, + true /* Errors ignored as requires latest firmware to work */ + }, ++ { ++ V4L2_CID_MPEG_VIDEO_H264_PROFILE, ++ MMAL_CONTROL_TYPE_STD_MENU, ++ ~((1<<V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) | ++ (1<<V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE) | ++ (1<<V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) | ++ (1<<V4L2_MPEG_VIDEO_H264_PROFILE_HIGH)), ++ V4L2_MPEG_VIDEO_H264_PROFILE_HIGH, ++ V4L2_MPEG_VIDEO_H264_PROFILE_HIGH, 1, NULL, ++ MMAL_PARAMETER_PROFILE, ++ &ctrl_set_video_encode_profile_level, ++ false ++ }, ++ { ++ V4L2_CID_MPEG_VIDEO_H264_LEVEL, MMAL_CONTROL_TYPE_STD_MENU, ++ ~((1<<V4L2_MPEG_VIDEO_H264_LEVEL_1_0) | ++ (1<<V4L2_MPEG_VIDEO_H264_LEVEL_1B) | ++ (1<<V4L2_MPEG_VIDEO_H264_LEVEL_1_1) | ++ (1<<V4L2_MPEG_VIDEO_H264_LEVEL_1_2) | ++ (1<<V4L2_MPEG_VIDEO_H264_LEVEL_1_3) | ++ (1<<V4L2_MPEG_VIDEO_H264_LEVEL_2_0) | ++ (1<<V4L2_MPEG_VIDEO_H264_LEVEL_2_1) | ++ (1<<V4L2_MPEG_VIDEO_H264_LEVEL_2_2) | ++ (1<<V4L2_MPEG_VIDEO_H264_LEVEL_3_0) | ++ (1<<V4L2_MPEG_VIDEO_H264_LEVEL_3_1) | ++ (1<<V4L2_MPEG_VIDEO_H264_LEVEL_3_2) | ++ (1<<V4L2_MPEG_VIDEO_H264_LEVEL_4_0)), ++ V4L2_MPEG_VIDEO_H264_LEVEL_4_0, ++ V4L2_MPEG_VIDEO_H264_LEVEL_4_0, 1, NULL, ++ MMAL_PARAMETER_PROFILE, ++ &ctrl_set_video_encode_profile_level, ++ false ++ }, ++ { ++ V4L2_CID_SCENE_MODE, MMAL_CONTROL_TYPE_STD_MENU, ++ -1, /* Min is computed at runtime */ ++ V4L2_SCENE_MODE_TEXT, ++ V4L2_SCENE_MODE_NONE, 1, NULL, ++ MMAL_PARAMETER_PROFILE, ++ &ctrl_set_scene_mode, ++ false ++ }, +}; + +int bm2835_mmal_set_all_camera_controls(struct bm2835_mmal_dev *dev) @@ -13311,13 +13693,71 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c linux-3.13 + if ((dev->ctrls[c]) && (v4l2_ctrls[c].setter)) { + ret = v4l2_ctrls[c].setter(dev, dev->ctrls[c], + &v4l2_ctrls[c]); -+ if (!v4l2_ctrls[c]. ignore_errors && ret) ++ if (!v4l2_ctrls[c].ignore_errors && ret) { ++ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, ++ "Failed when setting default values for ctrl %d\n", ++ c); + break; ++ } + } + } + return ret; +} + ++int set_framerate_params(struct bm2835_mmal_dev *dev) ++{ ++ struct mmal_parameter_fps_range fps_range; ++ int ret; ++ ++ if ((dev->exposure_mode_active != MMAL_PARAM_EXPOSUREMODE_OFF) && ++ (dev->exp_auto_priority)) { ++ /* Variable FPS. Define min FPS as 1fps. ++ * Max as max defined FPS. ++ */ ++ fps_range.fps_low.num = 1; ++ fps_range.fps_low.den = 1; ++ fps_range.fps_high.num = dev->capture.timeperframe.denominator; ++ fps_range.fps_high.den = dev->capture.timeperframe.numerator; ++ } else { ++ /* Fixed FPS - set min and max to be the same */ ++ fps_range.fps_low.num = fps_range.fps_high.num = ++ dev->capture.timeperframe.denominator; ++ fps_range.fps_low.den = fps_range.fps_high.den = ++ dev->capture.timeperframe.numerator; ++ } ++ ++ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, ++ "Set fps range to %d/%d to %d/%d\n", ++ fps_range.fps_low.num, ++ fps_range.fps_low.den, ++ fps_range.fps_high.num, ++ fps_range.fps_high.den ++ ); ++ ++ ret = vchiq_mmal_port_parameter_set(dev->instance, ++ &dev->component[MMAL_COMPONENT_CAMERA]-> ++ output[MMAL_CAMERA_PORT_PREVIEW], ++ MMAL_PARAMETER_FPS_RANGE, ++ &fps_range, sizeof(fps_range)); ++ ret += vchiq_mmal_port_parameter_set(dev->instance, ++ &dev->component[MMAL_COMPONENT_CAMERA]-> ++ output[MMAL_CAMERA_PORT_VIDEO], ++ MMAL_PARAMETER_FPS_RANGE, ++ &fps_range, sizeof(fps_range)); ++ ret += vchiq_mmal_port_parameter_set(dev->instance, ++ &dev->component[MMAL_COMPONENT_CAMERA]-> ++ output[MMAL_CAMERA_PORT_CAPTURE], ++ MMAL_PARAMETER_FPS_RANGE, ++ &fps_range, sizeof(fps_range)); ++ if (ret) ++ v4l2_dbg(0, bcm2835_v4l2_debug, &dev->v4l2_dev, ++ "Failed to set fps ret %d\n", ++ ret); ++ ++ return ret; ++ ++} ++ +int bm2835_mmal_init_controls(struct bm2835_mmal_dev *dev, + struct v4l2_ctrl_handler *hdl) +{ @@ -13337,10 +13777,30 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c linux-3.13 + break; + + case MMAL_CONTROL_TYPE_STD_MENU: ++ { ++ int mask = ctrl->min; ++ ++ if (ctrl->id == V4L2_CID_SCENE_MODE) { ++ /* Special handling to work out the mask ++ * value based on the scene_configs array ++ * at runtime. Reduces the chance of ++ * mismatches. ++ */ ++ int i; ++ mask = 1<<V4L2_SCENE_MODE_NONE; ++ for (i = 0; ++ i < ARRAY_SIZE(scene_configs); ++ i++) { ++ mask |= 1<<scene_configs[i].v4l2_scene; ++ } ++ mask = ~mask; ++ } ++ + dev->ctrls[c] = v4l2_ctrl_new_std_menu(hdl, + &bm2835_mmal_ctrl_ops, ctrl->id, -+ ctrl->max, ctrl->min, ctrl->def); ++ ctrl->max, mask, ctrl->def); + break; ++ } + + case MMAL_CONTROL_TYPE_INT_MENU: + dev->ctrls[c] = v4l2_ctrl_new_int_menu(hdl, @@ -13386,9 +13846,9 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/controls.c linux-3.13 + + return 0; +} -diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/Kconfig linux-3.13.6/drivers/media/platform/bcm2835/Kconfig ---- linux-3.13.6.orig/drivers/media/platform/bcm2835/Kconfig 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/media/platform/bcm2835/Kconfig 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/media/platform/bcm2835/Kconfig linux-raspberry-pi/drivers/media/platform/bcm2835/Kconfig +--- linux-3.13.6/drivers/media/platform/bcm2835/Kconfig 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/media/platform/bcm2835/Kconfig 2014-03-11 16:52:42.000000000 +0100 @@ -0,0 +1,25 @@ +# Broadcom VideoCore IV v4l2 camera support + @@ -13415,19 +13875,19 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/Kconfig linux-3.13.6/ + + +endif # VIDEO_BM2835 -diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/Makefile linux-3.13.6/drivers/media/platform/bcm2835/Makefile ---- linux-3.13.6.orig/drivers/media/platform/bcm2835/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/media/platform/bcm2835/Makefile 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/media/platform/bcm2835/Makefile linux-raspberry-pi/drivers/media/platform/bcm2835/Makefile +--- linux-3.13.6/drivers/media/platform/bcm2835/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/media/platform/bcm2835/Makefile 2014-03-11 16:52:42.000000000 +0100 @@ -0,0 +1,5 @@ +bcm2835-v4l2-objs := bcm2835-camera.o controls.o mmal-vchiq.o + +obj-$(CONFIG_VIDEO_BCM2835_MMAL) += bcm2835-v4l2.o + +ccflags-$(CONFIG_VIDEO_BCM2835) += -Idrivers/misc/vc04_services -Idrivers/misc/vc04_services/interface/vcos/linuxkernel -D__VCCOREVER__=0x04000000 -diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-common.h linux-3.13.6/drivers/media/platform/bcm2835/mmal-common.h ---- linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-common.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/media/platform/bcm2835/mmal-common.h 2014-03-10 14:41:55.000000000 +0100 -@@ -0,0 +1,52 @@ +diff -Nur linux-3.13.6/drivers/media/platform/bcm2835/mmal-common.h linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-common.h +--- linux-3.13.6/drivers/media/platform/bcm2835/mmal-common.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-common.h 2014-03-11 16:52:42.000000000 +0100 +@@ -0,0 +1,53 @@ +/* + * Broadcom BM2835 V4L2 driver + * @@ -13456,6 +13916,7 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-common.h linux-3 +struct mmal_fmt { + char *name; + u32 fourcc; /* v4l2 format id */ ++ int flags; /* v4l2 flags field */ + u32 mmal; + int depth; + u32 mmal_component; /* MMAL component index to be used to encode */ @@ -13480,10 +13941,10 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-common.h linux-3 + u32 v; +}; + -diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-encodings.h linux-3.13.6/drivers/media/platform/bcm2835/mmal-encodings.h ---- linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-encodings.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/media/platform/bcm2835/mmal-encodings.h 2014-03-10 14:41:55.000000000 +0100 -@@ -0,0 +1,93 @@ +diff -Nur linux-3.13.6/drivers/media/platform/bcm2835/mmal-encodings.h linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-encodings.h +--- linux-3.13.6/drivers/media/platform/bcm2835/mmal-encodings.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-encodings.h 2014-03-11 16:52:42.000000000 +0100 +@@ -0,0 +1,94 @@ +/* + * Broadcom BM2835 V4L2 driver + * @@ -13513,6 +13974,7 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-encodings.h linu +#define MMAL_ENCODING_VP6 MMAL_FOURCC('V', 'P', '6', ' ') +#define MMAL_ENCODING_THEORA MMAL_FOURCC('T', 'H', 'E', 'O') +#define MMAL_ENCODING_SPARK MMAL_FOURCC('S', 'P', 'R', 'K') ++#define MMAL_ENCODING_MJPEG MMAL_FOURCC('M', 'J', 'P', 'G') + +#define MMAL_ENCODING_JPEG MMAL_FOURCC('J', 'P', 'E', 'G') +#define MMAL_ENCODING_GIF MMAL_FOURCC('G', 'I', 'F', ' ') @@ -13577,9 +14039,9 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-encodings.h linu +#define MMAL_ENCODING_VARIANT_H264_AVC1 MMAL_FOURCC('A', 'V', 'C', '1') +/** Implicitly delineated NAL units without emulation prevention */ +#define MMAL_ENCODING_VARIANT_H264_RAW MMAL_FOURCC('R', 'A', 'W', ' ') -diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-msg-common.h linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg-common.h ---- linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-msg-common.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg-common.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg-common.h linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-msg-common.h +--- linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg-common.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-msg-common.h 2014-03-11 16:52:42.000000000 +0100 @@ -0,0 +1,50 @@ +/* + * Broadcom BM2835 V4L2 driver @@ -13631,9 +14093,9 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-msg-common.h lin +}; + +#endif /* MMAL_MSG_COMMON_H */ -diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-msg-format.h linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg-format.h ---- linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-msg-format.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg-format.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg-format.h linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-msg-format.h +--- linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg-format.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-msg-format.h 2014-03-11 16:52:42.000000000 +0100 @@ -0,0 +1,81 @@ +/* + * Broadcom BM2835 V4L2 driver @@ -13716,9 +14178,9 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-msg-format.h lin +}; + +#endif /* MMAL_MSG_FORMAT_H */ -diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-msg.h linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg.h ---- linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-msg.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg.h linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-msg.h +--- linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-msg.h 2014-03-11 16:52:42.000000000 +0100 @@ -0,0 +1,404 @@ +/* + * Broadcom BM2835 V4L2 driver @@ -14124,9 +14586,9 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-msg.h linux-3.13 + u8 payload[MMAL_MSG_MAX_PAYLOAD]; + } u; +}; -diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-msg-port.h linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg-port.h ---- linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-msg-port.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg-port.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg-port.h linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-msg-port.h +--- linux-3.13.6/drivers/media/platform/bcm2835/mmal-msg-port.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-msg-port.h 2014-03-11 16:52:42.000000000 +0100 @@ -0,0 +1,107 @@ +/* + * Broadcom BM2835 V4L2 driver @@ -14235,10 +14697,10 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-msg-port.h linux + */ + +}; -diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-parameters.h linux-3.13.6/drivers/media/platform/bcm2835/mmal-parameters.h ---- linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-parameters.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/media/platform/bcm2835/mmal-parameters.h 2014-03-10 14:41:55.000000000 +0100 -@@ -0,0 +1,562 @@ +diff -Nur linux-3.13.6/drivers/media/platform/bcm2835/mmal-parameters.h linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-parameters.h +--- linux-3.13.6/drivers/media/platform/bcm2835/mmal-parameters.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-parameters.h 2014-03-11 16:52:42.000000000 +0100 +@@ -0,0 +1,649 @@ +/* + * Broadcom BM2835 V4L2 driver + * @@ -14423,6 +14885,14 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-parameters.h lin + */ +}; + ++struct mmal_parameter_fps_range { ++ /**< Low end of the permitted framerate range */ ++ struct mmal_parameter_rational fps_low; ++ /**< High end of the permitted framerate range */ ++ struct mmal_parameter_rational fps_high; ++}; ++ ++ +/* camera configuration parameter */ +struct mmal_parameter_camera_config { + /* Parameters for setting up the image pools */ @@ -14534,6 +15004,85 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-parameters.h lin + MMAL_VIDEO_RATECONTROL_CONSTANT_SKIP_FRAMES +}; + ++enum mmal_video_profile { ++ MMAL_VIDEO_PROFILE_H263_BASELINE, ++ MMAL_VIDEO_PROFILE_H263_H320CODING, ++ MMAL_VIDEO_PROFILE_H263_BACKWARDCOMPATIBLE, ++ MMAL_VIDEO_PROFILE_H263_ISWV2, ++ MMAL_VIDEO_PROFILE_H263_ISWV3, ++ MMAL_VIDEO_PROFILE_H263_HIGHCOMPRESSION, ++ MMAL_VIDEO_PROFILE_H263_INTERNET, ++ MMAL_VIDEO_PROFILE_H263_INTERLACE, ++ MMAL_VIDEO_PROFILE_H263_HIGHLATENCY, ++ MMAL_VIDEO_PROFILE_MP4V_SIMPLE, ++ MMAL_VIDEO_PROFILE_MP4V_SIMPLESCALABLE, ++ MMAL_VIDEO_PROFILE_MP4V_CORE, ++ MMAL_VIDEO_PROFILE_MP4V_MAIN, ++ MMAL_VIDEO_PROFILE_MP4V_NBIT, ++ MMAL_VIDEO_PROFILE_MP4V_SCALABLETEXTURE, ++ MMAL_VIDEO_PROFILE_MP4V_SIMPLEFACE, ++ MMAL_VIDEO_PROFILE_MP4V_SIMPLEFBA, ++ MMAL_VIDEO_PROFILE_MP4V_BASICANIMATED, ++ MMAL_VIDEO_PROFILE_MP4V_HYBRID, ++ MMAL_VIDEO_PROFILE_MP4V_ADVANCEDREALTIME, ++ MMAL_VIDEO_PROFILE_MP4V_CORESCALABLE, ++ MMAL_VIDEO_PROFILE_MP4V_ADVANCEDCODING, ++ MMAL_VIDEO_PROFILE_MP4V_ADVANCEDCORE, ++ MMAL_VIDEO_PROFILE_MP4V_ADVANCEDSCALABLE, ++ MMAL_VIDEO_PROFILE_MP4V_ADVANCEDSIMPLE, ++ MMAL_VIDEO_PROFILE_H264_BASELINE, ++ MMAL_VIDEO_PROFILE_H264_MAIN, ++ MMAL_VIDEO_PROFILE_H264_EXTENDED, ++ MMAL_VIDEO_PROFILE_H264_HIGH, ++ MMAL_VIDEO_PROFILE_H264_HIGH10, ++ MMAL_VIDEO_PROFILE_H264_HIGH422, ++ MMAL_VIDEO_PROFILE_H264_HIGH444, ++ MMAL_VIDEO_PROFILE_H264_CONSTRAINED_BASELINE, ++ MMAL_VIDEO_PROFILE_DUMMY = 0x7FFFFFFF ++}; ++ ++enum mmal_video_level { ++ MMAL_VIDEO_LEVEL_H263_10, ++ MMAL_VIDEO_LEVEL_H263_20, ++ MMAL_VIDEO_LEVEL_H263_30, ++ MMAL_VIDEO_LEVEL_H263_40, ++ MMAL_VIDEO_LEVEL_H263_45, ++ MMAL_VIDEO_LEVEL_H263_50, ++ MMAL_VIDEO_LEVEL_H263_60, ++ MMAL_VIDEO_LEVEL_H263_70, ++ MMAL_VIDEO_LEVEL_MP4V_0, ++ MMAL_VIDEO_LEVEL_MP4V_0b, ++ MMAL_VIDEO_LEVEL_MP4V_1, ++ MMAL_VIDEO_LEVEL_MP4V_2, ++ MMAL_VIDEO_LEVEL_MP4V_3, ++ MMAL_VIDEO_LEVEL_MP4V_4, ++ MMAL_VIDEO_LEVEL_MP4V_4a, ++ MMAL_VIDEO_LEVEL_MP4V_5, ++ MMAL_VIDEO_LEVEL_MP4V_6, ++ MMAL_VIDEO_LEVEL_H264_1, ++ MMAL_VIDEO_LEVEL_H264_1b, ++ MMAL_VIDEO_LEVEL_H264_11, ++ MMAL_VIDEO_LEVEL_H264_12, ++ MMAL_VIDEO_LEVEL_H264_13, ++ MMAL_VIDEO_LEVEL_H264_2, ++ MMAL_VIDEO_LEVEL_H264_21, ++ MMAL_VIDEO_LEVEL_H264_22, ++ MMAL_VIDEO_LEVEL_H264_3, ++ MMAL_VIDEO_LEVEL_H264_31, ++ MMAL_VIDEO_LEVEL_H264_32, ++ MMAL_VIDEO_LEVEL_H264_4, ++ MMAL_VIDEO_LEVEL_H264_41, ++ MMAL_VIDEO_LEVEL_H264_42, ++ MMAL_VIDEO_LEVEL_H264_5, ++ MMAL_VIDEO_LEVEL_H264_51, ++ MMAL_VIDEO_LEVEL_DUMMY = 0x7FFFFFFF ++}; ++ ++struct mmal_parameter_video_profile { ++ enum mmal_video_profile profile; ++ enum mmal_video_level level; ++}; ++ +/* video parameters */ + +enum mmal_parameter_video_type { @@ -14801,9 +15350,9 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-parameters.h lin + u32 num_effect_params; + u32 effect_parameter[MMAL_MAX_IMAGEFX_PARAMETERS]; +}; -diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-vchiq.c linux-3.13.6/drivers/media/platform/bcm2835/mmal-vchiq.c ---- linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-vchiq.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/media/platform/bcm2835/mmal-vchiq.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/media/platform/bcm2835/mmal-vchiq.c linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-vchiq.c +--- linux-3.13.6/drivers/media/platform/bcm2835/mmal-vchiq.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-vchiq.c 2014-03-11 16:54:57.000000000 +0100 @@ -0,0 +1,1916 @@ +/* + * Broadcom BM2835 V4L2 driver @@ -16133,7 +16682,7 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-vchiq.c linux-3. + memcpy(value, &rmsg->u.port_parameter_get_reply.value, + rmsg->u.port_parameter_get_reply.size); + -+ pr_info("%s:result:%d component:0x%x port:%d parameter:%d\n", __func__, ++ pr_debug("%s:result:%d component:0x%x port:%d parameter:%d\n", __func__, + ret, port->component->handle, port->handle, parameter_id); + +release_msg: @@ -16721,9 +17270,9 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-vchiq.c linux-3. + kfree(instance); + return -ENODEV; +} -diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-vchiq.h linux-3.13.6/drivers/media/platform/bcm2835/mmal-vchiq.h ---- linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-vchiq.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/media/platform/bcm2835/mmal-vchiq.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/media/platform/bcm2835/mmal-vchiq.h linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-vchiq.h +--- linux-3.13.6/drivers/media/platform/bcm2835/mmal-vchiq.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/media/platform/bcm2835/mmal-vchiq.h 2014-03-11 16:52:42.000000000 +0100 @@ -0,0 +1,178 @@ +/* + * Broadcom BM2835 V4L2 driver @@ -16903,9 +17452,9 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/bcm2835/mmal-vchiq.h linux-3. + struct mmal_buffer *buf); + +#endif /* MMAL_VCHIQ_H */ -diff -Nur linux-3.13.6.orig/drivers/media/platform/Kconfig linux-3.13.6/drivers/media/platform/Kconfig ---- linux-3.13.6.orig/drivers/media/platform/Kconfig 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/media/platform/Kconfig 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/media/platform/Kconfig linux-raspberry-pi/drivers/media/platform/Kconfig +--- linux-3.13.6/drivers/media/platform/Kconfig 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/media/platform/Kconfig 2014-03-11 16:54:57.000000000 +0100 @@ -124,6 +124,7 @@ source "drivers/media/platform/soc_camera/Kconfig" source "drivers/media/platform/exynos4-is/Kconfig" @@ -16914,9 +17463,9 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/Kconfig linux-3.13.6/drivers/ endif # V4L_PLATFORM_DRIVERS -diff -Nur linux-3.13.6.orig/drivers/media/platform/Makefile linux-3.13.6/drivers/media/platform/Makefile ---- linux-3.13.6.orig/drivers/media/platform/Makefile 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/media/platform/Makefile 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/media/platform/Makefile linux-raspberry-pi/drivers/media/platform/Makefile +--- linux-3.13.6/drivers/media/platform/Makefile 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/media/platform/Makefile 2014-03-11 16:54:57.000000000 +0100 @@ -54,4 +54,6 @@ obj-$(CONFIG_ARCH_OMAP) += omap/ @@ -16924,9 +17473,9 @@ diff -Nur linux-3.13.6.orig/drivers/media/platform/Makefile linux-3.13.6/drivers +obj-$(CONFIG_VIDEO_BCM2835) += bcm2835/ + ccflags-y += -I$(srctree)/drivers/media/i2c -diff -Nur linux-3.13.6.orig/drivers/media/usb/dvb-usb-v2/az6007.c linux-3.13.6/drivers/media/usb/dvb-usb-v2/az6007.c ---- linux-3.13.6.orig/drivers/media/usb/dvb-usb-v2/az6007.c 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/media/usb/dvb-usb-v2/az6007.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/media/usb/dvb-usb-v2/az6007.c linux-raspberry-pi/drivers/media/usb/dvb-usb-v2/az6007.c +--- linux-3.13.6/drivers/media/usb/dvb-usb-v2/az6007.c 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/media/usb/dvb-usb-v2/az6007.c 2014-03-11 16:52:43.000000000 +0100 @@ -68,6 +68,19 @@ .microcode_name = "dvb-usb-terratec-h7-drxk.fw", }; @@ -17014,9 +17563,9 @@ diff -Nur linux-3.13.6.orig/drivers/media/usb/dvb-usb-v2/az6007.c linux-3.13.6/d {0}, }; -diff -Nur linux-3.13.6.orig/drivers/media/usb/dvb-usb-v2/rtl28xxu.c linux-3.13.6/drivers/media/usb/dvb-usb-v2/rtl28xxu.c ---- linux-3.13.6.orig/drivers/media/usb/dvb-usb-v2/rtl28xxu.c 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/media/usb/dvb-usb-v2/rtl28xxu.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/media/usb/dvb-usb-v2/rtl28xxu.c linux-raspberry-pi/drivers/media/usb/dvb-usb-v2/rtl28xxu.c +--- linux-3.13.6/drivers/media/usb/dvb-usb-v2/rtl28xxu.c 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/media/usb/dvb-usb-v2/rtl28xxu.c 2014-03-11 16:54:57.000000000 +0100 @@ -1423,6 +1423,10 @@ &rtl2832u_props, "Compro VideoMate U620F", NULL) }, { DVB_USB_DEVICE(USB_VID_KWORLD_2, 0xd394, @@ -17028,9 +17577,9 @@ diff -Nur linux-3.13.6.orig/drivers/media/usb/dvb-usb-v2/rtl28xxu.c linux-3.13.6 { DVB_USB_DEVICE(USB_VID_LEADTEK, 0x6a03, &rtl2832u_props, "Leadtek WinFast DTV Dongle mini", NULL) }, { DVB_USB_DEVICE(USB_VID_GTEK, USB_PID_CPYTO_REDI_PC50A, -diff -Nur linux-3.13.6.orig/drivers/misc/Kconfig linux-3.13.6/drivers/misc/Kconfig ---- linux-3.13.6.orig/drivers/misc/Kconfig 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/misc/Kconfig 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/Kconfig linux-raspberry-pi/drivers/misc/Kconfig +--- linux-3.13.6/drivers/misc/Kconfig 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/Kconfig 2014-03-11 16:54:57.000000000 +0100 @@ -524,5 +524,6 @@ source "drivers/misc/altera-stapl/Kconfig" source "drivers/misc/mei/Kconfig" @@ -17038,18 +17587,18 @@ diff -Nur linux-3.13.6.orig/drivers/misc/Kconfig linux-3.13.6/drivers/misc/Kconf +source "drivers/misc/vc04_services/Kconfig" source "drivers/misc/mic/Kconfig" endmenu -diff -Nur linux-3.13.6.orig/drivers/misc/Makefile linux-3.13.6/drivers/misc/Makefile ---- linux-3.13.6.orig/drivers/misc/Makefile 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/misc/Makefile 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/Makefile linux-raspberry-pi/drivers/misc/Makefile +--- linux-3.13.6/drivers/misc/Makefile 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/Makefile 2014-03-11 16:54:57.000000000 +0100 @@ -52,4 +52,5 @@ obj-$(CONFIG_VMWARE_VMCI) += vmw_vmci/ obj-$(CONFIG_LATTICE_ECP3_CONFIG) += lattice-ecp3-config.o obj-$(CONFIG_SRAM) += sram.o +obj-$(CONFIG_BCM2708_VCHIQ) += vc04_services/ obj-y += mic/ -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/connections/connection.h linux-3.13.6/drivers/misc/vc04_services/interface/vchi/connections/connection.h ---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/connections/connection.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchi/connections/connection.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchi/connections/connection.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchi/connections/connection.h +--- linux-3.13.6/drivers/misc/vc04_services/interface/vchi/connections/connection.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchi/connections/connection.h 2014-03-11 16:52:43.000000000 +0100 @@ -0,0 +1,328 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -17379,9 +17928,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/connection +#endif /* CONNECTION_H_ */ + +/****************************** End of file **********************************/ -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h linux-3.13.6/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h ---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h +--- linux-3.13.6/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchi/message_drivers/message.h 2014-03-11 16:52:43.000000000 +0100 @@ -0,0 +1,204 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -17587,9 +18136,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/message_dr +#endif // _VCHI_MESSAGE_H_ + +/****************************** End of file ***********************************/ -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h ---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h +--- linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h 2014-03-11 16:52:43.000000000 +0100 @@ -0,0 +1,224 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -17815,9 +18364,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi_cfg.h +#endif /* VCHI_CFG_H_ */ + +/****************************** End of file **********************************/ -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h ---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h +--- linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchi/vchi_cfg_internal.h 2014-03-11 16:52:43.000000000 +0100 @@ -0,0 +1,71 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -17890,9 +18439,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi_cfg_i +//#define VCHI_RX_NANOLOCKS + +#endif /*VCHI_CFG_INTERNAL_H_*/ -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi_common.h linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_common.h ---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi_common.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_common.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_common.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchi/vchi_common.h +--- linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_common.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchi/vchi_common.h 2014-03-11 16:52:43.000000000 +0100 @@ -0,0 +1,163 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -18057,9 +18606,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi_commo + + +#endif // VCHI_COMMON_H_ -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi.h linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi.h ---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchi/vchi.h +--- linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchi/vchi.h 2014-03-11 16:52:43.000000000 +0100 @@ -0,0 +1,373 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -18434,9 +18983,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi.h lin +#endif /* VCHI_H_ */ + +/****************************** End of file **********************************/ -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi_mh.h linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_mh.h ---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi_mh.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_mh.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_mh.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchi/vchi_mh.h +--- linux-3.13.6/drivers/misc/vc04_services/interface/vchi/vchi_mh.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchi/vchi_mh.h 2014-03-11 16:52:43.000000000 +0100 @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -18480,9 +19029,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchi/vchi_mh.h +#define VCHI_MEM_HANDLE_INVALID 0 + +#endif -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c ---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c +--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c 2014-03-11 16:52:43.000000000 +0100 @@ -0,0 +1,561 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -19045,9 +19594,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq + + kfree(pagelist); +} -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h ---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h +--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_2835.h 2014-03-11 16:52:43.000000000 +0100 @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -19091,9 +19640,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq +#define VCHIQ_PLATFORM_FRAGMENTS_COUNT_IDX 1 + +#endif /* VCHIQ_2835_H */ -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c ---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c +--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c 2014-03-11 16:54:58.000000000 +0100 @@ -0,0 +1,2813 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -21908,9 +22457,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq +module_exit(vchiq_exit); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Broadcom Corporation"); -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h ---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h +--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.h 2014-03-11 16:52:43.000000000 +0100 @@ -0,0 +1,212 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -22124,9 +22673,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq + + +#endif /* VCHIQ_ARM_H */ -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h ---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h +--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_build_info.h 2014-03-11 16:52:43.000000000 +0100 @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -22165,9 +22714,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq +const char *vchiq_get_build_version(void); +const char *vchiq_get_build_time(void); +const char *vchiq_get_build_date(void); -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h ---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h +--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_cfg.h 2014-03-11 16:52:43.000000000 +0100 @@ -0,0 +1,60 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -22229,9 +22778,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq +#endif + +#endif /* VCHIQ_CFG_H */ -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c ---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c +--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.c 2014-03-11 16:52:43.000000000 +0100 @@ -0,0 +1,119 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -22352,9 +22901,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq + mutex_unlock(&g_connected_mutex); +} +EXPORT_SYMBOL(vchiq_add_connected_callback); -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h ---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h +--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_connected.h 2014-03-11 16:54:58.000000000 +0100 @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -22406,9 +22955,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq +void vchiq_call_connected_callbacks(void); + +#endif /* VCHIQ_CONNECTED_H */ -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c ---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c +--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c 2014-03-11 16:52:43.000000000 +0100 @@ -0,0 +1,3824 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -26234,9 +26783,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq + numBytes = 0; + } +} -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h ---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h +--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.h 2014-03-11 16:52:43.000000000 +0100 @@ -0,0 +1,706 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -26944,9 +27493,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq + size_t numBytes); + +#endif -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion ---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion +--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_genversion 2014-03-11 16:54:58.000000000 +0100 @@ -0,0 +1,87 @@ +#!/usr/bin/perl -w + @@ -27035,9 +27584,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq + return vchiq_build_time; +} +EOF -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h ---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h +--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq.h 2014-03-11 16:54:58.000000000 +0100 @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -27079,9 +27628,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq +#include "vchiq_util.h" + +#endif -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h ---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h +--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_if.h 2014-03-11 16:52:43.000000000 +0100 @@ -0,0 +1,188 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -27271,9 +27820,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq + short *peer_version); + +#endif /* VCHIQ_IF_H */ -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h ---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h +--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_ioctl.h 2014-03-11 16:52:43.000000000 +0100 @@ -0,0 +1,129 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -27404,9 +27953,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq +#define VCHIQ_IOC_MAX 15 + +#endif -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c ---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c +--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_kern_lib.c 2014-03-11 16:52:43.000000000 +0100 @@ -0,0 +1,456 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -27864,9 +28413,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq + + return status; +} -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h ---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h +--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_memdrv.h 2014-03-11 16:52:43.000000000 +0100 @@ -0,0 +1,71 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -27939,9 +28488,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq + const VCHIQ_PLATFORM_DATA_T * platform_data); + +#endif -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h ---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h +--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_pagelist.h 2014-03-11 16:52:43.000000000 +0100 @@ -0,0 +1,58 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -28001,9 +28550,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq +} FRAGMENTS_T; + +#endif /* VCHIQ_PAGELIST_H */ -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_proc.c linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_proc.c ---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_proc.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_proc.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_proc.c linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_proc.c +--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_proc.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_proc.c 2014-03-11 16:54:58.000000000 +0100 @@ -0,0 +1,253 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -28258,9 +28807,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq +} + +#endif -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c ---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c +--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_shim.c 2014-03-11 16:52:43.000000000 +0100 @@ -0,0 +1,828 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -29090,9 +29639,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq + return ret; +} +EXPORT_SYMBOL(vchi_service_release); -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c ---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c +--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.c 2014-03-11 16:52:43.000000000 +0100 @@ -0,0 +1,151 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -29245,9 +29794,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq + + return header; +} -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h ---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h +--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_util.h 2014-03-11 16:54:58.000000000 +0100 @@ -0,0 +1,81 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -29330,9 +29879,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq +extern VCHIQ_HEADER_T *vchiu_queue_pop(VCHIU_QUEUE_T *queue); + +#endif -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c ---- linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c +--- linux-3.13.6/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_version.c 2014-03-11 16:52:43.000000000 +0100 @@ -0,0 +1,59 @@ +/** + * Copyright (c) 2010-2012 Broadcom. All rights reserved. @@ -29393,9 +29942,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/interface/vchiq_arm/vchiq +{ + return vchiq_build_time; +} -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/Kconfig linux-3.13.6/drivers/misc/vc04_services/Kconfig ---- linux-3.13.6.orig/drivers/misc/vc04_services/Kconfig 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/Kconfig 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/Kconfig linux-raspberry-pi/drivers/misc/vc04_services/Kconfig +--- linux-3.13.6/drivers/misc/vc04_services/Kconfig 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/Kconfig 2014-03-11 16:54:58.000000000 +0100 @@ -0,0 +1,9 @@ +config BCM2708_VCHIQ + tristate "Videocore VCHIQ" @@ -29406,9 +29955,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/Kconfig linux-3.13.6/driv + BCM2708 family of products. + Defaults to Y when the Broadcom Videocore services + are included in the build, N otherwise. -diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/Makefile linux-3.13.6/drivers/misc/vc04_services/Makefile ---- linux-3.13.6.orig/drivers/misc/vc04_services/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/misc/vc04_services/Makefile 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/misc/vc04_services/Makefile linux-raspberry-pi/drivers/misc/vc04_services/Makefile +--- linux-3.13.6/drivers/misc/vc04_services/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/misc/vc04_services/Makefile 2014-03-11 16:54:58.000000000 +0100 @@ -0,0 +1,17 @@ +ifeq ($(CONFIG_MACH_BCM2708),y) + @@ -29427,9 +29976,9 @@ diff -Nur linux-3.13.6.orig/drivers/misc/vc04_services/Makefile linux-3.13.6/dri +EXTRA_CFLAGS += -DVCOS_VERIFY_BKPTS=1 -Idrivers/misc/vc04_services -DUSE_VCHIQ_ARM -D__VCCOREVER__=0x04000000 + +endif -diff -Nur linux-3.13.6.orig/drivers/mmc/card/block.c linux-3.13.6/drivers/mmc/card/block.c ---- linux-3.13.6.orig/drivers/mmc/card/block.c 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/mmc/card/block.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/mmc/card/block.c linux-raspberry-pi/drivers/mmc/card/block.c +--- linux-3.13.6/drivers/mmc/card/block.c 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/mmc/card/block.c 2014-03-11 16:54:58.000000000 +0100 @@ -1361,7 +1361,7 @@ brq->data.blocks = 1; } @@ -29439,9 +29988,9 @@ diff -Nur linux-3.13.6.orig/drivers/mmc/card/block.c linux-3.13.6/drivers/mmc/ca /* SPI multiblock writes terminate using a special * token, not a STOP_TRANSMISSION request. */ -diff -Nur linux-3.13.6.orig/drivers/mmc/core/sd.c linux-3.13.6/drivers/mmc/core/sd.c ---- linux-3.13.6.orig/drivers/mmc/core/sd.c 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/mmc/core/sd.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/mmc/core/sd.c linux-raspberry-pi/drivers/mmc/core/sd.c +--- linux-3.13.6/drivers/mmc/core/sd.c 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/mmc/core/sd.c 2014-03-11 16:54:58.000000000 +0100 @@ -15,6 +15,8 @@ #include <linux/slab.h> #include <linux/stat.h> @@ -29596,9 +30145,9 @@ diff -Nur linux-3.13.6.orig/drivers/mmc/core/sd.c linux-3.13.6/drivers/mmc/core/ return err; /* -diff -Nur linux-3.13.6.orig/drivers/mmc/host/Kconfig linux-3.13.6/drivers/mmc/host/Kconfig ---- linux-3.13.6.orig/drivers/mmc/host/Kconfig 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/mmc/host/Kconfig 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/mmc/host/Kconfig linux-raspberry-pi/drivers/mmc/host/Kconfig +--- linux-3.13.6/drivers/mmc/host/Kconfig 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/mmc/host/Kconfig 2014-03-11 16:54:58.000000000 +0100 @@ -260,6 +260,27 @@ If you have a controller with this interface, say Y or M here. @@ -29627,9 +30176,9 @@ diff -Nur linux-3.13.6.orig/drivers/mmc/host/Kconfig linux-3.13.6/drivers/mmc/ho config MMC_SDHCI_BCM2835 tristate "SDHCI platform support for the BCM2835 SD/MMC Controller" depends on ARCH_BCM2835 -diff -Nur linux-3.13.6.orig/drivers/mmc/host/Makefile linux-3.13.6/drivers/mmc/host/Makefile ---- linux-3.13.6.orig/drivers/mmc/host/Makefile 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/mmc/host/Makefile 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/mmc/host/Makefile linux-raspberry-pi/drivers/mmc/host/Makefile +--- linux-3.13.6/drivers/mmc/host/Makefile 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/mmc/host/Makefile 2014-03-11 16:54:58.000000000 +0100 @@ -15,6 +15,7 @@ obj-$(CONFIG_MMC_SDHCI_S3C) += sdhci-s3c.o obj-$(CONFIG_MMC_SDHCI_SIRF) += sdhci-sirf.o @@ -29638,9 +30187,9 @@ diff -Nur linux-3.13.6.orig/drivers/mmc/host/Makefile linux-3.13.6/drivers/mmc/h obj-$(CONFIG_MMC_WBSD) += wbsd.o obj-$(CONFIG_MMC_AU1X) += au1xmmc.o obj-$(CONFIG_MMC_OMAP) += omap.o -diff -Nur linux-3.13.6.orig/drivers/mmc/host/sdhci-bcm2708.c linux-3.13.6/drivers/mmc/host/sdhci-bcm2708.c ---- linux-3.13.6.orig/drivers/mmc/host/sdhci-bcm2708.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/mmc/host/sdhci-bcm2708.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/mmc/host/sdhci-bcm2708.c linux-raspberry-pi/drivers/mmc/host/sdhci-bcm2708.c +--- linux-3.13.6/drivers/mmc/host/sdhci-bcm2708.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/mmc/host/sdhci-bcm2708.c 2014-03-11 16:54:58.000000000 +0100 @@ -0,0 +1,1410 @@ +/* + * sdhci-bcm2708.c Support for SDHCI device on BCM2708 @@ -31052,9 +31601,9 @@ diff -Nur linux-3.13.6.orig/drivers/mmc/host/sdhci-bcm2708.c linux-3.13.6/driver +MODULE_PARM_DESC(extra_messages, "Enable more sdcard warning messages"); + + -diff -Nur linux-3.13.6.orig/drivers/mmc/host/sdhci.c linux-3.13.6/drivers/mmc/host/sdhci.c ---- linux-3.13.6.orig/drivers/mmc/host/sdhci.c 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/mmc/host/sdhci.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/mmc/host/sdhci.c linux-raspberry-pi/drivers/mmc/host/sdhci.c +--- linux-3.13.6/drivers/mmc/host/sdhci.c 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/mmc/host/sdhci.c 2014-03-11 16:54:58.000000000 +0100 @@ -28,6 +28,7 @@ #include <linux/mmc/mmc.h> #include <linux/mmc/host.h> @@ -31896,21 +32445,9 @@ diff -Nur linux-3.13.6.orig/drivers/mmc/host/sdhci.c linux-3.13.6/drivers/mmc/ho } sdhci_disable_card_detection(host); -diff -Nur linux-3.13.6.orig/drivers/mmc/host/sdhci-esdhc-imx.c linux-3.13.6/drivers/mmc/host/sdhci-esdhc-imx.c ---- linux-3.13.6.orig/drivers/mmc/host/sdhci-esdhc-imx.c 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/mmc/host/sdhci-esdhc-imx.c 2014-03-10 14:41:55.000000000 +0100 -@@ -112,6 +112,8 @@ - /* The IP has SDHCI_CAPABILITIES_1 register */ - #define ESDHC_FLAG_HAVE_CAP1 BIT(6) - -+bool enable_llm = 0; -+ - struct esdhc_soc_data { - u32 flags; - }; -diff -Nur linux-3.13.6.orig/drivers/mmc/host/sdhci.h linux-3.13.6/drivers/mmc/host/sdhci.h ---- linux-3.13.6.orig/drivers/mmc/host/sdhci.h 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/mmc/host/sdhci.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/mmc/host/sdhci.h linux-raspberry-pi/drivers/mmc/host/sdhci.h +--- linux-3.13.6/drivers/mmc/host/sdhci.h 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/mmc/host/sdhci.h 2014-03-11 16:54:58.000000000 +0100 @@ -290,6 +290,18 @@ void (*platform_reset_exit)(struct sdhci_host *host, u8 mask); int (*platform_execute_tuning)(struct sdhci_host *host, u32 opcode); @@ -31969,9 +32506,9 @@ diff -Nur linux-3.13.6.orig/drivers/mmc/host/sdhci.h linux-3.13.6/drivers/mmc/ho + + #endif /* __SDHCI_HW_H */ -diff -Nur linux-3.13.6.orig/drivers/net/usb/smsc95xx.c linux-3.13.6/drivers/net/usb/smsc95xx.c ---- linux-3.13.6.orig/drivers/net/usb/smsc95xx.c 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/net/usb/smsc95xx.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/net/usb/smsc95xx.c linux-raspberry-pi/drivers/net/usb/smsc95xx.c +--- linux-3.13.6/drivers/net/usb/smsc95xx.c 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/net/usb/smsc95xx.c 2014-03-11 16:52:52.000000000 +0100 @@ -61,6 +61,7 @@ #define SUSPEND_SUSPEND3 (0x08) #define SUSPEND_ALLMODES (SUSPEND_SUSPEND0 | SUSPEND_SUSPEND1 | \ @@ -32051,9 +32588,9 @@ diff -Nur linux-3.13.6.orig/drivers/net/usb/smsc95xx.c linux-3.13.6/drivers/net/ /* try reading mac address from EEPROM */ if (smsc95xx_read_eeprom(dev, EEPROM_MAC_OFFSET, ETH_ALEN, dev->net->dev_addr) == 0) { -diff -Nur linux-3.13.6.orig/drivers/spi/Kconfig linux-3.13.6/drivers/spi/Kconfig ---- linux-3.13.6.orig/drivers/spi/Kconfig 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/spi/Kconfig 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/spi/Kconfig linux-raspberry-pi/drivers/spi/Kconfig +--- linux-3.13.6/drivers/spi/Kconfig 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/spi/Kconfig 2014-03-11 16:55:26.000000000 +0100 @@ -85,6 +85,14 @@ is for the regular SPI controller. Slave mode operation is not also not supported. @@ -32069,9 +32606,9 @@ diff -Nur linux-3.13.6.orig/drivers/spi/Kconfig linux-3.13.6/drivers/spi/Kconfig config SPI_BFIN5XX tristate "SPI controller driver for ADI Blackfin5xx" depends on BLACKFIN && !BF60x -diff -Nur linux-3.13.6.orig/drivers/spi/Makefile linux-3.13.6/drivers/spi/Makefile ---- linux-3.13.6.orig/drivers/spi/Makefile 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/spi/Makefile 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/spi/Makefile linux-raspberry-pi/drivers/spi/Makefile +--- linux-3.13.6/drivers/spi/Makefile 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/spi/Makefile 2014-03-11 16:55:26.000000000 +0100 @@ -18,6 +18,7 @@ obj-$(CONFIG_SPI_BCM63XX) += spi-bcm63xx.o obj-$(CONFIG_SPI_BFIN5XX) += spi-bfin5xx.o @@ -32080,9 +32617,9 @@ diff -Nur linux-3.13.6.orig/drivers/spi/Makefile linux-3.13.6/drivers/spi/Makefi obj-$(CONFIG_SPI_BFIN_SPORT) += spi-bfin-sport.o obj-$(CONFIG_SPI_BITBANG) += spi-bitbang.o obj-$(CONFIG_SPI_BUTTERFLY) += spi-butterfly.o -diff -Nur linux-3.13.6.orig/drivers/spi/spi-bcm2708.c linux-3.13.6/drivers/spi/spi-bcm2708.c ---- linux-3.13.6.orig/drivers/spi/spi-bcm2708.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/spi/spi-bcm2708.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/spi/spi-bcm2708.c linux-raspberry-pi/drivers/spi/spi-bcm2708.c +--- linux-3.13.6/drivers/spi/spi-bcm2708.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/spi/spi-bcm2708.c 2014-03-11 16:55:26.000000000 +0100 @@ -0,0 +1,626 @@ +/* + * Driver for Broadcom BCM2708 SPI Controllers @@ -32710,9 +33247,9 @@ diff -Nur linux-3.13.6.orig/drivers/spi/spi-bcm2708.c linux-3.13.6/drivers/spi/s +MODULE_AUTHOR("Chris Boot <bootc@bootc.net>"); +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS("platform:" DRV_NAME); -diff -Nur linux-3.13.6.orig/drivers/staging/media/lirc/Kconfig linux-3.13.6/drivers/staging/media/lirc/Kconfig ---- linux-3.13.6.orig/drivers/staging/media/lirc/Kconfig 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/staging/media/lirc/Kconfig 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/staging/media/lirc/Kconfig linux-raspberry-pi/drivers/staging/media/lirc/Kconfig +--- linux-3.13.6/drivers/staging/media/lirc/Kconfig 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/staging/media/lirc/Kconfig 2014-03-11 16:53:00.000000000 +0100 @@ -38,6 +38,12 @@ help Driver for Homebrew Parallel Port Receivers @@ -32726,9 +33263,9 @@ diff -Nur linux-3.13.6.orig/drivers/staging/media/lirc/Kconfig linux-3.13.6/driv config LIRC_SASEM tristate "Sasem USB IR Remote" depends on LIRC && USB -diff -Nur linux-3.13.6.orig/drivers/staging/media/lirc/lirc_rpi.c linux-3.13.6/drivers/staging/media/lirc/lirc_rpi.c ---- linux-3.13.6.orig/drivers/staging/media/lirc/lirc_rpi.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/staging/media/lirc/lirc_rpi.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/staging/media/lirc/lirc_rpi.c linux-raspberry-pi/drivers/staging/media/lirc/lirc_rpi.c +--- linux-3.13.6/drivers/staging/media/lirc/lirc_rpi.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/staging/media/lirc/lirc_rpi.c 2014-03-11 16:53:00.000000000 +0100 @@ -0,0 +1,693 @@ +/* + * lirc_rpi.c @@ -33423,9 +33960,9 @@ diff -Nur linux-3.13.6.orig/drivers/staging/media/lirc/lirc_rpi.c linux-3.13.6/d + +module_param(debug, bool, S_IRUGO | S_IWUSR); +MODULE_PARM_DESC(debug, "Enable debugging messages"); -diff -Nur linux-3.13.6.orig/drivers/staging/media/lirc/Makefile linux-3.13.6/drivers/staging/media/lirc/Makefile ---- linux-3.13.6.orig/drivers/staging/media/lirc/Makefile 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/staging/media/lirc/Makefile 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/staging/media/lirc/Makefile linux-raspberry-pi/drivers/staging/media/lirc/Makefile +--- linux-3.13.6/drivers/staging/media/lirc/Makefile 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/staging/media/lirc/Makefile 2014-03-11 16:53:00.000000000 +0100 @@ -7,6 +7,7 @@ obj-$(CONFIG_LIRC_IGORPLUGUSB) += lirc_igorplugusb.o obj-$(CONFIG_LIRC_IMON) += lirc_imon.o @@ -33434,9 +33971,9 @@ diff -Nur linux-3.13.6.orig/drivers/staging/media/lirc/Makefile linux-3.13.6/dri obj-$(CONFIG_LIRC_SASEM) += lirc_sasem.o obj-$(CONFIG_LIRC_SERIAL) += lirc_serial.o obj-$(CONFIG_LIRC_SIR) += lirc_sir.o -diff -Nur linux-3.13.6.orig/drivers/thermal/bcm2835-thermal.c linux-3.13.6/drivers/thermal/bcm2835-thermal.c ---- linux-3.13.6.orig/drivers/thermal/bcm2835-thermal.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/thermal/bcm2835-thermal.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/thermal/bcm2835-thermal.c linux-raspberry-pi/drivers/thermal/bcm2835-thermal.c +--- linux-3.13.6/drivers/thermal/bcm2835-thermal.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/thermal/bcm2835-thermal.c 2014-03-11 16:53:09.000000000 +0100 @@ -0,0 +1,184 @@ +/***************************************************************************** +* Copyright 2011 Broadcom Corporation. All rights reserved. @@ -33622,9 +34159,9 @@ diff -Nur linux-3.13.6.orig/drivers/thermal/bcm2835-thermal.c linux-3.13.6/drive +MODULE_DESCRIPTION("Thermal driver for bcm2835 chip"); + +module_platform_driver(bcm2835_thermal_driver); -diff -Nur linux-3.13.6.orig/drivers/thermal/Kconfig linux-3.13.6/drivers/thermal/Kconfig ---- linux-3.13.6.orig/drivers/thermal/Kconfig 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/thermal/Kconfig 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/thermal/Kconfig linux-raspberry-pi/drivers/thermal/Kconfig +--- linux-3.13.6/drivers/thermal/Kconfig 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/thermal/Kconfig 2014-03-11 16:55:36.000000000 +0100 @@ -181,6 +181,12 @@ enforce idle time which results in more package C-state residency. The user interface is exposed via generic thermal framework. @@ -33638,9 +34175,9 @@ diff -Nur linux-3.13.6.orig/drivers/thermal/Kconfig linux-3.13.6/drivers/thermal config X86_PKG_TEMP_THERMAL tristate "X86 package temperature thermal driver" depends on X86_THERMAL_VECTOR -diff -Nur linux-3.13.6.orig/drivers/thermal/Makefile linux-3.13.6/drivers/thermal/Makefile ---- linux-3.13.6.orig/drivers/thermal/Makefile 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/thermal/Makefile 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/thermal/Makefile linux-raspberry-pi/drivers/thermal/Makefile +--- linux-3.13.6/drivers/thermal/Makefile 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/thermal/Makefile 2014-03-11 16:55:36.000000000 +0100 @@ -27,5 +27,6 @@ obj-$(CONFIG_IMX_THERMAL) += imx_thermal.o obj-$(CONFIG_DB8500_CPUFREQ_COOLING) += db8500_cpufreq_cooling.o @@ -33648,9 +34185,9 @@ diff -Nur linux-3.13.6.orig/drivers/thermal/Makefile linux-3.13.6/drivers/therma +obj-$(CONFIG_THERMAL_BCM2835) += bcm2835-thermal.o obj-$(CONFIG_X86_PKG_TEMP_THERMAL) += x86_pkg_temp_thermal.o obj-$(CONFIG_TI_SOC_THERMAL) += ti-soc-thermal/ -diff -Nur linux-3.13.6.orig/drivers/tty/serial/amba-pl011.c linux-3.13.6/drivers/tty/serial/amba-pl011.c ---- linux-3.13.6.orig/drivers/tty/serial/amba-pl011.c 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/tty/serial/amba-pl011.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/tty/serial/amba-pl011.c linux-raspberry-pi/drivers/tty/serial/amba-pl011.c +--- linux-3.13.6/drivers/tty/serial/amba-pl011.c 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/tty/serial/amba-pl011.c 2014-03-11 16:55:36.000000000 +0100 @@ -84,7 +84,7 @@ static unsigned int get_fifosize_arm(struct amba_device *dev) @@ -33660,9 +34197,9 @@ diff -Nur linux-3.13.6.orig/drivers/tty/serial/amba-pl011.c linux-3.13.6/drivers } static struct vendor_data vendor_arm = { -diff -Nur linux-3.13.6.orig/drivers/usb/core/generic.c linux-3.13.6/drivers/usb/core/generic.c ---- linux-3.13.6.orig/drivers/usb/core/generic.c 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/usb/core/generic.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/core/generic.c linux-raspberry-pi/drivers/usb/core/generic.c +--- linux-3.13.6/drivers/usb/core/generic.c 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/core/generic.c 2014-03-11 16:53:09.000000000 +0100 @@ -152,6 +152,7 @@ dev_warn(&udev->dev, "no configuration chosen from %d choice%s\n", @@ -33671,9 +34208,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/core/generic.c linux-3.13.6/drivers/usb/ } return i; } -diff -Nur linux-3.13.6.orig/drivers/usb/core/message.c linux-3.13.6/drivers/usb/core/message.c ---- linux-3.13.6.orig/drivers/usb/core/message.c 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/usb/core/message.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/core/message.c linux-raspberry-pi/drivers/usb/core/message.c +--- linux-3.13.6/drivers/usb/core/message.c 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/core/message.c 2014-03-11 16:55:37.000000000 +0100 @@ -1889,6 +1889,85 @@ if (cp->string == NULL && !(dev->quirks & USB_QUIRK_CONFIG_INTF_STRINGS)) @@ -33760,9 +34297,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/core/message.c linux-3.13.6/drivers/usb/ /* Now that the interfaces are installed, re-enable LPM. */ usb_unlocked_enable_lpm(dev); -diff -Nur linux-3.13.6.orig/drivers/usb/core/otg_whitelist.h linux-3.13.6/drivers/usb/core/otg_whitelist.h ---- linux-3.13.6.orig/drivers/usb/core/otg_whitelist.h 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/usb/core/otg_whitelist.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/core/otg_whitelist.h linux-raspberry-pi/drivers/usb/core/otg_whitelist.h +--- linux-3.13.6/drivers/usb/core/otg_whitelist.h 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/core/otg_whitelist.h 2014-03-11 16:55:37.000000000 +0100 @@ -19,33 +19,82 @@ static struct usb_device_id whitelist_table [] = { @@ -33978,9 +34515,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/core/otg_whitelist.h linux-3.13.6/driver #endif } -diff -Nur linux-3.13.6.orig/drivers/usb/gadget/file_storage.c linux-3.13.6/drivers/usb/gadget/file_storage.c ---- linux-3.13.6.orig/drivers/usb/gadget/file_storage.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/gadget/file_storage.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/gadget/file_storage.c linux-raspberry-pi/drivers/usb/gadget/file_storage.c +--- linux-3.13.6/drivers/usb/gadget/file_storage.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/gadget/file_storage.c 2014-03-11 16:53:10.000000000 +0100 @@ -0,0 +1,3676 @@ +/* + * file_storage.c -- File-backed USB Storage Gadget, for USB development @@ -37658,9 +38195,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/gadget/file_storage.c linux-3.13.6/drive + kref_put(&fsg->ref, fsg_release); +} +module_exit(fsg_cleanup); -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/changes.txt linux-3.13.6/drivers/usb/host/dwc_common_port/changes.txt ---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/changes.txt 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_common_port/changes.txt 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/changes.txt linux-raspberry-pi/drivers/usb/host/dwc_common_port/changes.txt +--- linux-3.13.6/drivers/usb/host/dwc_common_port/changes.txt 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/changes.txt 2014-03-11 16:53:12.000000000 +0100 @@ -0,0 +1,174 @@ + +dwc_read_reg32() and friends now take an additional parameter, a pointer to an @@ -37836,9 +38373,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/changes.txt linux-3 +A DWC_LIBMODULE #define has also been added. If this is not defined, then the +module code in dwc_common_linux.c is not compiled in. This allows linking the +library code directly into a driver module, instead of as a standalone module. -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/doc/doxygen.cfg linux-3.13.6/drivers/usb/host/dwc_common_port/doc/doxygen.cfg ---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/doc/doxygen.cfg 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_common_port/doc/doxygen.cfg 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/doc/doxygen.cfg linux-raspberry-pi/drivers/usb/host/dwc_common_port/doc/doxygen.cfg +--- linux-3.13.6/drivers/usb/host/dwc_common_port/doc/doxygen.cfg 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/doc/doxygen.cfg 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,270 @@ +# Doxyfile 1.4.5 + @@ -38110,9 +38647,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/doc/doxygen.cfg lin +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_cc.c linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_cc.c ---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_cc.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_cc.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_cc.c linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_cc.c +--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_cc.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_cc.c 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,532 @@ +/* ========================================================================= + * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_cc.c $ @@ -38646,9 +39183,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_cc.c linux-3.13 +} + +#endif /* DWC_CCLIB */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_cc.h linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_cc.h ---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_cc.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_cc.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_cc.h linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_cc.h +--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_cc.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_cc.h 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,224 @@ +/* ========================================================================= + * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_cc.h $ @@ -38874,9 +39411,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_cc.h linux-3.13 +#endif + +#endif /* _DWC_CC_H_ */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c ---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c +--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c 2014-03-11 16:53:12.000000000 +0100 @@ -0,0 +1,1308 @@ +#include "dwc_os.h" +#include "dwc_list.h" @@ -40186,9 +40723,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_common_fbsd.c l +{ + return wq->pending; +} -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_common_linux.c linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_common_linux.c ---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_common_linux.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_common_linux.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_common_linux.c linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_common_linux.c +--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_common_linux.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_common_linux.c 2014-03-11 16:53:12.000000000 +0100 @@ -0,0 +1,1431 @@ +#include <linux/kernel.h> +#include <linux/init.h> @@ -41621,9 +42158,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_common_linux.c +MODULE_LICENSE ("GPL"); + +#endif /* DWC_LIBMODULE */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c ---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c +--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c 2014-03-11 16:53:12.000000000 +0100 @@ -0,0 +1,1275 @@ +#include "dwc_os.h" +#include "dwc_list.h" @@ -42900,9 +43437,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_common_nbsd.c l +{ + return wq->pending; +} -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_crypto.c linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_crypto.c ---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_crypto.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_crypto.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_crypto.c linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_crypto.c +--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_crypto.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_crypto.c 2014-03-11 16:53:12.000000000 +0100 @@ -0,0 +1,308 @@ +/* ========================================================================= + * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_crypto.c $ @@ -43212,9 +43749,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_crypto.c linux- +} + +#endif /* DWC_CRYPTOLIB */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_crypto.h linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_crypto.h ---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_crypto.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_crypto.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_crypto.h linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_crypto.h +--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_crypto.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_crypto.h 2014-03-11 16:53:12.000000000 +0100 @@ -0,0 +1,111 @@ +/* ========================================================================= + * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_crypto.h $ @@ -43327,9 +43864,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_crypto.h linux- +#endif + +#endif /* _DWC_CRYPTO_H_ */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_dh.c linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_dh.c ---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_dh.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_dh.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_dh.c linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_dh.c +--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_dh.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_dh.c 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,291 @@ +/* ========================================================================= + * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_dh.c $ @@ -43622,9 +44159,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_dh.c linux-3.13 +#endif /* !CONFIG_MACH_IPMATE */ + +#endif /* DWC_CRYPTOLIB */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_dh.h linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_dh.h ---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_dh.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_dh.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_dh.h linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_dh.h +--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_dh.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_dh.h 2014-03-11 16:53:12.000000000 +0100 @@ -0,0 +1,106 @@ +/* ========================================================================= + * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_dh.h $ @@ -43732,9 +44269,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_dh.h linux-3.13 +#endif + +#endif /* _DWC_DH_H_ */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_list.h linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_list.h ---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_list.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_list.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_list.h linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_list.h +--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_list.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_list.h 2014-03-11 16:53:12.000000000 +0100 @@ -0,0 +1,594 @@ +/* $OpenBSD: queue.h,v 1.26 2004/05/04 16:59:32 grange Exp $ */ +/* $NetBSD: queue.h,v 1.11 1996/05/16 05:17:14 mycroft Exp $ */ @@ -44330,9 +44867,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_list.h linux-3. +#endif + +#endif /* _DWC_LIST_H_ */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_mem.c linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_mem.c ---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_mem.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_mem.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_mem.c linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_mem.c +--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_mem.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_mem.c 2014-03-11 16:53:12.000000000 +0100 @@ -0,0 +1,245 @@ +/* Memory Debugging */ +#ifdef DWC_DEBUG_MEMORY @@ -44579,9 +45116,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_mem.c linux-3.1 +} + +#endif /* DWC_DEBUG_MEMORY */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_modpow.c linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_modpow.c ---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_modpow.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_modpow.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_modpow.c linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_modpow.c +--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_modpow.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_modpow.c 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,636 @@ +/* Bignum routines adapted from PUTTY sources. PuTTY copyright notice follows. + * @@ -45219,9 +45756,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_modpow.c linux- +#endif /* CONFIG_MACH_IPMATE */ + +#endif /*DWC_CRYPTOLIB */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_modpow.h linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_modpow.h ---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_modpow.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_modpow.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_modpow.h linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_modpow.h +--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_modpow.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_modpow.h 2014-03-11 16:53:12.000000000 +0100 @@ -0,0 +1,34 @@ +/* + * dwc_modpow.h @@ -45257,9 +45794,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_modpow.h linux- +#endif + +#endif /* _LINUX_BIGNUM_H */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_notifier.c linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_notifier.c ---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_notifier.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_notifier.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_notifier.c linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_notifier.c +--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_notifier.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_notifier.c 2014-03-11 16:53:12.000000000 +0100 @@ -0,0 +1,319 @@ +#ifdef DWC_NOTIFYLIB + @@ -45580,9 +46117,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_notifier.c linu +} + +#endif /* DWC_NOTIFYLIB */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_notifier.h linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_notifier.h ---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_notifier.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_notifier.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_notifier.h linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_notifier.h +--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_notifier.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_notifier.h 2014-03-11 16:53:12.000000000 +0100 @@ -0,0 +1,122 @@ + +#ifndef __DWC_NOTIFIER_H__ @@ -45706,9 +46243,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_notifier.h linu +#endif + +#endif /* __DWC_NOTIFIER_H__ */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_os.h linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_os.h ---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_os.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_os.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_os.h linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_os.h +--- linux-3.13.6/drivers/usb/host/dwc_common_port/dwc_os.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/dwc_os.h 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,1262 @@ +/* ========================================================================= + * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_os.h $ @@ -46972,9 +47509,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/dwc_os.h linux-3.13 +#endif + +#endif /* _DWC_OS_H_ */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/Makefile linux-3.13.6/drivers/usb/host/dwc_common_port/Makefile ---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_common_port/Makefile 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/Makefile linux-raspberry-pi/drivers/usb/host/dwc_common_port/Makefile +--- linux-3.13.6/drivers/usb/host/dwc_common_port/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/Makefile 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,58 @@ +# +# Makefile for DWC_common library @@ -47034,9 +47571,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/Makefile linux-3.13 + +clean: + rm -rf *.o *.ko .*.cmd *.mod.c .*.o.d .*.o.tmp modules.order Module.markers Module.symvers .tmp_versions/ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/Makefile.fbsd linux-3.13.6/drivers/usb/host/dwc_common_port/Makefile.fbsd ---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/Makefile.fbsd 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_common_port/Makefile.fbsd 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/Makefile.fbsd linux-raspberry-pi/drivers/usb/host/dwc_common_port/Makefile.fbsd +--- linux-3.13.6/drivers/usb/host/dwc_common_port/Makefile.fbsd 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/Makefile.fbsd 2014-03-11 16:53:12.000000000 +0100 @@ -0,0 +1,17 @@ +CFLAGS += -I/sys/i386/compile/GENERIC -I/sys/i386/include -I/usr/include +CFLAGS += -DDWC_FREEBSD @@ -47055,9 +47592,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/Makefile.fbsd linux + dwc_common_fbsd.c dwc_mem.c + +.include <bsd.kmod.mk> -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/Makefile.linux linux-3.13.6/drivers/usb/host/dwc_common_port/Makefile.linux ---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/Makefile.linux 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_common_port/Makefile.linux 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/Makefile.linux linux-raspberry-pi/drivers/usb/host/dwc_common_port/Makefile.linux +--- linux-3.13.6/drivers/usb/host/dwc_common_port/Makefile.linux 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/Makefile.linux 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,49 @@ +# +# Makefile for DWC_common library @@ -47108,9 +47645,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/Makefile.linux linu + +clean: + rm -rf *.o *.ko .*.cmd *.mod.c .*.o.d .*.o.tmp modules.order Module.markers Module.symvers .tmp_versions/ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/usb.h linux-3.13.6/drivers/usb/host/dwc_common_port/usb.h ---- linux-3.13.6.orig/drivers/usb/host/dwc_common_port/usb.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_common_port/usb.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_common_port/usb.h linux-raspberry-pi/drivers/usb/host/dwc_common_port/usb.h +--- linux-3.13.6/drivers/usb/host/dwc_common_port/usb.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_common_port/usb.h 2014-03-11 16:53:12.000000000 +0100 @@ -0,0 +1,946 @@ +/* + * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -48058,9 +48595,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_common_port/usb.h linux-3.13.6/ +#endif + +#endif /* _USB_H_ */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/doc/doxygen.cfg linux-3.13.6/drivers/usb/host/dwc_otg/doc/doxygen.cfg ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/doc/doxygen.cfg 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/doc/doxygen.cfg 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/doc/doxygen.cfg linux-raspberry-pi/drivers/usb/host/dwc_otg/doc/doxygen.cfg +--- linux-3.13.6/drivers/usb/host/dwc_otg/doc/doxygen.cfg 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/doc/doxygen.cfg 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,224 @@ +# Doxyfile 1.3.9.1 + @@ -48286,9 +48823,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/doc/doxygen.cfg linux-3.13. +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dummy_audio.c linux-3.13.6/drivers/usb/host/dwc_otg/dummy_audio.c ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dummy_audio.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dummy_audio.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dummy_audio.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dummy_audio.c +--- linux-3.13.6/drivers/usb/host/dwc_otg/dummy_audio.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dummy_audio.c 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,1575 @@ +/* + * zero.c -- Gadget Zero, for USB development @@ -49865,9 +50402,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dummy_audio.c linux-3.13.6/ + remove_proc_entry("isoc_test", NULL); +} +module_exit (cleanup); -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_cfi_common.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_cfi_common.h ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_cfi_common.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_cfi_common.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_cfi_common.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_cfi_common.h +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_cfi_common.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_cfi_common.h 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,142 @@ +/* ========================================================================== + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, @@ -50011,9 +50548,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_cfi_common.h linux-3.13 +typedef struct cfi_string cfi_string_t; + +#endif -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_adp.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_adp.c ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_adp.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_adp.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_adp.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_adp.c +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_adp.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_adp.c 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,854 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_adp.c $ @@ -50869,9 +51406,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_adp.c linux-3.13.6/ +#endif + return 1; +} -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_adp.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_adp.h ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_adp.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_adp.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_adp.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_adp.h +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_adp.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_adp.h 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,80 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_adp.h $ @@ -50953,9 +51490,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_adp.h linux-3.13.6/ +extern int32_t dwc_otg_adp_handle_srp_intr(dwc_otg_core_if_t * core_if); + +#endif //__DWC_OTG_ADP_H__ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_attr.c ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_attr.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_attr.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_attr.c +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_attr.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_attr.c 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,1210 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_attr.c $ @@ -52167,9 +52704,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_attr.c linux-3.13.6 + device_remove_file(&dev->dev, &dev_attr_sleep_status); +#endif +} -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_attr.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_attr.h ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_attr.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_attr.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_attr.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_attr.h +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_attr.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_attr.h 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,89 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_attr.h $ @@ -52260,9 +52797,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_attr.h linux-3.13.6 +#endif + ); +#endif -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cfi.c ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cfi.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cfi.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_cfi.c +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cfi.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_cfi.c 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,1876 @@ +/* ========================================================================== + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, @@ -54140,9 +54677,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cfi.c linux-3.13.6/ +} + +#endif //DWC_UTE_CFI -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cfi.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cfi.h ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cfi.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cfi.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cfi.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_cfi.h +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cfi.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_cfi.h 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,320 @@ +/* ========================================================================== + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, @@ -54464,9 +55001,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cfi.h linux-3.13.6/ +int cfi_setup(struct dwc_otg_pcd *pcd, struct cfi_usb_ctrlrequest *ctrl); + +#endif /* (__DWC_OTG_CFI_H__) */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cil.c ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cil.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cil.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_cil.c +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cil.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_cil.c 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,7151 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_cil.c $ @@ -61619,9 +62156,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cil.c linux-3.13.6/ + dwc_otg_pcd_start_srp_timer(core_if); + return; +} -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cil.h ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cil.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cil.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_cil.h +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cil.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_cil.h 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,1464 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_cil.h $ @@ -63087,9 +63624,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cil.h linux-3.13.6/ +////////////////////////////////////////////////////////////////////// + +#endif -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,1588 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_cil_intr.c $ @@ -64679,9 +65216,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_cil_intr.c linux-3. + + return retval; +} -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_core_if.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_core_if.h ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_core_if.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_core_if.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_core_if.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_core_if.h +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_core_if.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_core_if.h 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,705 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_core_if.h $ @@ -65388,9 +65925,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_core_if.h linux-3.1 +/** @} */ + +#endif /* __DWC_CORE_IF_H__ */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_dbg.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_dbg.h ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_dbg.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_dbg.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_dbg.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_dbg.h +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_dbg.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_dbg.h 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,117 @@ +/* ========================================================================== + * @@ -65509,9 +66046,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_dbg.h linux-3.13.6/ + +#endif /*DEBUG*/ +#endif -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_driver.c ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_driver.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_driver.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_driver.c +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_driver.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_driver.c 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,1742 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_driver.c $ @@ -67255,9 +67792,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_driver.c linux-3.13 + </td></tr> + +*/ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_driver.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_driver.h ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_driver.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_driver.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_driver.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_driver.h +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_driver.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_driver.h 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,86 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_driver.h $ @@ -67345,9 +67882,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_driver.h linux-3.13 +#endif + +#endif -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd.c ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_hcd.c +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_hcd.c 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,3685 @@ + +/* ========================================================================== @@ -71034,9 +71571,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd.c linux-3.13.6/ +} + +#endif /* DWC_DEVICE_ONLY */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,1132 @@ +/*========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd_ddma.c $ @@ -72170,9 +72707,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_ddma.c linux-3. +} + +#endif /* DWC_DEVICE_ONLY */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd.h ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_hcd.h +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_hcd.h 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,851 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd.h $ @@ -73025,9 +73562,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd.h linux-3.13.6/ +#endif +#endif +#endif /* DWC_DEVICE_ONLY */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,417 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd_if.h $ @@ -73446,9 +73983,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_if.h linux-3.13 + +#endif /* __DWC_HCD_IF_H__ */ +#endif /* DWC_DEVICE_ONLY */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,2741 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd_intr.c $ @@ -76191,9 +76728,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c linux-3. + return retval; +} +#endif /* DWC_DEVICE_ONLY */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,972 @@ + +/* ========================================================================== @@ -77167,9 +77704,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c linux-3 +} + +#endif /* DWC_DEVICE_ONLY */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,959 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd_queue.c $ @@ -78130,9 +78667,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c linux-3 +} + +#endif /* DWC_DEVICE_ONLY */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,113 @@ +#include "dwc_otg_regs.h" +#include "dwc_otg_dbg.h" @@ -78247,9 +78784,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.c linux-3. + + return; +} -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h 2014-03-11 16:53:12.000000000 +0100 @@ -0,0 +1,48 @@ +#ifndef __DWC_OTG_MPHI_FIX_H__ +#define __DWC_OTG_MPHI_FIX_H__ @@ -78299,9 +78836,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_mphi_fix.h linux-3. +extern bool fiq_fix_enable, nak_holdoff_enable, fiq_split_enable; + +#endif -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,188 @@ +#ifndef _DWC_OS_DEP_H_ +#define _DWC_OS_DEP_H_ @@ -78491,9 +79028,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_os_dep.h linux-3.13 + + +#endif /* _DWC_OS_DEP_H_ */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd.c ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_pcd.c +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_pcd.c 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,2708 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd.c $ @@ -81203,9 +81740,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd.c linux-3.13.6/ +} + +#endif /* DWC_HOST_ONLY */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd.h ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_pcd.h +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_pcd.h 2014-03-11 16:53:12.000000000 +0100 @@ -0,0 +1,266 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd.h $ @@ -81473,9 +82010,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd.h linux-3.13.6/ +extern void do_test_mode(void *data); +#endif +#endif /* DWC_HOST_ONLY */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h 2014-03-11 16:53:12.000000000 +0100 @@ -0,0 +1,360 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd_if.h $ @@ -81837,9 +82374,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd_if.h linux-3.13 +#endif /* __DWC_PCD_IF_H__ */ + +#endif /* DWC_HOST_ONLY */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,5147 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd_intr.c $ @@ -86988,9 +87525,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd_intr.c linux-3. +} + +#endif /* DWC_HOST_ONLY */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,1358 @@ + /* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd_linux.c $ @@ -88350,9 +88887,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_pcd_linux.c linux-3 +EXPORT_SYMBOL(usb_gadget_unregister_driver); + +#endif /* DWC_HOST_ONLY */ -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_regs.h ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_regs.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_regs.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_regs.h +--- linux-3.13.6/drivers/usb/host/dwc_otg/dwc_otg_regs.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/dwc_otg_regs.h 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,2550 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_regs.h $ @@ -90904,9 +91441,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/dwc_otg_regs.h linux-3.13.6 +} gpwrdn_data_t; + +#endif -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/Makefile linux-3.13.6/drivers/usb/host/dwc_otg/Makefile ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/Makefile 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/Makefile linux-raspberry-pi/drivers/usb/host/dwc_otg/Makefile +--- linux-3.13.6/drivers/usb/host/dwc_otg/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/Makefile 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,81 @@ +# +# Makefile for DWC_otg Highspeed USB controller driver @@ -90989,9 +91526,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/Makefile linux-3.13.6/drive + rm -rf *.o *.ko .*cmd *.mod.c .tmp_versions Module.symvers + +endif -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm linux-3.13.6/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm linux-raspberry-pi/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm +--- linux-3.13.6/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,337 @@ +package dwc_otg_test; + @@ -91330,9 +91867,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/test/dwc_otg_test.pm linux- +); + +1; -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/test/Makefile linux-3.13.6/drivers/usb/host/dwc_otg/test/Makefile ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/test/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/test/Makefile 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/test/Makefile linux-raspberry-pi/drivers/usb/host/dwc_otg/test/Makefile +--- linux-3.13.6/drivers/usb/host/dwc_otg/test/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/test/Makefile 2014-03-11 16:53:12.000000000 +0100 @@ -0,0 +1,16 @@ + +PERL=/usr/bin/perl @@ -91350,9 +91887,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/test/Makefile linux-3.13.6/ + else echo "=======> $$test, FAILED" ; \ + fi \ + done -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/test/test_mod_param.pl linux-3.13.6/drivers/usb/host/dwc_otg/test/test_mod_param.pl ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/test/test_mod_param.pl 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/test/test_mod_param.pl 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/test/test_mod_param.pl linux-raspberry-pi/drivers/usb/host/dwc_otg/test/test_mod_param.pl +--- linux-3.13.6/drivers/usb/host/dwc_otg/test/test_mod_param.pl 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/test/test_mod_param.pl 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,133 @@ +#!/usr/bin/perl -w +# @@ -91487,9 +92024,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/test/test_mod_param.pl linu + +test_main(); +0; -diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/test/test_sysfs.pl linux-3.13.6/drivers/usb/host/dwc_otg/test/test_sysfs.pl ---- linux-3.13.6.orig/drivers/usb/host/dwc_otg/test/test_sysfs.pl 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/dwc_otg/test/test_sysfs.pl 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/dwc_otg/test/test_sysfs.pl linux-raspberry-pi/drivers/usb/host/dwc_otg/test/test_sysfs.pl +--- linux-3.13.6/drivers/usb/host/dwc_otg/test/test_sysfs.pl 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/dwc_otg/test/test_sysfs.pl 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,193 @@ +#!/usr/bin/perl -w +# @@ -91684,9 +92221,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/dwc_otg/test/test_sysfs.pl linux-3. + +test_main(); +0; -diff -Nur linux-3.13.6.orig/drivers/usb/host/Kconfig linux-3.13.6/drivers/usb/host/Kconfig ---- linux-3.13.6.orig/drivers/usb/host/Kconfig 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/Kconfig 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/Kconfig linux-raspberry-pi/drivers/usb/host/Kconfig +--- linux-3.13.6/drivers/usb/host/Kconfig 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/Kconfig 2014-03-11 16:55:38.000000000 +0100 @@ -689,6 +689,19 @@ To compile this driver a module, choose M here: the module will be called "hwa-hc". @@ -91707,9 +92244,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/Kconfig linux-3.13.6/drivers/usb/ho config USB_IMX21_HCD tristate "i.MX21 HCD support" depends on ARM && ARCH_MXC -diff -Nur linux-3.13.6.orig/drivers/usb/host/Makefile linux-3.13.6/drivers/usb/host/Makefile ---- linux-3.13.6.orig/drivers/usb/host/Makefile 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/usb/host/Makefile 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/host/Makefile linux-raspberry-pi/drivers/usb/host/Makefile +--- linux-3.13.6/drivers/usb/host/Makefile 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/host/Makefile 2014-03-11 16:55:38.000000000 +0100 @@ -65,6 +65,8 @@ obj-$(CONFIG_USB_R8A66597_HCD) += r8a66597-hcd.o obj-$(CONFIG_USB_ISP1760_HCD) += isp1760.o @@ -91719,9 +92256,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/host/Makefile linux-3.13.6/drivers/usb/h obj-$(CONFIG_USB_IMX21_HCD) += imx21-hcd.o obj-$(CONFIG_USB_FSL_MPH_DR_OF) += fsl-mph-dr-of.o obj-$(CONFIG_USB_OCTEON2_COMMON) += octeon2-common.o -diff -Nur linux-3.13.6.orig/drivers/usb/Makefile linux-3.13.6/drivers/usb/Makefile ---- linux-3.13.6.orig/drivers/usb/Makefile 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/usb/Makefile 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/usb/Makefile linux-raspberry-pi/drivers/usb/Makefile +--- linux-3.13.6/drivers/usb/Makefile 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/usb/Makefile 2014-03-11 16:55:37.000000000 +0100 @@ -23,6 +23,7 @@ obj-$(CONFIG_USB_R8A66597_HCD) += host/ obj-$(CONFIG_USB_HWA_HCD) += host/ @@ -91730,9 +92267,9 @@ diff -Nur linux-3.13.6.orig/drivers/usb/Makefile linux-3.13.6/drivers/usb/Makefi obj-$(CONFIG_USB_IMX21_HCD) += host/ obj-$(CONFIG_USB_FSL_MPH_DR_OF) += host/ obj-$(CONFIG_USB_FUSBH200_HCD) += host/ -diff -Nur linux-3.13.6.orig/drivers/video/bcm2708_fb.c linux-3.13.6/drivers/video/bcm2708_fb.c ---- linux-3.13.6.orig/drivers/video/bcm2708_fb.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/video/bcm2708_fb.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/video/bcm2708_fb.c linux-raspberry-pi/drivers/video/bcm2708_fb.c +--- linux-3.13.6/drivers/video/bcm2708_fb.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/video/bcm2708_fb.c 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,765 @@ +/* + * linux/drivers/video/bcm2708_fb.c @@ -92499,9 +93036,9 @@ diff -Nur linux-3.13.6.orig/drivers/video/bcm2708_fb.c linux-3.13.6/drivers/vide +MODULE_PARM_DESC(fbheight, "Height of ARM Framebuffer"); +MODULE_PARM_DESC(fbdepth, "Bit depth of ARM Framebuffer"); +MODULE_PARM_DESC(fbswap, "Swap order of red and blue in 24 and 32 bit modes"); -diff -Nur linux-3.13.6.orig/drivers/video/cfbimgblt.c linux-3.13.6/drivers/video/cfbimgblt.c ---- linux-3.13.6.orig/drivers/video/cfbimgblt.c 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/video/cfbimgblt.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/video/cfbimgblt.c linux-raspberry-pi/drivers/video/cfbimgblt.c +--- linux-3.13.6/drivers/video/cfbimgblt.c 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/video/cfbimgblt.c 2014-03-11 16:55:38.000000000 +0100 @@ -28,6 +28,11 @@ * * Also need to add code to deal with cards endians that are different than @@ -92675,9 +93212,9 @@ diff -Nur linux-3.13.6.orig/drivers/video/cfbimgblt.c linux-3.13.6/drivers/video slow_imageblit(image, p, dst1, fgcolor, bgcolor, start_index, pitch_index); } else -diff -Nur linux-3.13.6.orig/drivers/video/fbmem.c linux-3.13.6/drivers/video/fbmem.c ---- linux-3.13.6.orig/drivers/video/fbmem.c 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/video/fbmem.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/video/fbmem.c linux-raspberry-pi/drivers/video/fbmem.c +--- linux-3.13.6/drivers/video/fbmem.c 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/video/fbmem.c 2014-03-11 16:55:38.000000000 +0100 @@ -1083,6 +1083,25 @@ } EXPORT_SYMBOL(fb_blank); @@ -92736,9 +93273,9 @@ diff -Nur linux-3.13.6.orig/drivers/video/fbmem.c linux-3.13.6/drivers/video/fbm arg = (unsigned long) compat_ptr(arg); case FBIOBLANK: ret = do_fb_ioctl(info, cmd, arg); -diff -Nur linux-3.13.6.orig/drivers/video/Kconfig linux-3.13.6/drivers/video/Kconfig ---- linux-3.13.6.orig/drivers/video/Kconfig 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/video/Kconfig 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/video/Kconfig linux-raspberry-pi/drivers/video/Kconfig +--- linux-3.13.6/drivers/video/Kconfig 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/video/Kconfig 2014-03-11 16:55:38.000000000 +0100 @@ -310,6 +310,20 @@ help Support the Permedia2 FIFO disconnect feature. @@ -92760,9 +93297,9 @@ diff -Nur linux-3.13.6.orig/drivers/video/Kconfig linux-3.13.6/drivers/video/Kco config FB_ARMCLCD tristate "ARM PrimeCell PL110 support" depends on FB && ARM && ARM_AMBA -diff -Nur linux-3.13.6.orig/drivers/video/logo/logo_linux_clut224.ppm linux-3.13.6/drivers/video/logo/logo_linux_clut224.ppm ---- linux-3.13.6.orig/drivers/video/logo/logo_linux_clut224.ppm 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/video/logo/logo_linux_clut224.ppm 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/video/logo/logo_linux_clut224.ppm linux-raspberry-pi/drivers/video/logo/logo_linux_clut224.ppm +--- linux-3.13.6/drivers/video/logo/logo_linux_clut224.ppm 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/video/logo/logo_linux_clut224.ppm 2014-03-11 16:53:13.000000000 +0100 @@ -1,1604 +1,883 @@ P3 -# Standard 224-color Linux logo @@ -95249,9 +95786,9 @@ diff -Nur linux-3.13.6.orig/drivers/video/logo/logo_linux_clut224.ppm linux-3.13 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 -diff -Nur linux-3.13.6.orig/drivers/video/Makefile linux-3.13.6/drivers/video/Makefile ---- linux-3.13.6.orig/drivers/video/Makefile 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/video/Makefile 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/video/Makefile linux-raspberry-pi/drivers/video/Makefile +--- linux-3.13.6/drivers/video/Makefile 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/video/Makefile 2014-03-11 16:53:13.000000000 +0100 @@ -100,6 +100,7 @@ obj-$(CONFIG_FB_VOODOO1) += sstfb.o obj-$(CONFIG_FB_ARMCLCD) += amba-clcd.o @@ -95260,9 +95797,9 @@ diff -Nur linux-3.13.6.orig/drivers/video/Makefile linux-3.13.6/drivers/video/Ma obj-$(CONFIG_FB_68328) += 68328fb.o obj-$(CONFIG_FB_GBE) += gbefb.o obj-$(CONFIG_FB_CIRRUS) += cirrusfb.o -diff -Nur linux-3.13.6.orig/drivers/w1/masters/w1-gpio.c linux-3.13.6/drivers/w1/masters/w1-gpio.c ---- linux-3.13.6.orig/drivers/w1/masters/w1-gpio.c 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/w1/masters/w1-gpio.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/w1/masters/w1-gpio.c linux-raspberry-pi/drivers/w1/masters/w1-gpio.c +--- linux-3.13.6/drivers/w1/masters/w1-gpio.c 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/w1/masters/w1-gpio.c 2014-03-11 16:55:38.000000000 +0100 @@ -22,6 +22,9 @@ #include "../w1.h" #include "../w1_int.h" @@ -95304,9 +95841,9 @@ diff -Nur linux-3.13.6.orig/drivers/w1/masters/w1-gpio.c linux-3.13.6/drivers/w1 err = w1_add_master_device(master); if (err) { dev_err(&pdev->dev, "w1_add_master device failed\n"); -diff -Nur linux-3.13.6.orig/drivers/w1/w1.h linux-3.13.6/drivers/w1/w1.h ---- linux-3.13.6.orig/drivers/w1/w1.h 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/w1/w1.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/w1/w1.h linux-raspberry-pi/drivers/w1/w1.h +--- linux-3.13.6/drivers/w1/w1.h 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/w1/w1.h 2014-03-11 16:55:38.000000000 +0100 @@ -148,6 +148,12 @@ */ u8 (*set_pullup)(void *, int); @@ -95320,9 +95857,9 @@ diff -Nur linux-3.13.6.orig/drivers/w1/w1.h linux-3.13.6/drivers/w1/w1.h /** Really nice hardware can handles the different types of ROM search * w1_master* is passed to the slave found callback. */ -diff -Nur linux-3.13.6.orig/drivers/w1/w1_int.c linux-3.13.6/drivers/w1/w1_int.c ---- linux-3.13.6.orig/drivers/w1/w1_int.c 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/w1/w1_int.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/w1/w1_int.c linux-raspberry-pi/drivers/w1/w1_int.c +--- linux-3.13.6/drivers/w1/w1_int.c 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/w1/w1_int.c 2014-03-11 16:53:14.000000000 +0100 @@ -117,19 +117,21 @@ printk(KERN_ERR "w1_add_master_device: invalid function set\n"); return(-EINVAL); @@ -95352,9 +95889,9 @@ diff -Nur linux-3.13.6.orig/drivers/w1/w1_int.c linux-3.13.6/drivers/w1/w1_int.c /* Lock until the device is added (or not) to w1_masters. */ mutex_lock(&w1_mlock); /* Search for the first available id (starting at 1). */ -diff -Nur linux-3.13.6.orig/drivers/w1/w1_io.c linux-3.13.6/drivers/w1/w1_io.c ---- linux-3.13.6.orig/drivers/w1/w1_io.c 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/w1/w1_io.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/w1/w1_io.c linux-raspberry-pi/drivers/w1/w1_io.c +--- linux-3.13.6/drivers/w1/w1_io.c 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/w1/w1_io.c 2014-03-11 16:53:14.000000000 +0100 @@ -127,10 +127,22 @@ static void w1_post_write(struct w1_master *dev) { @@ -95381,9 +95918,9 @@ diff -Nur linux-3.13.6.orig/drivers/w1/w1_io.c linux-3.13.6/drivers/w1/w1_io.c dev->pullup_duration = 0; } } -diff -Nur linux-3.13.6.orig/drivers/watchdog/bcm2708_wdog.c linux-3.13.6/drivers/watchdog/bcm2708_wdog.c ---- linux-3.13.6.orig/drivers/watchdog/bcm2708_wdog.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/drivers/watchdog/bcm2708_wdog.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/watchdog/bcm2708_wdog.c linux-raspberry-pi/drivers/watchdog/bcm2708_wdog.c +--- linux-3.13.6/drivers/watchdog/bcm2708_wdog.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/drivers/watchdog/bcm2708_wdog.c 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,384 @@ +/* + * Broadcom BCM2708 watchdog driver. @@ -95769,9 +96306,9 @@ diff -Nur linux-3.13.6.orig/drivers/watchdog/bcm2708_wdog.c linux-3.13.6/drivers +MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); +MODULE_ALIAS_MISCDEV(TEMP_MINOR); +MODULE_LICENSE("GPL"); -diff -Nur linux-3.13.6.orig/drivers/watchdog/Kconfig linux-3.13.6/drivers/watchdog/Kconfig ---- linux-3.13.6.orig/drivers/watchdog/Kconfig 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/watchdog/Kconfig 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/watchdog/Kconfig linux-raspberry-pi/drivers/watchdog/Kconfig +--- linux-3.13.6/drivers/watchdog/Kconfig 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/watchdog/Kconfig 2014-03-11 16:55:38.000000000 +0100 @@ -392,6 +392,12 @@ To compile this driver as a module, choose M here: the module will be called retu_wdt. @@ -95785,9 +96322,9 @@ diff -Nur linux-3.13.6.orig/drivers/watchdog/Kconfig linux-3.13.6/drivers/watchd config MOXART_WDT tristate "MOXART watchdog" depends on ARCH_MOXART -diff -Nur linux-3.13.6.orig/drivers/watchdog/Makefile linux-3.13.6/drivers/watchdog/Makefile ---- linux-3.13.6.orig/drivers/watchdog/Makefile 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/drivers/watchdog/Makefile 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/drivers/watchdog/Makefile linux-raspberry-pi/drivers/watchdog/Makefile +--- linux-3.13.6/drivers/watchdog/Makefile 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/drivers/watchdog/Makefile 2014-03-11 16:55:38.000000000 +0100 @@ -54,6 +54,7 @@ obj-$(CONFIG_IMX2_WDT) += imx2_wdt.o obj-$(CONFIG_UX500_WATCHDOG) += ux500_wdt.o @@ -95796,9 +96333,9 @@ diff -Nur linux-3.13.6.orig/drivers/watchdog/Makefile linux-3.13.6/drivers/watch obj-$(CONFIG_BCM2835_WDT) += bcm2835_wdt.o obj-$(CONFIG_MOXART_WDT) += moxart_wdt.o obj-$(CONFIG_SIRFSOC_WATCHDOG) += sirfsoc_wdt.o -diff -Nur linux-3.13.6.orig/include/linux/broadcom/vc_cma.h linux-3.13.6/include/linux/broadcom/vc_cma.h ---- linux-3.13.6.orig/include/linux/broadcom/vc_cma.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/include/linux/broadcom/vc_cma.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/include/linux/broadcom/vc_cma.h linux-raspberry-pi/include/linux/broadcom/vc_cma.h +--- linux-3.13.6/include/linux/broadcom/vc_cma.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/include/linux/broadcom/vc_cma.h 2014-03-11 16:55:38.000000000 +0100 @@ -0,0 +1,29 @@ +/***************************************************************************** +* Copyright 2012 Broadcom Corporation. All rights reserved. @@ -95829,9 +96366,9 @@ diff -Nur linux-3.13.6.orig/include/linux/broadcom/vc_cma.h linux-3.13.6/include +#endif + +#endif /* VC_CMA_H */ -diff -Nur linux-3.13.6.orig/include/linux/mmc/host.h linux-3.13.6/include/linux/mmc/host.h ---- linux-3.13.6.orig/include/linux/mmc/host.h 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/include/linux/mmc/host.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/include/linux/mmc/host.h linux-raspberry-pi/include/linux/mmc/host.h +--- linux-3.13.6/include/linux/mmc/host.h 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/include/linux/mmc/host.h 2014-03-11 16:55:39.000000000 +0100 @@ -282,6 +282,7 @@ MMC_CAP2_PACKED_WR) #define MMC_CAP2_NO_PRESCAN_POWERUP (1 << 14) /* Don't power up before scan */ @@ -95840,9 +96377,9 @@ diff -Nur linux-3.13.6.orig/include/linux/mmc/host.h linux-3.13.6/include/linux/ mmc_pm_flag_t pm_caps; /* supported pm features */ -diff -Nur linux-3.13.6.orig/include/linux/mmc/sdhci.h linux-3.13.6/include/linux/mmc/sdhci.h ---- linux-3.13.6.orig/include/linux/mmc/sdhci.h 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/include/linux/mmc/sdhci.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/include/linux/mmc/sdhci.h linux-raspberry-pi/include/linux/mmc/sdhci.h +--- linux-3.13.6/include/linux/mmc/sdhci.h 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/include/linux/mmc/sdhci.h 2014-03-11 16:55:39.000000000 +0100 @@ -102,6 +102,7 @@ #define SDHCI_QUIRK2_BROKEN_HS200 (1<<6) @@ -95867,9 +96404,9 @@ diff -Nur linux-3.13.6.orig/include/linux/mmc/sdhci.h linux-3.13.6/include/linux struct mmc_data *data; /* Current data request */ unsigned int data_early:1; /* Data finished before cmd */ -diff -Nur linux-3.13.6.orig/include/uapi/linux/fb.h linux-3.13.6/include/uapi/linux/fb.h ---- linux-3.13.6.orig/include/uapi/linux/fb.h 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/include/uapi/linux/fb.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/include/uapi/linux/fb.h linux-raspberry-pi/include/uapi/linux/fb.h +--- linux-3.13.6/include/uapi/linux/fb.h 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/include/uapi/linux/fb.h 2014-03-11 16:53:22.000000000 +0100 @@ -34,6 +34,11 @@ #define FBIOPUT_MODEINFO 0x4617 #define FBIOGET_DISPINFO 0x4618 @@ -95882,9 +96419,9 @@ diff -Nur linux-3.13.6.orig/include/uapi/linux/fb.h linux-3.13.6/include/uapi/li #define FB_TYPE_PACKED_PIXELS 0 /* Packed Pixels */ #define FB_TYPE_PLANES 1 /* Non interleaved planes */ -diff -Nur linux-3.13.6.orig/kernel/cgroup.c linux-3.13.6/kernel/cgroup.c ---- linux-3.13.6.orig/kernel/cgroup.c 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/kernel/cgroup.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/kernel/cgroup.c linux-raspberry-pi/kernel/cgroup.c +--- linux-3.13.6/kernel/cgroup.c 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/kernel/cgroup.c 2014-03-11 16:55:43.000000000 +0100 @@ -5485,6 +5485,33 @@ } __setup("cgroup_disable=", cgroup_disable); @@ -95919,5686 +96456,9 @@ diff -Nur linux-3.13.6.orig/kernel/cgroup.c linux-3.13.6/kernel/cgroup.c /** * css_from_dir - get corresponding css from the dentry of a cgroup dir * @dentry: directory dentry of interest -diff -Nur linux-3.13.6.orig/kernel/cgroup.c.orig linux-3.13.6/kernel/cgroup.c.orig ---- linux-3.13.6.orig/kernel/cgroup.c.orig 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/kernel/cgroup.c.orig 2014-03-07 07:07:02.000000000 +0100 -@@ -0,0 +1,5673 @@ -+/* -+ * Generic process-grouping system. -+ * -+ * Based originally on the cpuset system, extracted by Paul Menage -+ * Copyright (C) 2006 Google, Inc -+ * -+ * Notifications support -+ * Copyright (C) 2009 Nokia Corporation -+ * Author: Kirill A. Shutemov -+ * -+ * Copyright notices from the original cpuset code: -+ * -------------------------------------------------- -+ * Copyright (C) 2003 BULL SA. -+ * Copyright (C) 2004-2006 Silicon Graphics, Inc. -+ * -+ * Portions derived from Patrick Mochel's sysfs code. -+ * sysfs is Copyright (c) 2001-3 Patrick Mochel -+ * -+ * 2003-10-10 Written by Simon Derr. -+ * 2003-10-22 Updates by Stephen Hemminger. -+ * 2004 May-July Rework by Paul Jackson. -+ * --------------------------------------------------- -+ * -+ * This file is subject to the terms and conditions of the GNU General Public -+ * License. See the file COPYING in the main directory of the Linux -+ * distribution for more details. -+ */ -+ -+#include <linux/cgroup.h> -+#include <linux/cred.h> -+#include <linux/ctype.h> -+#include <linux/errno.h> -+#include <linux/init_task.h> -+#include <linux/kernel.h> -+#include <linux/list.h> -+#include <linux/mm.h> -+#include <linux/mutex.h> -+#include <linux/mount.h> -+#include <linux/pagemap.h> -+#include <linux/proc_fs.h> -+#include <linux/rcupdate.h> -+#include <linux/sched.h> -+#include <linux/backing-dev.h> -+#include <linux/seq_file.h> -+#include <linux/slab.h> -+#include <linux/magic.h> -+#include <linux/spinlock.h> -+#include <linux/string.h> -+#include <linux/sort.h> -+#include <linux/kmod.h> -+#include <linux/module.h> -+#include <linux/delayacct.h> -+#include <linux/cgroupstats.h> -+#include <linux/hashtable.h> -+#include <linux/namei.h> -+#include <linux/pid_namespace.h> -+#include <linux/idr.h> -+#include <linux/vmalloc.h> /* TODO: replace with more sophisticated array */ -+#include <linux/eventfd.h> -+#include <linux/poll.h> -+#include <linux/flex_array.h> /* used in cgroup_attach_task */ -+#include <linux/kthread.h> -+#include <linux/file.h> -+ -+#include <linux/atomic.h> -+ -+/* -+ * cgroup_mutex is the master lock. Any modification to cgroup or its -+ * hierarchy must be performed while holding it. -+ * -+ * cgroup_root_mutex nests inside cgroup_mutex and should be held to modify -+ * cgroupfs_root of any cgroup hierarchy - subsys list, flags, -+ * release_agent_path and so on. Modifying requires both cgroup_mutex and -+ * cgroup_root_mutex. Readers can acquire either of the two. This is to -+ * break the following locking order cycle. -+ * -+ * A. cgroup_mutex -> cred_guard_mutex -> s_type->i_mutex_key -> namespace_sem -+ * B. namespace_sem -> cgroup_mutex -+ * -+ * B happens only through cgroup_show_options() and using cgroup_root_mutex -+ * breaks it. -+ */ -+#ifdef CONFIG_PROVE_RCU -+DEFINE_MUTEX(cgroup_mutex); -+EXPORT_SYMBOL_GPL(cgroup_mutex); /* only for lockdep */ -+#else -+static DEFINE_MUTEX(cgroup_mutex); -+#endif -+ -+static DEFINE_MUTEX(cgroup_root_mutex); -+ -+/* -+ * cgroup destruction makes heavy use of work items and there can be a lot -+ * of concurrent destructions. Use a separate workqueue so that cgroup -+ * destruction work items don't end up filling up max_active of system_wq -+ * which may lead to deadlock. -+ */ -+static struct workqueue_struct *cgroup_destroy_wq; -+ -+/* -+ * Generate an array of cgroup subsystem pointers. At boot time, this is -+ * populated with the built in subsystems, and modular subsystems are -+ * registered after that. The mutable section of this array is protected by -+ * cgroup_mutex. -+ */ -+#define SUBSYS(_x) [_x ## _subsys_id] = &_x ## _subsys, -+#define IS_SUBSYS_ENABLED(option) IS_BUILTIN(option) -+static struct cgroup_subsys *cgroup_subsys[CGROUP_SUBSYS_COUNT] = { -+#include <linux/cgroup_subsys.h> -+}; -+ -+/* -+ * The dummy hierarchy, reserved for the subsystems that are otherwise -+ * unattached - it never has more than a single cgroup, and all tasks are -+ * part of that cgroup. -+ */ -+static struct cgroupfs_root cgroup_dummy_root; -+ -+/* dummy_top is a shorthand for the dummy hierarchy's top cgroup */ -+static struct cgroup * const cgroup_dummy_top = &cgroup_dummy_root.top_cgroup; -+ -+/* -+ * cgroupfs file entry, pointed to from leaf dentry->d_fsdata. -+ */ -+struct cfent { -+ struct list_head node; -+ struct dentry *dentry; -+ struct cftype *type; -+ struct cgroup_subsys_state *css; -+ -+ /* file xattrs */ -+ struct simple_xattrs xattrs; -+}; -+ -+/* -+ * cgroup_event represents events which userspace want to receive. -+ */ -+struct cgroup_event { -+ /* -+ * css which the event belongs to. -+ */ -+ struct cgroup_subsys_state *css; -+ /* -+ * Control file which the event associated. -+ */ -+ struct cftype *cft; -+ /* -+ * eventfd to signal userspace about the event. -+ */ -+ struct eventfd_ctx *eventfd; -+ /* -+ * Each of these stored in a list by the cgroup. -+ */ -+ struct list_head list; -+ /* -+ * All fields below needed to unregister event when -+ * userspace closes eventfd. -+ */ -+ poll_table pt; -+ wait_queue_head_t *wqh; -+ wait_queue_t wait; -+ struct work_struct remove; -+}; -+ -+/* The list of hierarchy roots */ -+ -+static LIST_HEAD(cgroup_roots); -+static int cgroup_root_count; -+ -+/* -+ * Hierarchy ID allocation and mapping. It follows the same exclusion -+ * rules as other root ops - both cgroup_mutex and cgroup_root_mutex for -+ * writes, either for reads. -+ */ -+static DEFINE_IDR(cgroup_hierarchy_idr); -+ -+static struct cgroup_name root_cgroup_name = { .name = "/" }; -+ -+/* -+ * Assign a monotonically increasing serial number to cgroups. It -+ * guarantees cgroups with bigger numbers are newer than those with smaller -+ * numbers. Also, as cgroups are always appended to the parent's -+ * ->children list, it guarantees that sibling cgroups are always sorted in -+ * the ascending serial number order on the list. Protected by -+ * cgroup_mutex. -+ */ -+static u64 cgroup_serial_nr_next = 1; -+ -+/* This flag indicates whether tasks in the fork and exit paths should -+ * check for fork/exit handlers to call. This avoids us having to do -+ * extra work in the fork/exit path if none of the subsystems need to -+ * be called. -+ */ -+static int need_forkexit_callback __read_mostly; -+ -+static struct cftype cgroup_base_files[]; -+ -+static void cgroup_destroy_css_killed(struct cgroup *cgrp); -+static int cgroup_destroy_locked(struct cgroup *cgrp); -+static int cgroup_addrm_files(struct cgroup *cgrp, struct cftype cfts[], -+ bool is_add); -+static int cgroup_file_release(struct inode *inode, struct file *file); -+ -+/** -+ * cgroup_css - obtain a cgroup's css for the specified subsystem -+ * @cgrp: the cgroup of interest -+ * @ss: the subsystem of interest (%NULL returns the dummy_css) -+ * -+ * Return @cgrp's css (cgroup_subsys_state) associated with @ss. This -+ * function must be called either under cgroup_mutex or rcu_read_lock() and -+ * the caller is responsible for pinning the returned css if it wants to -+ * keep accessing it outside the said locks. This function may return -+ * %NULL if @cgrp doesn't have @subsys_id enabled. -+ */ -+static struct cgroup_subsys_state *cgroup_css(struct cgroup *cgrp, -+ struct cgroup_subsys *ss) -+{ -+ if (ss) -+ return rcu_dereference_check(cgrp->subsys[ss->subsys_id], -+ lockdep_is_held(&cgroup_mutex)); -+ else -+ return &cgrp->dummy_css; -+} -+ -+/* convenient tests for these bits */ -+static inline bool cgroup_is_dead(const struct cgroup *cgrp) -+{ -+ return test_bit(CGRP_DEAD, &cgrp->flags); -+} -+ -+/** -+ * cgroup_is_descendant - test ancestry -+ * @cgrp: the cgroup to be tested -+ * @ancestor: possible ancestor of @cgrp -+ * -+ * Test whether @cgrp is a descendant of @ancestor. It also returns %true -+ * if @cgrp == @ancestor. This function is safe to call as long as @cgrp -+ * and @ancestor are accessible. -+ */ -+bool cgroup_is_descendant(struct cgroup *cgrp, struct cgroup *ancestor) -+{ -+ while (cgrp) { -+ if (cgrp == ancestor) -+ return true; -+ cgrp = cgrp->parent; -+ } -+ return false; -+} -+EXPORT_SYMBOL_GPL(cgroup_is_descendant); -+ -+static int cgroup_is_releasable(const struct cgroup *cgrp) -+{ -+ const int bits = -+ (1 << CGRP_RELEASABLE) | -+ (1 << CGRP_NOTIFY_ON_RELEASE); -+ return (cgrp->flags & bits) == bits; -+} -+ -+static int notify_on_release(const struct cgroup *cgrp) -+{ -+ return test_bit(CGRP_NOTIFY_ON_RELEASE, &cgrp->flags); -+} -+ -+/** -+ * for_each_subsys - iterate all loaded cgroup subsystems -+ * @ss: the iteration cursor -+ * @i: the index of @ss, CGROUP_SUBSYS_COUNT after reaching the end -+ * -+ * Should be called under cgroup_mutex. -+ */ -+#define for_each_subsys(ss, i) \ -+ for ((i) = 0; (i) < CGROUP_SUBSYS_COUNT; (i)++) \ -+ if (({ lockdep_assert_held(&cgroup_mutex); \ -+ !((ss) = cgroup_subsys[i]); })) { } \ -+ else -+ -+/** -+ * for_each_builtin_subsys - iterate all built-in cgroup subsystems -+ * @ss: the iteration cursor -+ * @i: the index of @ss, CGROUP_BUILTIN_SUBSYS_COUNT after reaching the end -+ * -+ * Bulit-in subsystems are always present and iteration itself doesn't -+ * require any synchronization. -+ */ -+#define for_each_builtin_subsys(ss, i) \ -+ for ((i) = 0; (i) < CGROUP_BUILTIN_SUBSYS_COUNT && \ -+ (((ss) = cgroup_subsys[i]) || true); (i)++) -+ -+/* iterate each subsystem attached to a hierarchy */ -+#define for_each_root_subsys(root, ss) \ -+ list_for_each_entry((ss), &(root)->subsys_list, sibling) -+ -+/* iterate across the active hierarchies */ -+#define for_each_active_root(root) \ -+ list_for_each_entry((root), &cgroup_roots, root_list) -+ -+static inline struct cgroup *__d_cgrp(struct dentry *dentry) -+{ -+ return dentry->d_fsdata; -+} -+ -+static inline struct cfent *__d_cfe(struct dentry *dentry) -+{ -+ return dentry->d_fsdata; -+} -+ -+static inline struct cftype *__d_cft(struct dentry *dentry) -+{ -+ return __d_cfe(dentry)->type; -+} -+ -+/** -+ * cgroup_lock_live_group - take cgroup_mutex and check that cgrp is alive. -+ * @cgrp: the cgroup to be checked for liveness -+ * -+ * On success, returns true; the mutex should be later unlocked. On -+ * failure returns false with no lock held. -+ */ -+static bool cgroup_lock_live_group(struct cgroup *cgrp) -+{ -+ mutex_lock(&cgroup_mutex); -+ if (cgroup_is_dead(cgrp)) { -+ mutex_unlock(&cgroup_mutex); -+ return false; -+ } -+ return true; -+} -+ -+/* the list of cgroups eligible for automatic release. Protected by -+ * release_list_lock */ -+static LIST_HEAD(release_list); -+static DEFINE_RAW_SPINLOCK(release_list_lock); -+static void cgroup_release_agent(struct work_struct *work); -+static DECLARE_WORK(release_agent_work, cgroup_release_agent); -+static void check_for_release(struct cgroup *cgrp); -+ -+/* -+ * A cgroup can be associated with multiple css_sets as different tasks may -+ * belong to different cgroups on different hierarchies. In the other -+ * direction, a css_set is naturally associated with multiple cgroups. -+ * This M:N relationship is represented by the following link structure -+ * which exists for each association and allows traversing the associations -+ * from both sides. -+ */ -+struct cgrp_cset_link { -+ /* the cgroup and css_set this link associates */ -+ struct cgroup *cgrp; -+ struct css_set *cset; -+ -+ /* list of cgrp_cset_links anchored at cgrp->cset_links */ -+ struct list_head cset_link; -+ -+ /* list of cgrp_cset_links anchored at css_set->cgrp_links */ -+ struct list_head cgrp_link; -+}; -+ -+/* The default css_set - used by init and its children prior to any -+ * hierarchies being mounted. It contains a pointer to the root state -+ * for each subsystem. Also used to anchor the list of css_sets. Not -+ * reference-counted, to improve performance when child cgroups -+ * haven't been created. -+ */ -+ -+static struct css_set init_css_set; -+static struct cgrp_cset_link init_cgrp_cset_link; -+ -+/* -+ * css_set_lock protects the list of css_set objects, and the chain of -+ * tasks off each css_set. Nests outside task->alloc_lock due to -+ * css_task_iter_start(). -+ */ -+static DEFINE_RWLOCK(css_set_lock); -+static int css_set_count; -+ -+/* -+ * hash table for cgroup groups. This improves the performance to find -+ * an existing css_set. This hash doesn't (currently) take into -+ * account cgroups in empty hierarchies. -+ */ -+#define CSS_SET_HASH_BITS 7 -+static DEFINE_HASHTABLE(css_set_table, CSS_SET_HASH_BITS); -+ -+static unsigned long css_set_hash(struct cgroup_subsys_state *css[]) -+{ -+ unsigned long key = 0UL; -+ struct cgroup_subsys *ss; -+ int i; -+ -+ for_each_subsys(ss, i) -+ key += (unsigned long)css[i]; -+ key = (key >> 16) ^ key; -+ -+ return key; -+} -+ -+/* -+ * We don't maintain the lists running through each css_set to its task -+ * until after the first call to css_task_iter_start(). This reduces the -+ * fork()/exit() overhead for people who have cgroups compiled into their -+ * kernel but not actually in use. -+ */ -+static int use_task_css_set_links __read_mostly; -+ -+static void __put_css_set(struct css_set *cset, int taskexit) -+{ -+ struct cgrp_cset_link *link, *tmp_link; -+ -+ /* -+ * Ensure that the refcount doesn't hit zero while any readers -+ * can see it. Similar to atomic_dec_and_lock(), but for an -+ * rwlock -+ */ -+ if (atomic_add_unless(&cset->refcount, -1, 1)) -+ return; -+ write_lock(&css_set_lock); -+ if (!atomic_dec_and_test(&cset->refcount)) { -+ write_unlock(&css_set_lock); -+ return; -+ } -+ -+ /* This css_set is dead. unlink it and release cgroup refcounts */ -+ hash_del(&cset->hlist); -+ css_set_count--; -+ -+ list_for_each_entry_safe(link, tmp_link, &cset->cgrp_links, cgrp_link) { -+ struct cgroup *cgrp = link->cgrp; -+ -+ list_del(&link->cset_link); -+ list_del(&link->cgrp_link); -+ -+ /* @cgrp can't go away while we're holding css_set_lock */ -+ if (list_empty(&cgrp->cset_links) && notify_on_release(cgrp)) { -+ if (taskexit) -+ set_bit(CGRP_RELEASABLE, &cgrp->flags); -+ check_for_release(cgrp); -+ } -+ -+ kfree(link); -+ } -+ -+ write_unlock(&css_set_lock); -+ kfree_rcu(cset, rcu_head); -+} -+ -+/* -+ * refcounted get/put for css_set objects -+ */ -+static inline void get_css_set(struct css_set *cset) -+{ -+ atomic_inc(&cset->refcount); -+} -+ -+static inline void put_css_set(struct css_set *cset) -+{ -+ __put_css_set(cset, 0); -+} -+ -+static inline void put_css_set_taskexit(struct css_set *cset) -+{ -+ __put_css_set(cset, 1); -+} -+ -+/** -+ * compare_css_sets - helper function for find_existing_css_set(). -+ * @cset: candidate css_set being tested -+ * @old_cset: existing css_set for a task -+ * @new_cgrp: cgroup that's being entered by the task -+ * @template: desired set of css pointers in css_set (pre-calculated) -+ * -+ * Returns true if "cset" matches "old_cset" except for the hierarchy -+ * which "new_cgrp" belongs to, for which it should match "new_cgrp". -+ */ -+static bool compare_css_sets(struct css_set *cset, -+ struct css_set *old_cset, -+ struct cgroup *new_cgrp, -+ struct cgroup_subsys_state *template[]) -+{ -+ struct list_head *l1, *l2; -+ -+ if (memcmp(template, cset->subsys, sizeof(cset->subsys))) { -+ /* Not all subsystems matched */ -+ return false; -+ } -+ -+ /* -+ * Compare cgroup pointers in order to distinguish between -+ * different cgroups in heirarchies with no subsystems. We -+ * could get by with just this check alone (and skip the -+ * memcmp above) but on most setups the memcmp check will -+ * avoid the need for this more expensive check on almost all -+ * candidates. -+ */ -+ -+ l1 = &cset->cgrp_links; -+ l2 = &old_cset->cgrp_links; -+ while (1) { -+ struct cgrp_cset_link *link1, *link2; -+ struct cgroup *cgrp1, *cgrp2; -+ -+ l1 = l1->next; -+ l2 = l2->next; -+ /* See if we reached the end - both lists are equal length. */ -+ if (l1 == &cset->cgrp_links) { -+ BUG_ON(l2 != &old_cset->cgrp_links); -+ break; -+ } else { -+ BUG_ON(l2 == &old_cset->cgrp_links); -+ } -+ /* Locate the cgroups associated with these links. */ -+ link1 = list_entry(l1, struct cgrp_cset_link, cgrp_link); -+ link2 = list_entry(l2, struct cgrp_cset_link, cgrp_link); -+ cgrp1 = link1->cgrp; -+ cgrp2 = link2->cgrp; -+ /* Hierarchies should be linked in the same order. */ -+ BUG_ON(cgrp1->root != cgrp2->root); -+ -+ /* -+ * If this hierarchy is the hierarchy of the cgroup -+ * that's changing, then we need to check that this -+ * css_set points to the new cgroup; if it's any other -+ * hierarchy, then this css_set should point to the -+ * same cgroup as the old css_set. -+ */ -+ if (cgrp1->root == new_cgrp->root) { -+ if (cgrp1 != new_cgrp) -+ return false; -+ } else { -+ if (cgrp1 != cgrp2) -+ return false; -+ } -+ } -+ return true; -+} -+ -+/** -+ * find_existing_css_set - init css array and find the matching css_set -+ * @old_cset: the css_set that we're using before the cgroup transition -+ * @cgrp: the cgroup that we're moving into -+ * @template: out param for the new set of csses, should be clear on entry -+ */ -+static struct css_set *find_existing_css_set(struct css_set *old_cset, -+ struct cgroup *cgrp, -+ struct cgroup_subsys_state *template[]) -+{ -+ struct cgroupfs_root *root = cgrp->root; -+ struct cgroup_subsys *ss; -+ struct css_set *cset; -+ unsigned long key; -+ int i; -+ -+ /* -+ * Build the set of subsystem state objects that we want to see in the -+ * new css_set. while subsystems can change globally, the entries here -+ * won't change, so no need for locking. -+ */ -+ for_each_subsys(ss, i) { -+ if (root->subsys_mask & (1UL << i)) { -+ /* Subsystem is in this hierarchy. So we want -+ * the subsystem state from the new -+ * cgroup */ -+ template[i] = cgroup_css(cgrp, ss); -+ } else { -+ /* Subsystem is not in this hierarchy, so we -+ * don't want to change the subsystem state */ -+ template[i] = old_cset->subsys[i]; -+ } -+ } -+ -+ key = css_set_hash(template); -+ hash_for_each_possible(css_set_table, cset, hlist, key) { -+ if (!compare_css_sets(cset, old_cset, cgrp, template)) -+ continue; -+ -+ /* This css_set matches what we need */ -+ return cset; -+ } -+ -+ /* No existing cgroup group matched */ -+ return NULL; -+} -+ -+static void free_cgrp_cset_links(struct list_head *links_to_free) -+{ -+ struct cgrp_cset_link *link, *tmp_link; -+ -+ list_for_each_entry_safe(link, tmp_link, links_to_free, cset_link) { -+ list_del(&link->cset_link); -+ kfree(link); -+ } -+} -+ -+/** -+ * allocate_cgrp_cset_links - allocate cgrp_cset_links -+ * @count: the number of links to allocate -+ * @tmp_links: list_head the allocated links are put on -+ * -+ * Allocate @count cgrp_cset_link structures and chain them on @tmp_links -+ * through ->cset_link. Returns 0 on success or -errno. -+ */ -+static int allocate_cgrp_cset_links(int count, struct list_head *tmp_links) -+{ -+ struct cgrp_cset_link *link; -+ int i; -+ -+ INIT_LIST_HEAD(tmp_links); -+ -+ for (i = 0; i < count; i++) { -+ link = kzalloc(sizeof(*link), GFP_KERNEL); -+ if (!link) { -+ free_cgrp_cset_links(tmp_links); -+ return -ENOMEM; -+ } -+ list_add(&link->cset_link, tmp_links); -+ } -+ return 0; -+} -+ -+/** -+ * link_css_set - a helper function to link a css_set to a cgroup -+ * @tmp_links: cgrp_cset_link objects allocated by allocate_cgrp_cset_links() -+ * @cset: the css_set to be linked -+ * @cgrp: the destination cgroup -+ */ -+static void link_css_set(struct list_head *tmp_links, struct css_set *cset, -+ struct cgroup *cgrp) -+{ -+ struct cgrp_cset_link *link; -+ -+ BUG_ON(list_empty(tmp_links)); -+ link = list_first_entry(tmp_links, struct cgrp_cset_link, cset_link); -+ link->cset = cset; -+ link->cgrp = cgrp; -+ list_move(&link->cset_link, &cgrp->cset_links); -+ /* -+ * Always add links to the tail of the list so that the list -+ * is sorted by order of hierarchy creation -+ */ -+ list_add_tail(&link->cgrp_link, &cset->cgrp_links); -+} -+ -+/** -+ * find_css_set - return a new css_set with one cgroup updated -+ * @old_cset: the baseline css_set -+ * @cgrp: the cgroup to be updated -+ * -+ * Return a new css_set that's equivalent to @old_cset, but with @cgrp -+ * substituted into the appropriate hierarchy. -+ */ -+static struct css_set *find_css_set(struct css_set *old_cset, -+ struct cgroup *cgrp) -+{ -+ struct cgroup_subsys_state *template[CGROUP_SUBSYS_COUNT] = { }; -+ struct css_set *cset; -+ struct list_head tmp_links; -+ struct cgrp_cset_link *link; -+ unsigned long key; -+ -+ lockdep_assert_held(&cgroup_mutex); -+ -+ /* First see if we already have a cgroup group that matches -+ * the desired set */ -+ read_lock(&css_set_lock); -+ cset = find_existing_css_set(old_cset, cgrp, template); -+ if (cset) -+ get_css_set(cset); -+ read_unlock(&css_set_lock); -+ -+ if (cset) -+ return cset; -+ -+ cset = kzalloc(sizeof(*cset), GFP_KERNEL); -+ if (!cset) -+ return NULL; -+ -+ /* Allocate all the cgrp_cset_link objects that we'll need */ -+ if (allocate_cgrp_cset_links(cgroup_root_count, &tmp_links) < 0) { -+ kfree(cset); -+ return NULL; -+ } -+ -+ atomic_set(&cset->refcount, 1); -+ INIT_LIST_HEAD(&cset->cgrp_links); -+ INIT_LIST_HEAD(&cset->tasks); -+ INIT_HLIST_NODE(&cset->hlist); -+ -+ /* Copy the set of subsystem state objects generated in -+ * find_existing_css_set() */ -+ memcpy(cset->subsys, template, sizeof(cset->subsys)); -+ -+ write_lock(&css_set_lock); -+ /* Add reference counts and links from the new css_set. */ -+ list_for_each_entry(link, &old_cset->cgrp_links, cgrp_link) { -+ struct cgroup *c = link->cgrp; -+ -+ if (c->root == cgrp->root) -+ c = cgrp; -+ link_css_set(&tmp_links, cset, c); -+ } -+ -+ BUG_ON(!list_empty(&tmp_links)); -+ -+ css_set_count++; -+ -+ /* Add this cgroup group to the hash table */ -+ key = css_set_hash(cset->subsys); -+ hash_add(css_set_table, &cset->hlist, key); -+ -+ write_unlock(&css_set_lock); -+ -+ return cset; -+} -+ -+/* -+ * Return the cgroup for "task" from the given hierarchy. Must be -+ * called with cgroup_mutex held. -+ */ -+static struct cgroup *task_cgroup_from_root(struct task_struct *task, -+ struct cgroupfs_root *root) -+{ -+ struct css_set *cset; -+ struct cgroup *res = NULL; -+ -+ BUG_ON(!mutex_is_locked(&cgroup_mutex)); -+ read_lock(&css_set_lock); -+ /* -+ * No need to lock the task - since we hold cgroup_mutex the -+ * task can't change groups, so the only thing that can happen -+ * is that it exits and its css is set back to init_css_set. -+ */ -+ cset = task_css_set(task); -+ if (cset == &init_css_set) { -+ res = &root->top_cgroup; -+ } else { -+ struct cgrp_cset_link *link; -+ -+ list_for_each_entry(link, &cset->cgrp_links, cgrp_link) { -+ struct cgroup *c = link->cgrp; -+ -+ if (c->root == root) { -+ res = c; -+ break; -+ } -+ } -+ } -+ read_unlock(&css_set_lock); -+ BUG_ON(!res); -+ return res; -+} -+ -+/* -+ * There is one global cgroup mutex. We also require taking -+ * task_lock() when dereferencing a task's cgroup subsys pointers. -+ * See "The task_lock() exception", at the end of this comment. -+ * -+ * A task must hold cgroup_mutex to modify cgroups. -+ * -+ * Any task can increment and decrement the count field without lock. -+ * So in general, code holding cgroup_mutex can't rely on the count -+ * field not changing. However, if the count goes to zero, then only -+ * cgroup_attach_task() can increment it again. Because a count of zero -+ * means that no tasks are currently attached, therefore there is no -+ * way a task attached to that cgroup can fork (the other way to -+ * increment the count). So code holding cgroup_mutex can safely -+ * assume that if the count is zero, it will stay zero. Similarly, if -+ * a task holds cgroup_mutex on a cgroup with zero count, it -+ * knows that the cgroup won't be removed, as cgroup_rmdir() -+ * needs that mutex. -+ * -+ * The fork and exit callbacks cgroup_fork() and cgroup_exit(), don't -+ * (usually) take cgroup_mutex. These are the two most performance -+ * critical pieces of code here. The exception occurs on cgroup_exit(), -+ * when a task in a notify_on_release cgroup exits. Then cgroup_mutex -+ * is taken, and if the cgroup count is zero, a usermode call made -+ * to the release agent with the name of the cgroup (path relative to -+ * the root of cgroup file system) as the argument. -+ * -+ * A cgroup can only be deleted if both its 'count' of using tasks -+ * is zero, and its list of 'children' cgroups is empty. Since all -+ * tasks in the system use _some_ cgroup, and since there is always at -+ * least one task in the system (init, pid == 1), therefore, top_cgroup -+ * always has either children cgroups and/or using tasks. So we don't -+ * need a special hack to ensure that top_cgroup cannot be deleted. -+ * -+ * The task_lock() exception -+ * -+ * The need for this exception arises from the action of -+ * cgroup_attach_task(), which overwrites one task's cgroup pointer with -+ * another. It does so using cgroup_mutex, however there are -+ * several performance critical places that need to reference -+ * task->cgroup without the expense of grabbing a system global -+ * mutex. Therefore except as noted below, when dereferencing or, as -+ * in cgroup_attach_task(), modifying a task's cgroup pointer we use -+ * task_lock(), which acts on a spinlock (task->alloc_lock) already in -+ * the task_struct routinely used for such matters. -+ * -+ * P.S. One more locking exception. RCU is used to guard the -+ * update of a tasks cgroup pointer by cgroup_attach_task() -+ */ -+ -+/* -+ * A couple of forward declarations required, due to cyclic reference loop: -+ * cgroup_mkdir -> cgroup_create -> cgroup_populate_dir -> -+ * cgroup_add_file -> cgroup_create_file -> cgroup_dir_inode_operations -+ * -> cgroup_mkdir. -+ */ -+ -+static int cgroup_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode); -+static int cgroup_rmdir(struct inode *unused_dir, struct dentry *dentry); -+static int cgroup_populate_dir(struct cgroup *cgrp, unsigned long subsys_mask); -+static const struct inode_operations cgroup_dir_inode_operations; -+static const struct file_operations proc_cgroupstats_operations; -+ -+static struct backing_dev_info cgroup_backing_dev_info = { -+ .name = "cgroup", -+ .capabilities = BDI_CAP_NO_ACCT_AND_WRITEBACK, -+}; -+ -+static struct inode *cgroup_new_inode(umode_t mode, struct super_block *sb) -+{ -+ struct inode *inode = new_inode(sb); -+ -+ if (inode) { -+ inode->i_ino = get_next_ino(); -+ inode->i_mode = mode; -+ inode->i_uid = current_fsuid(); -+ inode->i_gid = current_fsgid(); -+ inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; -+ inode->i_mapping->backing_dev_info = &cgroup_backing_dev_info; -+ } -+ return inode; -+} -+ -+static struct cgroup_name *cgroup_alloc_name(struct dentry *dentry) -+{ -+ struct cgroup_name *name; -+ -+ name = kmalloc(sizeof(*name) + dentry->d_name.len + 1, GFP_KERNEL); -+ if (!name) -+ return NULL; -+ strcpy(name->name, dentry->d_name.name); -+ return name; -+} -+ -+static void cgroup_free_fn(struct work_struct *work) -+{ -+ struct cgroup *cgrp = container_of(work, struct cgroup, destroy_work); -+ -+ mutex_lock(&cgroup_mutex); -+ cgrp->root->number_of_cgroups--; -+ mutex_unlock(&cgroup_mutex); -+ -+ /* -+ * We get a ref to the parent's dentry, and put the ref when -+ * this cgroup is being freed, so it's guaranteed that the -+ * parent won't be destroyed before its children. -+ */ -+ dput(cgrp->parent->dentry); -+ -+ /* -+ * Drop the active superblock reference that we took when we -+ * created the cgroup. This will free cgrp->root, if we are -+ * holding the last reference to @sb. -+ */ -+ deactivate_super(cgrp->root->sb); -+ -+ /* -+ * if we're getting rid of the cgroup, refcount should ensure -+ * that there are no pidlists left. -+ */ -+ BUG_ON(!list_empty(&cgrp->pidlists)); -+ -+ simple_xattrs_free(&cgrp->xattrs); -+ -+ kfree(rcu_dereference_raw(cgrp->name)); -+ kfree(cgrp); -+} -+ -+static void cgroup_free_rcu(struct rcu_head *head) -+{ -+ struct cgroup *cgrp = container_of(head, struct cgroup, rcu_head); -+ -+ INIT_WORK(&cgrp->destroy_work, cgroup_free_fn); -+ queue_work(cgroup_destroy_wq, &cgrp->destroy_work); -+} -+ -+static void cgroup_diput(struct dentry *dentry, struct inode *inode) -+{ -+ /* is dentry a directory ? if so, kfree() associated cgroup */ -+ if (S_ISDIR(inode->i_mode)) { -+ struct cgroup *cgrp = dentry->d_fsdata; -+ -+ BUG_ON(!(cgroup_is_dead(cgrp))); -+ -+ /* -+ * XXX: cgrp->id is only used to look up css's. As cgroup -+ * and css's lifetimes will be decoupled, it should be made -+ * per-subsystem and moved to css->id so that lookups are -+ * successful until the target css is released. -+ */ -+ idr_remove(&cgrp->root->cgroup_idr, cgrp->id); -+ cgrp->id = -1; -+ -+ call_rcu(&cgrp->rcu_head, cgroup_free_rcu); -+ } else { -+ struct cfent *cfe = __d_cfe(dentry); -+ struct cgroup *cgrp = dentry->d_parent->d_fsdata; -+ -+ WARN_ONCE(!list_empty(&cfe->node) && -+ cgrp != &cgrp->root->top_cgroup, -+ "cfe still linked for %s\n", cfe->type->name); -+ simple_xattrs_free(&cfe->xattrs); -+ kfree(cfe); -+ } -+ iput(inode); -+} -+ -+static void remove_dir(struct dentry *d) -+{ -+ struct dentry *parent = dget(d->d_parent); -+ -+ d_delete(d); -+ simple_rmdir(parent->d_inode, d); -+ dput(parent); -+} -+ -+static void cgroup_rm_file(struct cgroup *cgrp, const struct cftype *cft) -+{ -+ struct cfent *cfe; -+ -+ lockdep_assert_held(&cgrp->dentry->d_inode->i_mutex); -+ lockdep_assert_held(&cgroup_mutex); -+ -+ /* -+ * If we're doing cleanup due to failure of cgroup_create(), -+ * the corresponding @cfe may not exist. -+ */ -+ list_for_each_entry(cfe, &cgrp->files, node) { -+ struct dentry *d = cfe->dentry; -+ -+ if (cft && cfe->type != cft) -+ continue; -+ -+ dget(d); -+ d_delete(d); -+ simple_unlink(cgrp->dentry->d_inode, d); -+ list_del_init(&cfe->node); -+ dput(d); -+ -+ break; -+ } -+} -+ -+/** -+ * cgroup_clear_dir - remove subsys files in a cgroup directory -+ * @cgrp: target cgroup -+ * @subsys_mask: mask of the subsystem ids whose files should be removed -+ */ -+static void cgroup_clear_dir(struct cgroup *cgrp, unsigned long subsys_mask) -+{ -+ struct cgroup_subsys *ss; -+ int i; -+ -+ for_each_subsys(ss, i) { -+ struct cftype_set *set; -+ -+ if (!test_bit(i, &subsys_mask)) -+ continue; -+ list_for_each_entry(set, &ss->cftsets, node) -+ cgroup_addrm_files(cgrp, set->cfts, false); -+ } -+} -+ -+/* -+ * NOTE : the dentry must have been dget()'ed -+ */ -+static void cgroup_d_remove_dir(struct dentry *dentry) -+{ -+ struct dentry *parent; -+ -+ parent = dentry->d_parent; -+ spin_lock(&parent->d_lock); -+ spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED); -+ list_del_init(&dentry->d_u.d_child); -+ spin_unlock(&dentry->d_lock); -+ spin_unlock(&parent->d_lock); -+ remove_dir(dentry); -+} -+ -+/* -+ * Call with cgroup_mutex held. Drops reference counts on modules, including -+ * any duplicate ones that parse_cgroupfs_options took. If this function -+ * returns an error, no reference counts are touched. -+ */ -+static int rebind_subsystems(struct cgroupfs_root *root, -+ unsigned long added_mask, unsigned removed_mask) -+{ -+ struct cgroup *cgrp = &root->top_cgroup; -+ struct cgroup_subsys *ss; -+ unsigned long pinned = 0; -+ int i, ret; -+ -+ BUG_ON(!mutex_is_locked(&cgroup_mutex)); -+ BUG_ON(!mutex_is_locked(&cgroup_root_mutex)); -+ -+ /* Check that any added subsystems are currently free */ -+ for_each_subsys(ss, i) { -+ if (!(added_mask & (1 << i))) -+ continue; -+ -+ /* is the subsystem mounted elsewhere? */ -+ if (ss->root != &cgroup_dummy_root) { -+ ret = -EBUSY; -+ goto out_put; -+ } -+ -+ /* pin the module */ -+ if (!try_module_get(ss->module)) { -+ ret = -ENOENT; -+ goto out_put; -+ } -+ pinned |= 1 << i; -+ } -+ -+ /* subsys could be missing if unloaded between parsing and here */ -+ if (added_mask != pinned) { -+ ret = -ENOENT; -+ goto out_put; -+ } -+ -+ ret = cgroup_populate_dir(cgrp, added_mask); -+ if (ret) -+ goto out_put; -+ -+ /* -+ * Nothing can fail from this point on. Remove files for the -+ * removed subsystems and rebind each subsystem. -+ */ -+ cgroup_clear_dir(cgrp, removed_mask); -+ -+ for_each_subsys(ss, i) { -+ unsigned long bit = 1UL << i; -+ -+ if (bit & added_mask) { -+ /* We're binding this subsystem to this hierarchy */ -+ BUG_ON(cgroup_css(cgrp, ss)); -+ BUG_ON(!cgroup_css(cgroup_dummy_top, ss)); -+ BUG_ON(cgroup_css(cgroup_dummy_top, ss)->cgroup != cgroup_dummy_top); -+ -+ rcu_assign_pointer(cgrp->subsys[i], -+ cgroup_css(cgroup_dummy_top, ss)); -+ cgroup_css(cgrp, ss)->cgroup = cgrp; -+ -+ list_move(&ss->sibling, &root->subsys_list); -+ ss->root = root; -+ if (ss->bind) -+ ss->bind(cgroup_css(cgrp, ss)); -+ -+ /* refcount was already taken, and we're keeping it */ -+ root->subsys_mask |= bit; -+ } else if (bit & removed_mask) { -+ /* We're removing this subsystem */ -+ BUG_ON(cgroup_css(cgrp, ss) != cgroup_css(cgroup_dummy_top, ss)); -+ BUG_ON(cgroup_css(cgrp, ss)->cgroup != cgrp); -+ -+ if (ss->bind) -+ ss->bind(cgroup_css(cgroup_dummy_top, ss)); -+ -+ cgroup_css(cgroup_dummy_top, ss)->cgroup = cgroup_dummy_top; -+ RCU_INIT_POINTER(cgrp->subsys[i], NULL); -+ -+ cgroup_subsys[i]->root = &cgroup_dummy_root; -+ list_move(&ss->sibling, &cgroup_dummy_root.subsys_list); -+ -+ /* subsystem is now free - drop reference on module */ -+ module_put(ss->module); -+ root->subsys_mask &= ~bit; -+ } -+ } -+ -+ /* -+ * Mark @root has finished binding subsystems. @root->subsys_mask -+ * now matches the bound subsystems. -+ */ -+ root->flags |= CGRP_ROOT_SUBSYS_BOUND; -+ -+ return 0; -+ -+out_put: -+ for_each_subsys(ss, i) -+ if (pinned & (1 << i)) -+ module_put(ss->module); -+ return ret; -+} -+ -+static int cgroup_show_options(struct seq_file *seq, struct dentry *dentry) -+{ -+ struct cgroupfs_root *root = dentry->d_sb->s_fs_info; -+ struct cgroup_subsys *ss; -+ -+ mutex_lock(&cgroup_root_mutex); -+ for_each_root_subsys(root, ss) -+ seq_printf(seq, ",%s", ss->name); -+ if (root->flags & CGRP_ROOT_SANE_BEHAVIOR) -+ seq_puts(seq, ",sane_behavior"); -+ if (root->flags & CGRP_ROOT_NOPREFIX) -+ seq_puts(seq, ",noprefix"); -+ if (root->flags & CGRP_ROOT_XATTR) -+ seq_puts(seq, ",xattr"); -+ if (strlen(root->release_agent_path)) -+ seq_printf(seq, ",release_agent=%s", root->release_agent_path); -+ if (test_bit(CGRP_CPUSET_CLONE_CHILDREN, &root->top_cgroup.flags)) -+ seq_puts(seq, ",clone_children"); -+ if (strlen(root->name)) -+ seq_printf(seq, ",name=%s", root->name); -+ mutex_unlock(&cgroup_root_mutex); -+ return 0; -+} -+ -+struct cgroup_sb_opts { -+ unsigned long subsys_mask; -+ unsigned long flags; -+ char *release_agent; -+ bool cpuset_clone_children; -+ char *name; -+ /* User explicitly requested empty subsystem */ -+ bool none; -+ -+ struct cgroupfs_root *new_root; -+ -+}; -+ -+/* -+ * Convert a hierarchy specifier into a bitmask of subsystems and -+ * flags. Call with cgroup_mutex held to protect the cgroup_subsys[] -+ * array. This function takes refcounts on subsystems to be used, unless it -+ * returns error, in which case no refcounts are taken. -+ */ -+static int parse_cgroupfs_options(char *data, struct cgroup_sb_opts *opts) -+{ -+ char *token, *o = data; -+ bool all_ss = false, one_ss = false; -+ unsigned long mask = (unsigned long)-1; -+ struct cgroup_subsys *ss; -+ int i; -+ -+ BUG_ON(!mutex_is_locked(&cgroup_mutex)); -+ -+#ifdef CONFIG_CPUSETS -+ mask = ~(1UL << cpuset_subsys_id); -+#endif -+ -+ memset(opts, 0, sizeof(*opts)); -+ -+ while ((token = strsep(&o, ",")) != NULL) { -+ if (!*token) -+ return -EINVAL; -+ if (!strcmp(token, "none")) { -+ /* Explicitly have no subsystems */ -+ opts->none = true; -+ continue; -+ } -+ if (!strcmp(token, "all")) { -+ /* Mutually exclusive option 'all' + subsystem name */ -+ if (one_ss) -+ return -EINVAL; -+ all_ss = true; -+ continue; -+ } -+ if (!strcmp(token, "__DEVEL__sane_behavior")) { -+ opts->flags |= CGRP_ROOT_SANE_BEHAVIOR; -+ continue; -+ } -+ if (!strcmp(token, "noprefix")) { -+ opts->flags |= CGRP_ROOT_NOPREFIX; -+ continue; -+ } -+ if (!strcmp(token, "clone_children")) { -+ opts->cpuset_clone_children = true; -+ continue; -+ } -+ if (!strcmp(token, "xattr")) { -+ opts->flags |= CGRP_ROOT_XATTR; -+ continue; -+ } -+ if (!strncmp(token, "release_agent=", 14)) { -+ /* Specifying two release agents is forbidden */ -+ if (opts->release_agent) -+ return -EINVAL; -+ opts->release_agent = -+ kstrndup(token + 14, PATH_MAX - 1, GFP_KERNEL); -+ if (!opts->release_agent) -+ return -ENOMEM; -+ continue; -+ } -+ if (!strncmp(token, "name=", 5)) { -+ const char *name = token + 5; -+ /* Can't specify an empty name */ -+ if (!strlen(name)) -+ return -EINVAL; -+ /* Must match [\w.-]+ */ -+ for (i = 0; i < strlen(name); i++) { -+ char c = name[i]; -+ if (isalnum(c)) -+ continue; -+ if ((c == '.') || (c == '-') || (c == '_')) -+ continue; -+ return -EINVAL; -+ } -+ /* Specifying two names is forbidden */ -+ if (opts->name) -+ return -EINVAL; -+ opts->name = kstrndup(name, -+ MAX_CGROUP_ROOT_NAMELEN - 1, -+ GFP_KERNEL); -+ if (!opts->name) -+ return -ENOMEM; -+ -+ continue; -+ } -+ -+ for_each_subsys(ss, i) { -+ if (strcmp(token, ss->name)) -+ continue; -+ if (ss->disabled) -+ continue; -+ -+ /* Mutually exclusive option 'all' + subsystem name */ -+ if (all_ss) -+ return -EINVAL; -+ set_bit(i, &opts->subsys_mask); -+ one_ss = true; -+ -+ break; -+ } -+ if (i == CGROUP_SUBSYS_COUNT) -+ return -ENOENT; -+ } -+ -+ /* -+ * If the 'all' option was specified select all the subsystems, -+ * otherwise if 'none', 'name=' and a subsystem name options -+ * were not specified, let's default to 'all' -+ */ -+ if (all_ss || (!one_ss && !opts->none && !opts->name)) -+ for_each_subsys(ss, i) -+ if (!ss->disabled) -+ set_bit(i, &opts->subsys_mask); -+ -+ /* Consistency checks */ -+ -+ if (opts->flags & CGRP_ROOT_SANE_BEHAVIOR) { -+ pr_warning("cgroup: sane_behavior: this is still under development and its behaviors will change, proceed at your own risk\n"); -+ -+ if (opts->flags & CGRP_ROOT_NOPREFIX) { -+ pr_err("cgroup: sane_behavior: noprefix is not allowed\n"); -+ return -EINVAL; -+ } -+ -+ if (opts->cpuset_clone_children) { -+ pr_err("cgroup: sane_behavior: clone_children is not allowed\n"); -+ return -EINVAL; -+ } -+ } -+ -+ /* -+ * Option noprefix was introduced just for backward compatibility -+ * with the old cpuset, so we allow noprefix only if mounting just -+ * the cpuset subsystem. -+ */ -+ if ((opts->flags & CGRP_ROOT_NOPREFIX) && (opts->subsys_mask & mask)) -+ return -EINVAL; -+ -+ -+ /* Can't specify "none" and some subsystems */ -+ if (opts->subsys_mask && opts->none) -+ return -EINVAL; -+ -+ /* -+ * We either have to specify by name or by subsystems. (So all -+ * empty hierarchies must have a name). -+ */ -+ if (!opts->subsys_mask && !opts->name) -+ return -EINVAL; -+ -+ return 0; -+} -+ -+static int cgroup_remount(struct super_block *sb, int *flags, char *data) -+{ -+ int ret = 0; -+ struct cgroupfs_root *root = sb->s_fs_info; -+ struct cgroup *cgrp = &root->top_cgroup; -+ struct cgroup_sb_opts opts; -+ unsigned long added_mask, removed_mask; -+ -+ if (root->flags & CGRP_ROOT_SANE_BEHAVIOR) { -+ pr_err("cgroup: sane_behavior: remount is not allowed\n"); -+ return -EINVAL; -+ } -+ -+ mutex_lock(&cgrp->dentry->d_inode->i_mutex); -+ mutex_lock(&cgroup_mutex); -+ mutex_lock(&cgroup_root_mutex); -+ -+ /* See what subsystems are wanted */ -+ ret = parse_cgroupfs_options(data, &opts); -+ if (ret) -+ goto out_unlock; -+ -+ if (opts.subsys_mask != root->subsys_mask || opts.release_agent) -+ pr_warning("cgroup: option changes via remount are deprecated (pid=%d comm=%s)\n", -+ task_tgid_nr(current), current->comm); -+ -+ added_mask = opts.subsys_mask & ~root->subsys_mask; -+ removed_mask = root->subsys_mask & ~opts.subsys_mask; -+ -+ /* Don't allow flags or name to change at remount */ -+ if (((opts.flags ^ root->flags) & CGRP_ROOT_OPTION_MASK) || -+ (opts.name && strcmp(opts.name, root->name))) { -+ pr_err("cgroup: option or name mismatch, new: 0x%lx \"%s\", old: 0x%lx \"%s\"\n", -+ opts.flags & CGRP_ROOT_OPTION_MASK, opts.name ?: "", -+ root->flags & CGRP_ROOT_OPTION_MASK, root->name); -+ ret = -EINVAL; -+ goto out_unlock; -+ } -+ -+ /* remounting is not allowed for populated hierarchies */ -+ if (root->number_of_cgroups > 1) { -+ ret = -EBUSY; -+ goto out_unlock; -+ } -+ -+ ret = rebind_subsystems(root, added_mask, removed_mask); -+ if (ret) -+ goto out_unlock; -+ -+ if (opts.release_agent) -+ strcpy(root->release_agent_path, opts.release_agent); -+ out_unlock: -+ kfree(opts.release_agent); -+ kfree(opts.name); -+ mutex_unlock(&cgroup_root_mutex); -+ mutex_unlock(&cgroup_mutex); -+ mutex_unlock(&cgrp->dentry->d_inode->i_mutex); -+ return ret; -+} -+ -+static const struct super_operations cgroup_ops = { -+ .statfs = simple_statfs, -+ .drop_inode = generic_delete_inode, -+ .show_options = cgroup_show_options, -+ .remount_fs = cgroup_remount, -+}; -+ -+static void init_cgroup_housekeeping(struct cgroup *cgrp) -+{ -+ INIT_LIST_HEAD(&cgrp->sibling); -+ INIT_LIST_HEAD(&cgrp->children); -+ INIT_LIST_HEAD(&cgrp->files); -+ INIT_LIST_HEAD(&cgrp->cset_links); -+ INIT_LIST_HEAD(&cgrp->release_list); -+ INIT_LIST_HEAD(&cgrp->pidlists); -+ mutex_init(&cgrp->pidlist_mutex); -+ cgrp->dummy_css.cgroup = cgrp; -+ INIT_LIST_HEAD(&cgrp->event_list); -+ spin_lock_init(&cgrp->event_list_lock); -+ simple_xattrs_init(&cgrp->xattrs); -+} -+ -+static void init_cgroup_root(struct cgroupfs_root *root) -+{ -+ struct cgroup *cgrp = &root->top_cgroup; -+ -+ INIT_LIST_HEAD(&root->subsys_list); -+ INIT_LIST_HEAD(&root->root_list); -+ root->number_of_cgroups = 1; -+ cgrp->root = root; -+ RCU_INIT_POINTER(cgrp->name, &root_cgroup_name); -+ init_cgroup_housekeeping(cgrp); -+ idr_init(&root->cgroup_idr); -+} -+ -+static int cgroup_init_root_id(struct cgroupfs_root *root, int start, int end) -+{ -+ int id; -+ -+ lockdep_assert_held(&cgroup_mutex); -+ lockdep_assert_held(&cgroup_root_mutex); -+ -+ id = idr_alloc_cyclic(&cgroup_hierarchy_idr, root, start, end, -+ GFP_KERNEL); -+ if (id < 0) -+ return id; -+ -+ root->hierarchy_id = id; -+ return 0; -+} -+ -+static void cgroup_exit_root_id(struct cgroupfs_root *root) -+{ -+ lockdep_assert_held(&cgroup_mutex); -+ lockdep_assert_held(&cgroup_root_mutex); -+ -+ if (root->hierarchy_id) { -+ idr_remove(&cgroup_hierarchy_idr, root->hierarchy_id); -+ root->hierarchy_id = 0; -+ } -+} -+ -+static int cgroup_test_super(struct super_block *sb, void *data) -+{ -+ struct cgroup_sb_opts *opts = data; -+ struct cgroupfs_root *root = sb->s_fs_info; -+ -+ /* If we asked for a name then it must match */ -+ if (opts->name && strcmp(opts->name, root->name)) -+ return 0; -+ -+ /* -+ * If we asked for subsystems (or explicitly for no -+ * subsystems) then they must match -+ */ -+ if ((opts->subsys_mask || opts->none) -+ && (opts->subsys_mask != root->subsys_mask)) -+ return 0; -+ -+ return 1; -+} -+ -+static struct cgroupfs_root *cgroup_root_from_opts(struct cgroup_sb_opts *opts) -+{ -+ struct cgroupfs_root *root; -+ -+ if (!opts->subsys_mask && !opts->none) -+ return NULL; -+ -+ root = kzalloc(sizeof(*root), GFP_KERNEL); -+ if (!root) -+ return ERR_PTR(-ENOMEM); -+ -+ init_cgroup_root(root); -+ -+ /* -+ * We need to set @root->subsys_mask now so that @root can be -+ * matched by cgroup_test_super() before it finishes -+ * initialization; otherwise, competing mounts with the same -+ * options may try to bind the same subsystems instead of waiting -+ * for the first one leading to unexpected mount errors. -+ * SUBSYS_BOUND will be set once actual binding is complete. -+ */ -+ root->subsys_mask = opts->subsys_mask; -+ root->flags = opts->flags; -+ if (opts->release_agent) -+ strcpy(root->release_agent_path, opts->release_agent); -+ if (opts->name) -+ strcpy(root->name, opts->name); -+ if (opts->cpuset_clone_children) -+ set_bit(CGRP_CPUSET_CLONE_CHILDREN, &root->top_cgroup.flags); -+ return root; -+} -+ -+static void cgroup_free_root(struct cgroupfs_root *root) -+{ -+ if (root) { -+ /* hierarhcy ID shoulid already have been released */ -+ WARN_ON_ONCE(root->hierarchy_id); -+ -+ idr_destroy(&root->cgroup_idr); -+ kfree(root); -+ } -+} -+ -+static int cgroup_set_super(struct super_block *sb, void *data) -+{ -+ int ret; -+ struct cgroup_sb_opts *opts = data; -+ -+ /* If we don't have a new root, we can't set up a new sb */ -+ if (!opts->new_root) -+ return -EINVAL; -+ -+ BUG_ON(!opts->subsys_mask && !opts->none); -+ -+ ret = set_anon_super(sb, NULL); -+ if (ret) -+ return ret; -+ -+ sb->s_fs_info = opts->new_root; -+ opts->new_root->sb = sb; -+ -+ sb->s_blocksize = PAGE_CACHE_SIZE; -+ sb->s_blocksize_bits = PAGE_CACHE_SHIFT; -+ sb->s_magic = CGROUP_SUPER_MAGIC; -+ sb->s_op = &cgroup_ops; -+ -+ return 0; -+} -+ -+static int cgroup_get_rootdir(struct super_block *sb) -+{ -+ static const struct dentry_operations cgroup_dops = { -+ .d_iput = cgroup_diput, -+ .d_delete = always_delete_dentry, -+ }; -+ -+ struct inode *inode = -+ cgroup_new_inode(S_IFDIR | S_IRUGO | S_IXUGO | S_IWUSR, sb); -+ -+ if (!inode) -+ return -ENOMEM; -+ -+ inode->i_fop = &simple_dir_operations; -+ inode->i_op = &cgroup_dir_inode_operations; -+ /* directories start off with i_nlink == 2 (for "." entry) */ -+ inc_nlink(inode); -+ sb->s_root = d_make_root(inode); -+ if (!sb->s_root) -+ return -ENOMEM; -+ /* for everything else we want ->d_op set */ -+ sb->s_d_op = &cgroup_dops; -+ return 0; -+} -+ -+static struct dentry *cgroup_mount(struct file_system_type *fs_type, -+ int flags, const char *unused_dev_name, -+ void *data) -+{ -+ struct cgroup_sb_opts opts; -+ struct cgroupfs_root *root; -+ int ret = 0; -+ struct super_block *sb; -+ struct cgroupfs_root *new_root; -+ struct list_head tmp_links; -+ struct inode *inode; -+ const struct cred *cred; -+ -+ /* First find the desired set of subsystems */ -+ mutex_lock(&cgroup_mutex); -+ ret = parse_cgroupfs_options(data, &opts); -+ mutex_unlock(&cgroup_mutex); -+ if (ret) -+ goto out_err; -+ -+ /* -+ * Allocate a new cgroup root. We may not need it if we're -+ * reusing an existing hierarchy. -+ */ -+ new_root = cgroup_root_from_opts(&opts); -+ if (IS_ERR(new_root)) { -+ ret = PTR_ERR(new_root); -+ goto out_err; -+ } -+ opts.new_root = new_root; -+ -+ /* Locate an existing or new sb for this hierarchy */ -+ sb = sget(fs_type, cgroup_test_super, cgroup_set_super, 0, &opts); -+ if (IS_ERR(sb)) { -+ ret = PTR_ERR(sb); -+ cgroup_free_root(opts.new_root); -+ goto out_err; -+ } -+ -+ root = sb->s_fs_info; -+ BUG_ON(!root); -+ if (root == opts.new_root) { -+ /* We used the new root structure, so this is a new hierarchy */ -+ struct cgroup *root_cgrp = &root->top_cgroup; -+ struct cgroupfs_root *existing_root; -+ int i; -+ struct css_set *cset; -+ -+ BUG_ON(sb->s_root != NULL); -+ -+ ret = cgroup_get_rootdir(sb); -+ if (ret) -+ goto drop_new_super; -+ inode = sb->s_root->d_inode; -+ -+ mutex_lock(&inode->i_mutex); -+ mutex_lock(&cgroup_mutex); -+ mutex_lock(&cgroup_root_mutex); -+ -+ ret = idr_alloc(&root->cgroup_idr, root_cgrp, 0, 1, GFP_KERNEL); -+ if (ret < 0) -+ goto unlock_drop; -+ root_cgrp->id = ret; -+ -+ /* Check for name clashes with existing mounts */ -+ ret = -EBUSY; -+ if (strlen(root->name)) -+ for_each_active_root(existing_root) -+ if (!strcmp(existing_root->name, root->name)) -+ goto unlock_drop; -+ -+ /* -+ * We're accessing css_set_count without locking -+ * css_set_lock here, but that's OK - it can only be -+ * increased by someone holding cgroup_lock, and -+ * that's us. The worst that can happen is that we -+ * have some link structures left over -+ */ -+ ret = allocate_cgrp_cset_links(css_set_count, &tmp_links); -+ if (ret) -+ goto unlock_drop; -+ -+ /* ID 0 is reserved for dummy root, 1 for unified hierarchy */ -+ ret = cgroup_init_root_id(root, 2, 0); -+ if (ret) -+ goto unlock_drop; -+ -+ sb->s_root->d_fsdata = root_cgrp; -+ root_cgrp->dentry = sb->s_root; -+ -+ /* -+ * We're inside get_sb() and will call lookup_one_len() to -+ * create the root files, which doesn't work if SELinux is -+ * in use. The following cred dancing somehow works around -+ * it. See 2ce9738ba ("cgroupfs: use init_cred when -+ * populating new cgroupfs mount") for more details. -+ */ -+ cred = override_creds(&init_cred); -+ -+ ret = cgroup_addrm_files(root_cgrp, cgroup_base_files, true); -+ if (ret) -+ goto rm_base_files; -+ -+ ret = rebind_subsystems(root, root->subsys_mask, 0); -+ if (ret) -+ goto rm_base_files; -+ -+ revert_creds(cred); -+ -+ /* -+ * There must be no failure case after here, since rebinding -+ * takes care of subsystems' refcounts, which are explicitly -+ * dropped in the failure exit path. -+ */ -+ -+ list_add(&root->root_list, &cgroup_roots); -+ cgroup_root_count++; -+ -+ /* Link the top cgroup in this hierarchy into all -+ * the css_set objects */ -+ write_lock(&css_set_lock); -+ hash_for_each(css_set_table, i, cset, hlist) -+ link_css_set(&tmp_links, cset, root_cgrp); -+ write_unlock(&css_set_lock); -+ -+ free_cgrp_cset_links(&tmp_links); -+ -+ BUG_ON(!list_empty(&root_cgrp->children)); -+ BUG_ON(root->number_of_cgroups != 1); -+ -+ mutex_unlock(&cgroup_root_mutex); -+ mutex_unlock(&cgroup_mutex); -+ mutex_unlock(&inode->i_mutex); -+ } else { -+ /* -+ * We re-used an existing hierarchy - the new root (if -+ * any) is not needed -+ */ -+ cgroup_free_root(opts.new_root); -+ -+ if ((root->flags ^ opts.flags) & CGRP_ROOT_OPTION_MASK) { -+ if ((root->flags | opts.flags) & CGRP_ROOT_SANE_BEHAVIOR) { -+ pr_err("cgroup: sane_behavior: new mount options should match the existing superblock\n"); -+ ret = -EINVAL; -+ goto drop_new_super; -+ } else { -+ pr_warning("cgroup: new mount options do not match the existing superblock, will be ignored\n"); -+ } -+ } -+ } -+ -+ kfree(opts.release_agent); -+ kfree(opts.name); -+ return dget(sb->s_root); -+ -+ rm_base_files: -+ free_cgrp_cset_links(&tmp_links); -+ cgroup_addrm_files(&root->top_cgroup, cgroup_base_files, false); -+ revert_creds(cred); -+ unlock_drop: -+ cgroup_exit_root_id(root); -+ mutex_unlock(&cgroup_root_mutex); -+ mutex_unlock(&cgroup_mutex); -+ mutex_unlock(&inode->i_mutex); -+ drop_new_super: -+ deactivate_locked_super(sb); -+ out_err: -+ kfree(opts.release_agent); -+ kfree(opts.name); -+ return ERR_PTR(ret); -+} -+ -+static void cgroup_kill_sb(struct super_block *sb) { -+ struct cgroupfs_root *root = sb->s_fs_info; -+ struct cgroup *cgrp = &root->top_cgroup; -+ struct cgrp_cset_link *link, *tmp_link; -+ int ret; -+ -+ BUG_ON(!root); -+ -+ BUG_ON(root->number_of_cgroups != 1); -+ BUG_ON(!list_empty(&cgrp->children)); -+ -+ mutex_lock(&cgrp->dentry->d_inode->i_mutex); -+ mutex_lock(&cgroup_mutex); -+ mutex_lock(&cgroup_root_mutex); -+ -+ /* Rebind all subsystems back to the default hierarchy */ -+ if (root->flags & CGRP_ROOT_SUBSYS_BOUND) { -+ ret = rebind_subsystems(root, 0, root->subsys_mask); -+ /* Shouldn't be able to fail ... */ -+ BUG_ON(ret); -+ } -+ -+ /* -+ * Release all the links from cset_links to this hierarchy's -+ * root cgroup -+ */ -+ write_lock(&css_set_lock); -+ -+ list_for_each_entry_safe(link, tmp_link, &cgrp->cset_links, cset_link) { -+ list_del(&link->cset_link); -+ list_del(&link->cgrp_link); -+ kfree(link); -+ } -+ write_unlock(&css_set_lock); -+ -+ if (!list_empty(&root->root_list)) { -+ list_del(&root->root_list); -+ cgroup_root_count--; -+ } -+ -+ cgroup_exit_root_id(root); -+ -+ mutex_unlock(&cgroup_root_mutex); -+ mutex_unlock(&cgroup_mutex); -+ mutex_unlock(&cgrp->dentry->d_inode->i_mutex); -+ -+ simple_xattrs_free(&cgrp->xattrs); -+ -+ kill_litter_super(sb); -+ cgroup_free_root(root); -+} -+ -+static struct file_system_type cgroup_fs_type = { -+ .name = "cgroup", -+ .mount = cgroup_mount, -+ .kill_sb = cgroup_kill_sb, -+}; -+ -+static struct kobject *cgroup_kobj; -+ -+/** -+ * cgroup_path - generate the path of a cgroup -+ * @cgrp: the cgroup in question -+ * @buf: the buffer to write the path into -+ * @buflen: the length of the buffer -+ * -+ * Writes path of cgroup into buf. Returns 0 on success, -errno on error. -+ * -+ * We can't generate cgroup path using dentry->d_name, as accessing -+ * dentry->name must be protected by irq-unsafe dentry->d_lock or parent -+ * inode's i_mutex, while on the other hand cgroup_path() can be called -+ * with some irq-safe spinlocks held. -+ */ -+int cgroup_path(const struct cgroup *cgrp, char *buf, int buflen) -+{ -+ int ret = -ENAMETOOLONG; -+ char *start; -+ -+ if (!cgrp->parent) { -+ if (strlcpy(buf, "/", buflen) >= buflen) -+ return -ENAMETOOLONG; -+ return 0; -+ } -+ -+ start = buf + buflen - 1; -+ *start = '\0'; -+ -+ rcu_read_lock(); -+ do { -+ const char *name = cgroup_name(cgrp); -+ int len; -+ -+ len = strlen(name); -+ if ((start -= len) < buf) -+ goto out; -+ memcpy(start, name, len); -+ -+ if (--start < buf) -+ goto out; -+ *start = '/'; -+ -+ cgrp = cgrp->parent; -+ } while (cgrp->parent); -+ ret = 0; -+ memmove(buf, start, buf + buflen - start); -+out: -+ rcu_read_unlock(); -+ return ret; -+} -+EXPORT_SYMBOL_GPL(cgroup_path); -+ -+/** -+ * task_cgroup_path - cgroup path of a task in the first cgroup hierarchy -+ * @task: target task -+ * @buf: the buffer to write the path into -+ * @buflen: the length of the buffer -+ * -+ * Determine @task's cgroup on the first (the one with the lowest non-zero -+ * hierarchy_id) cgroup hierarchy and copy its path into @buf. This -+ * function grabs cgroup_mutex and shouldn't be used inside locks used by -+ * cgroup controller callbacks. -+ * -+ * Returns 0 on success, fails with -%ENAMETOOLONG if @buflen is too short. -+ */ -+int task_cgroup_path(struct task_struct *task, char *buf, size_t buflen) -+{ -+ struct cgroupfs_root *root; -+ struct cgroup *cgrp; -+ int hierarchy_id = 1, ret = 0; -+ -+ if (buflen < 2) -+ return -ENAMETOOLONG; -+ -+ mutex_lock(&cgroup_mutex); -+ -+ root = idr_get_next(&cgroup_hierarchy_idr, &hierarchy_id); -+ -+ if (root) { -+ cgrp = task_cgroup_from_root(task, root); -+ ret = cgroup_path(cgrp, buf, buflen); -+ } else { -+ /* if no hierarchy exists, everyone is in "/" */ -+ memcpy(buf, "/", 2); -+ } -+ -+ mutex_unlock(&cgroup_mutex); -+ return ret; -+} -+EXPORT_SYMBOL_GPL(task_cgroup_path); -+ -+/* -+ * Control Group taskset -+ */ -+struct task_and_cgroup { -+ struct task_struct *task; -+ struct cgroup *cgrp; -+ struct css_set *cset; -+}; -+ -+struct cgroup_taskset { -+ struct task_and_cgroup single; -+ struct flex_array *tc_array; -+ int tc_array_len; -+ int idx; -+ struct cgroup *cur_cgrp; -+}; -+ -+/** -+ * cgroup_taskset_first - reset taskset and return the first task -+ * @tset: taskset of interest -+ * -+ * @tset iteration is initialized and the first task is returned. -+ */ -+struct task_struct *cgroup_taskset_first(struct cgroup_taskset *tset) -+{ -+ if (tset->tc_array) { -+ tset->idx = 0; -+ return cgroup_taskset_next(tset); -+ } else { -+ tset->cur_cgrp = tset->single.cgrp; -+ return tset->single.task; -+ } -+} -+EXPORT_SYMBOL_GPL(cgroup_taskset_first); -+ -+/** -+ * cgroup_taskset_next - iterate to the next task in taskset -+ * @tset: taskset of interest -+ * -+ * Return the next task in @tset. Iteration must have been initialized -+ * with cgroup_taskset_first(). -+ */ -+struct task_struct *cgroup_taskset_next(struct cgroup_taskset *tset) -+{ -+ struct task_and_cgroup *tc; -+ -+ if (!tset->tc_array || tset->idx >= tset->tc_array_len) -+ return NULL; -+ -+ tc = flex_array_get(tset->tc_array, tset->idx++); -+ tset->cur_cgrp = tc->cgrp; -+ return tc->task; -+} -+EXPORT_SYMBOL_GPL(cgroup_taskset_next); -+ -+/** -+ * cgroup_taskset_cur_css - return the matching css for the current task -+ * @tset: taskset of interest -+ * @subsys_id: the ID of the target subsystem -+ * -+ * Return the css for the current (last returned) task of @tset for -+ * subsystem specified by @subsys_id. This function must be preceded by -+ * either cgroup_taskset_first() or cgroup_taskset_next(). -+ */ -+struct cgroup_subsys_state *cgroup_taskset_cur_css(struct cgroup_taskset *tset, -+ int subsys_id) -+{ -+ return cgroup_css(tset->cur_cgrp, cgroup_subsys[subsys_id]); -+} -+EXPORT_SYMBOL_GPL(cgroup_taskset_cur_css); -+ -+/** -+ * cgroup_taskset_size - return the number of tasks in taskset -+ * @tset: taskset of interest -+ */ -+int cgroup_taskset_size(struct cgroup_taskset *tset) -+{ -+ return tset->tc_array ? tset->tc_array_len : 1; -+} -+EXPORT_SYMBOL_GPL(cgroup_taskset_size); -+ -+ -+/* -+ * cgroup_task_migrate - move a task from one cgroup to another. -+ * -+ * Must be called with cgroup_mutex and threadgroup locked. -+ */ -+static void cgroup_task_migrate(struct cgroup *old_cgrp, -+ struct task_struct *tsk, -+ struct css_set *new_cset) -+{ -+ struct css_set *old_cset; -+ -+ /* -+ * We are synchronized through threadgroup_lock() against PF_EXITING -+ * setting such that we can't race against cgroup_exit() changing the -+ * css_set to init_css_set and dropping the old one. -+ */ -+ WARN_ON_ONCE(tsk->flags & PF_EXITING); -+ old_cset = task_css_set(tsk); -+ -+ task_lock(tsk); -+ rcu_assign_pointer(tsk->cgroups, new_cset); -+ task_unlock(tsk); -+ -+ /* Update the css_set linked lists if we're using them */ -+ write_lock(&css_set_lock); -+ if (!list_empty(&tsk->cg_list)) -+ list_move(&tsk->cg_list, &new_cset->tasks); -+ write_unlock(&css_set_lock); -+ -+ /* -+ * We just gained a reference on old_cset by taking it from the -+ * task. As trading it for new_cset is protected by cgroup_mutex, -+ * we're safe to drop it here; it will be freed under RCU. -+ */ -+ set_bit(CGRP_RELEASABLE, &old_cgrp->flags); -+ put_css_set(old_cset); -+} -+ -+/** -+ * cgroup_attach_task - attach a task or a whole threadgroup to a cgroup -+ * @cgrp: the cgroup to attach to -+ * @tsk: the task or the leader of the threadgroup to be attached -+ * @threadgroup: attach the whole threadgroup? -+ * -+ * Call holding cgroup_mutex and the group_rwsem of the leader. Will take -+ * task_lock of @tsk or each thread in the threadgroup individually in turn. -+ */ -+static int cgroup_attach_task(struct cgroup *cgrp, struct task_struct *tsk, -+ bool threadgroup) -+{ -+ int retval, i, group_size; -+ struct cgroup_subsys *ss, *failed_ss = NULL; -+ struct cgroupfs_root *root = cgrp->root; -+ /* threadgroup list cursor and array */ -+ struct task_struct *leader = tsk; -+ struct task_and_cgroup *tc; -+ struct flex_array *group; -+ struct cgroup_taskset tset = { }; -+ -+ /* -+ * step 0: in order to do expensive, possibly blocking operations for -+ * every thread, we cannot iterate the thread group list, since it needs -+ * rcu or tasklist locked. instead, build an array of all threads in the -+ * group - group_rwsem prevents new threads from appearing, and if -+ * threads exit, this will just be an over-estimate. -+ */ -+ if (threadgroup) -+ group_size = get_nr_threads(tsk); -+ else -+ group_size = 1; -+ /* flex_array supports very large thread-groups better than kmalloc. */ -+ group = flex_array_alloc(sizeof(*tc), group_size, GFP_KERNEL); -+ if (!group) -+ return -ENOMEM; -+ /* pre-allocate to guarantee space while iterating in rcu read-side. */ -+ retval = flex_array_prealloc(group, 0, group_size, GFP_KERNEL); -+ if (retval) -+ goto out_free_group_list; -+ -+ i = 0; -+ /* -+ * Prevent freeing of tasks while we take a snapshot. Tasks that are -+ * already PF_EXITING could be freed from underneath us unless we -+ * take an rcu_read_lock. -+ */ -+ rcu_read_lock(); -+ do { -+ struct task_and_cgroup ent; -+ -+ /* @tsk either already exited or can't exit until the end */ -+ if (tsk->flags & PF_EXITING) -+ goto next; -+ -+ /* as per above, nr_threads may decrease, but not increase. */ -+ BUG_ON(i >= group_size); -+ ent.task = tsk; -+ ent.cgrp = task_cgroup_from_root(tsk, root); -+ /* nothing to do if this task is already in the cgroup */ -+ if (ent.cgrp == cgrp) -+ goto next; -+ /* -+ * saying GFP_ATOMIC has no effect here because we did prealloc -+ * earlier, but it's good form to communicate our expectations. -+ */ -+ retval = flex_array_put(group, i, &ent, GFP_ATOMIC); -+ BUG_ON(retval != 0); -+ i++; -+ next: -+ if (!threadgroup) -+ break; -+ } while_each_thread(leader, tsk); -+ rcu_read_unlock(); -+ /* remember the number of threads in the array for later. */ -+ group_size = i; -+ tset.tc_array = group; -+ tset.tc_array_len = group_size; -+ -+ /* methods shouldn't be called if no task is actually migrating */ -+ retval = 0; -+ if (!group_size) -+ goto out_free_group_list; -+ -+ /* -+ * step 1: check that we can legitimately attach to the cgroup. -+ */ -+ for_each_root_subsys(root, ss) { -+ struct cgroup_subsys_state *css = cgroup_css(cgrp, ss); -+ -+ if (ss->can_attach) { -+ retval = ss->can_attach(css, &tset); -+ if (retval) { -+ failed_ss = ss; -+ goto out_cancel_attach; -+ } -+ } -+ } -+ -+ /* -+ * step 2: make sure css_sets exist for all threads to be migrated. -+ * we use find_css_set, which allocates a new one if necessary. -+ */ -+ for (i = 0; i < group_size; i++) { -+ struct css_set *old_cset; -+ -+ tc = flex_array_get(group, i); -+ old_cset = task_css_set(tc->task); -+ tc->cset = find_css_set(old_cset, cgrp); -+ if (!tc->cset) { -+ retval = -ENOMEM; -+ goto out_put_css_set_refs; -+ } -+ } -+ -+ /* -+ * step 3: now that we're guaranteed success wrt the css_sets, -+ * proceed to move all tasks to the new cgroup. There are no -+ * failure cases after here, so this is the commit point. -+ */ -+ for (i = 0; i < group_size; i++) { -+ tc = flex_array_get(group, i); -+ cgroup_task_migrate(tc->cgrp, tc->task, tc->cset); -+ } -+ /* nothing is sensitive to fork() after this point. */ -+ -+ /* -+ * step 4: do subsystem attach callbacks. -+ */ -+ for_each_root_subsys(root, ss) { -+ struct cgroup_subsys_state *css = cgroup_css(cgrp, ss); -+ -+ if (ss->attach) -+ ss->attach(css, &tset); -+ } -+ -+ /* -+ * step 5: success! and cleanup -+ */ -+ retval = 0; -+out_put_css_set_refs: -+ if (retval) { -+ for (i = 0; i < group_size; i++) { -+ tc = flex_array_get(group, i); -+ if (!tc->cset) -+ break; -+ put_css_set(tc->cset); -+ } -+ } -+out_cancel_attach: -+ if (retval) { -+ for_each_root_subsys(root, ss) { -+ struct cgroup_subsys_state *css = cgroup_css(cgrp, ss); -+ -+ if (ss == failed_ss) -+ break; -+ if (ss->cancel_attach) -+ ss->cancel_attach(css, &tset); -+ } -+ } -+out_free_group_list: -+ flex_array_free(group); -+ return retval; -+} -+ -+/* -+ * Find the task_struct of the task to attach by vpid and pass it along to the -+ * function to attach either it or all tasks in its threadgroup. Will lock -+ * cgroup_mutex and threadgroup; may take task_lock of task. -+ */ -+static int attach_task_by_pid(struct cgroup *cgrp, u64 pid, bool threadgroup) -+{ -+ struct task_struct *tsk; -+ const struct cred *cred = current_cred(), *tcred; -+ int ret; -+ -+ if (!cgroup_lock_live_group(cgrp)) -+ return -ENODEV; -+ -+retry_find_task: -+ rcu_read_lock(); -+ if (pid) { -+ tsk = find_task_by_vpid(pid); -+ if (!tsk) { -+ rcu_read_unlock(); -+ ret= -ESRCH; -+ goto out_unlock_cgroup; -+ } -+ /* -+ * even if we're attaching all tasks in the thread group, we -+ * only need to check permissions on one of them. -+ */ -+ tcred = __task_cred(tsk); -+ if (!uid_eq(cred->euid, GLOBAL_ROOT_UID) && -+ !uid_eq(cred->euid, tcred->uid) && -+ !uid_eq(cred->euid, tcred->suid)) { -+ rcu_read_unlock(); -+ ret = -EACCES; -+ goto out_unlock_cgroup; -+ } -+ } else -+ tsk = current; -+ -+ if (threadgroup) -+ tsk = tsk->group_leader; -+ -+ /* -+ * Workqueue threads may acquire PF_NO_SETAFFINITY and become -+ * trapped in a cpuset, or RT worker may be born in a cgroup -+ * with no rt_runtime allocated. Just say no. -+ */ -+ if (tsk == kthreadd_task || (tsk->flags & PF_NO_SETAFFINITY)) { -+ ret = -EINVAL; -+ rcu_read_unlock(); -+ goto out_unlock_cgroup; -+ } -+ -+ get_task_struct(tsk); -+ rcu_read_unlock(); -+ -+ threadgroup_lock(tsk); -+ if (threadgroup) { -+ if (!thread_group_leader(tsk)) { -+ /* -+ * a race with de_thread from another thread's exec() -+ * may strip us of our leadership, if this happens, -+ * there is no choice but to throw this task away and -+ * try again; this is -+ * "double-double-toil-and-trouble-check locking". -+ */ -+ threadgroup_unlock(tsk); -+ put_task_struct(tsk); -+ goto retry_find_task; -+ } -+ } -+ -+ ret = cgroup_attach_task(cgrp, tsk, threadgroup); -+ -+ threadgroup_unlock(tsk); -+ -+ put_task_struct(tsk); -+out_unlock_cgroup: -+ mutex_unlock(&cgroup_mutex); -+ return ret; -+} -+ -+/** -+ * cgroup_attach_task_all - attach task 'tsk' to all cgroups of task 'from' -+ * @from: attach to all cgroups of a given task -+ * @tsk: the task to be attached -+ */ -+int cgroup_attach_task_all(struct task_struct *from, struct task_struct *tsk) -+{ -+ struct cgroupfs_root *root; -+ int retval = 0; -+ -+ mutex_lock(&cgroup_mutex); -+ for_each_active_root(root) { -+ struct cgroup *from_cgrp = task_cgroup_from_root(from, root); -+ -+ retval = cgroup_attach_task(from_cgrp, tsk, false); -+ if (retval) -+ break; -+ } -+ mutex_unlock(&cgroup_mutex); -+ -+ return retval; -+} -+EXPORT_SYMBOL_GPL(cgroup_attach_task_all); -+ -+static int cgroup_tasks_write(struct cgroup_subsys_state *css, -+ struct cftype *cft, u64 pid) -+{ -+ return attach_task_by_pid(css->cgroup, pid, false); -+} -+ -+static int cgroup_procs_write(struct cgroup_subsys_state *css, -+ struct cftype *cft, u64 tgid) -+{ -+ return attach_task_by_pid(css->cgroup, tgid, true); -+} -+ -+static int cgroup_release_agent_write(struct cgroup_subsys_state *css, -+ struct cftype *cft, const char *buffer) -+{ -+ BUILD_BUG_ON(sizeof(css->cgroup->root->release_agent_path) < PATH_MAX); -+ if (strlen(buffer) >= PATH_MAX) -+ return -EINVAL; -+ if (!cgroup_lock_live_group(css->cgroup)) -+ return -ENODEV; -+ mutex_lock(&cgroup_root_mutex); -+ strcpy(css->cgroup->root->release_agent_path, buffer); -+ mutex_unlock(&cgroup_root_mutex); -+ mutex_unlock(&cgroup_mutex); -+ return 0; -+} -+ -+static int cgroup_release_agent_show(struct cgroup_subsys_state *css, -+ struct cftype *cft, struct seq_file *seq) -+{ -+ struct cgroup *cgrp = css->cgroup; -+ -+ if (!cgroup_lock_live_group(cgrp)) -+ return -ENODEV; -+ seq_puts(seq, cgrp->root->release_agent_path); -+ seq_putc(seq, '\n'); -+ mutex_unlock(&cgroup_mutex); -+ return 0; -+} -+ -+static int cgroup_sane_behavior_show(struct cgroup_subsys_state *css, -+ struct cftype *cft, struct seq_file *seq) -+{ -+ seq_printf(seq, "%d\n", cgroup_sane_behavior(css->cgroup)); -+ return 0; -+} -+ -+/* A buffer size big enough for numbers or short strings */ -+#define CGROUP_LOCAL_BUFFER_SIZE 64 -+ -+static ssize_t cgroup_write_X64(struct cgroup_subsys_state *css, -+ struct cftype *cft, struct file *file, -+ const char __user *userbuf, size_t nbytes, -+ loff_t *unused_ppos) -+{ -+ char buffer[CGROUP_LOCAL_BUFFER_SIZE]; -+ int retval = 0; -+ char *end; -+ -+ if (!nbytes) -+ return -EINVAL; -+ if (nbytes >= sizeof(buffer)) -+ return -E2BIG; -+ if (copy_from_user(buffer, userbuf, nbytes)) -+ return -EFAULT; -+ -+ buffer[nbytes] = 0; /* nul-terminate */ -+ if (cft->write_u64) { -+ u64 val = simple_strtoull(strstrip(buffer), &end, 0); -+ if (*end) -+ return -EINVAL; -+ retval = cft->write_u64(css, cft, val); -+ } else { -+ s64 val = simple_strtoll(strstrip(buffer), &end, 0); -+ if (*end) -+ return -EINVAL; -+ retval = cft->write_s64(css, cft, val); -+ } -+ if (!retval) -+ retval = nbytes; -+ return retval; -+} -+ -+static ssize_t cgroup_write_string(struct cgroup_subsys_state *css, -+ struct cftype *cft, struct file *file, -+ const char __user *userbuf, size_t nbytes, -+ loff_t *unused_ppos) -+{ -+ char local_buffer[CGROUP_LOCAL_BUFFER_SIZE]; -+ int retval = 0; -+ size_t max_bytes = cft->max_write_len; -+ char *buffer = local_buffer; -+ -+ if (!max_bytes) -+ max_bytes = sizeof(local_buffer) - 1; -+ if (nbytes >= max_bytes) -+ return -E2BIG; -+ /* Allocate a dynamic buffer if we need one */ -+ if (nbytes >= sizeof(local_buffer)) { -+ buffer = kmalloc(nbytes + 1, GFP_KERNEL); -+ if (buffer == NULL) -+ return -ENOMEM; -+ } -+ if (nbytes && copy_from_user(buffer, userbuf, nbytes)) { -+ retval = -EFAULT; -+ goto out; -+ } -+ -+ buffer[nbytes] = 0; /* nul-terminate */ -+ retval = cft->write_string(css, cft, strstrip(buffer)); -+ if (!retval) -+ retval = nbytes; -+out: -+ if (buffer != local_buffer) -+ kfree(buffer); -+ return retval; -+} -+ -+static ssize_t cgroup_file_write(struct file *file, const char __user *buf, -+ size_t nbytes, loff_t *ppos) -+{ -+ struct cfent *cfe = __d_cfe(file->f_dentry); -+ struct cftype *cft = __d_cft(file->f_dentry); -+ struct cgroup_subsys_state *css = cfe->css; -+ -+ if (cft->write) -+ return cft->write(css, cft, file, buf, nbytes, ppos); -+ if (cft->write_u64 || cft->write_s64) -+ return cgroup_write_X64(css, cft, file, buf, nbytes, ppos); -+ if (cft->write_string) -+ return cgroup_write_string(css, cft, file, buf, nbytes, ppos); -+ if (cft->trigger) { -+ int ret = cft->trigger(css, (unsigned int)cft->private); -+ return ret ? ret : nbytes; -+ } -+ return -EINVAL; -+} -+ -+static ssize_t cgroup_read_u64(struct cgroup_subsys_state *css, -+ struct cftype *cft, struct file *file, -+ char __user *buf, size_t nbytes, loff_t *ppos) -+{ -+ char tmp[CGROUP_LOCAL_BUFFER_SIZE]; -+ u64 val = cft->read_u64(css, cft); -+ int len = sprintf(tmp, "%llu\n", (unsigned long long) val); -+ -+ return simple_read_from_buffer(buf, nbytes, ppos, tmp, len); -+} -+ -+static ssize_t cgroup_read_s64(struct cgroup_subsys_state *css, -+ struct cftype *cft, struct file *file, -+ char __user *buf, size_t nbytes, loff_t *ppos) -+{ -+ char tmp[CGROUP_LOCAL_BUFFER_SIZE]; -+ s64 val = cft->read_s64(css, cft); -+ int len = sprintf(tmp, "%lld\n", (long long) val); -+ -+ return simple_read_from_buffer(buf, nbytes, ppos, tmp, len); -+} -+ -+static ssize_t cgroup_file_read(struct file *file, char __user *buf, -+ size_t nbytes, loff_t *ppos) -+{ -+ struct cfent *cfe = __d_cfe(file->f_dentry); -+ struct cftype *cft = __d_cft(file->f_dentry); -+ struct cgroup_subsys_state *css = cfe->css; -+ -+ if (cft->read) -+ return cft->read(css, cft, file, buf, nbytes, ppos); -+ if (cft->read_u64) -+ return cgroup_read_u64(css, cft, file, buf, nbytes, ppos); -+ if (cft->read_s64) -+ return cgroup_read_s64(css, cft, file, buf, nbytes, ppos); -+ return -EINVAL; -+} -+ -+/* -+ * seqfile ops/methods for returning structured data. Currently just -+ * supports string->u64 maps, but can be extended in future. -+ */ -+ -+static int cgroup_map_add(struct cgroup_map_cb *cb, const char *key, u64 value) -+{ -+ struct seq_file *sf = cb->state; -+ return seq_printf(sf, "%s %llu\n", key, (unsigned long long)value); -+} -+ -+static int cgroup_seqfile_show(struct seq_file *m, void *arg) -+{ -+ struct cfent *cfe = m->private; -+ struct cftype *cft = cfe->type; -+ struct cgroup_subsys_state *css = cfe->css; -+ -+ if (cft->read_map) { -+ struct cgroup_map_cb cb = { -+ .fill = cgroup_map_add, -+ .state = m, -+ }; -+ return cft->read_map(css, cft, &cb); -+ } -+ return cft->read_seq_string(css, cft, m); -+} -+ -+static const struct file_operations cgroup_seqfile_operations = { -+ .read = seq_read, -+ .write = cgroup_file_write, -+ .llseek = seq_lseek, -+ .release = cgroup_file_release, -+}; -+ -+static int cgroup_file_open(struct inode *inode, struct file *file) -+{ -+ struct cfent *cfe = __d_cfe(file->f_dentry); -+ struct cftype *cft = __d_cft(file->f_dentry); -+ struct cgroup *cgrp = __d_cgrp(cfe->dentry->d_parent); -+ struct cgroup_subsys_state *css; -+ int err; -+ -+ err = generic_file_open(inode, file); -+ if (err) -+ return err; -+ -+ /* -+ * If the file belongs to a subsystem, pin the css. Will be -+ * unpinned either on open failure or release. This ensures that -+ * @css stays alive for all file operations. -+ */ -+ rcu_read_lock(); -+ css = cgroup_css(cgrp, cft->ss); -+ if (cft->ss && !css_tryget(css)) -+ css = NULL; -+ rcu_read_unlock(); -+ -+ if (!css) -+ return -ENODEV; -+ -+ /* -+ * @cfe->css is used by read/write/close to determine the -+ * associated css. @file->private_data would be a better place but -+ * that's already used by seqfile. Multiple accessors may use it -+ * simultaneously which is okay as the association never changes. -+ */ -+ WARN_ON_ONCE(cfe->css && cfe->css != css); -+ cfe->css = css; -+ -+ if (cft->read_map || cft->read_seq_string) { -+ file->f_op = &cgroup_seqfile_operations; -+ err = single_open(file, cgroup_seqfile_show, cfe); -+ } else if (cft->open) { -+ err = cft->open(inode, file); -+ } -+ -+ if (css->ss && err) -+ css_put(css); -+ return err; -+} -+ -+static int cgroup_file_release(struct inode *inode, struct file *file) -+{ -+ struct cfent *cfe = __d_cfe(file->f_dentry); -+ struct cftype *cft = __d_cft(file->f_dentry); -+ struct cgroup_subsys_state *css = cfe->css; -+ int ret = 0; -+ -+ if (cft->release) -+ ret = cft->release(inode, file); -+ if (css->ss) -+ css_put(css); -+ if (file->f_op == &cgroup_seqfile_operations) -+ single_release(inode, file); -+ return ret; -+} -+ -+/* -+ * cgroup_rename - Only allow simple rename of directories in place. -+ */ -+static int cgroup_rename(struct inode *old_dir, struct dentry *old_dentry, -+ struct inode *new_dir, struct dentry *new_dentry) -+{ -+ int ret; -+ struct cgroup_name *name, *old_name; -+ struct cgroup *cgrp; -+ -+ /* -+ * It's convinient to use parent dir's i_mutex to protected -+ * cgrp->name. -+ */ -+ lockdep_assert_held(&old_dir->i_mutex); -+ -+ if (!S_ISDIR(old_dentry->d_inode->i_mode)) -+ return -ENOTDIR; -+ if (new_dentry->d_inode) -+ return -EEXIST; -+ if (old_dir != new_dir) -+ return -EIO; -+ -+ cgrp = __d_cgrp(old_dentry); -+ -+ /* -+ * This isn't a proper migration and its usefulness is very -+ * limited. Disallow if sane_behavior. -+ */ -+ if (cgroup_sane_behavior(cgrp)) -+ return -EPERM; -+ -+ name = cgroup_alloc_name(new_dentry); -+ if (!name) -+ return -ENOMEM; -+ -+ ret = simple_rename(old_dir, old_dentry, new_dir, new_dentry); -+ if (ret) { -+ kfree(name); -+ return ret; -+ } -+ -+ old_name = rcu_dereference_protected(cgrp->name, true); -+ rcu_assign_pointer(cgrp->name, name); -+ -+ kfree_rcu(old_name, rcu_head); -+ return 0; -+} -+ -+static struct simple_xattrs *__d_xattrs(struct dentry *dentry) -+{ -+ if (S_ISDIR(dentry->d_inode->i_mode)) -+ return &__d_cgrp(dentry)->xattrs; -+ else -+ return &__d_cfe(dentry)->xattrs; -+} -+ -+static inline int xattr_enabled(struct dentry *dentry) -+{ -+ struct cgroupfs_root *root = dentry->d_sb->s_fs_info; -+ return root->flags & CGRP_ROOT_XATTR; -+} -+ -+static bool is_valid_xattr(const char *name) -+{ -+ if (!strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN) || -+ !strncmp(name, XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN)) -+ return true; -+ return false; -+} -+ -+static int cgroup_setxattr(struct dentry *dentry, const char *name, -+ const void *val, size_t size, int flags) -+{ -+ if (!xattr_enabled(dentry)) -+ return -EOPNOTSUPP; -+ if (!is_valid_xattr(name)) -+ return -EINVAL; -+ return simple_xattr_set(__d_xattrs(dentry), name, val, size, flags); -+} -+ -+static int cgroup_removexattr(struct dentry *dentry, const char *name) -+{ -+ if (!xattr_enabled(dentry)) -+ return -EOPNOTSUPP; -+ if (!is_valid_xattr(name)) -+ return -EINVAL; -+ return simple_xattr_remove(__d_xattrs(dentry), name); -+} -+ -+static ssize_t cgroup_getxattr(struct dentry *dentry, const char *name, -+ void *buf, size_t size) -+{ -+ if (!xattr_enabled(dentry)) -+ return -EOPNOTSUPP; -+ if (!is_valid_xattr(name)) -+ return -EINVAL; -+ return simple_xattr_get(__d_xattrs(dentry), name, buf, size); -+} -+ -+static ssize_t cgroup_listxattr(struct dentry *dentry, char *buf, size_t size) -+{ -+ if (!xattr_enabled(dentry)) -+ return -EOPNOTSUPP; -+ return simple_xattr_list(__d_xattrs(dentry), buf, size); -+} -+ -+static const struct file_operations cgroup_file_operations = { -+ .read = cgroup_file_read, -+ .write = cgroup_file_write, -+ .llseek = generic_file_llseek, -+ .open = cgroup_file_open, -+ .release = cgroup_file_release, -+}; -+ -+static const struct inode_operations cgroup_file_inode_operations = { -+ .setxattr = cgroup_setxattr, -+ .getxattr = cgroup_getxattr, -+ .listxattr = cgroup_listxattr, -+ .removexattr = cgroup_removexattr, -+}; -+ -+static const struct inode_operations cgroup_dir_inode_operations = { -+ .lookup = simple_lookup, -+ .mkdir = cgroup_mkdir, -+ .rmdir = cgroup_rmdir, -+ .rename = cgroup_rename, -+ .setxattr = cgroup_setxattr, -+ .getxattr = cgroup_getxattr, -+ .listxattr = cgroup_listxattr, -+ .removexattr = cgroup_removexattr, -+}; -+ -+/* -+ * Check if a file is a control file -+ */ -+static inline struct cftype *__file_cft(struct file *file) -+{ -+ if (file_inode(file)->i_fop != &cgroup_file_operations) -+ return ERR_PTR(-EINVAL); -+ return __d_cft(file->f_dentry); -+} -+ -+static int cgroup_create_file(struct dentry *dentry, umode_t mode, -+ struct super_block *sb) -+{ -+ struct inode *inode; -+ -+ if (!dentry) -+ return -ENOENT; -+ if (dentry->d_inode) -+ return -EEXIST; -+ -+ inode = cgroup_new_inode(mode, sb); -+ if (!inode) -+ return -ENOMEM; -+ -+ if (S_ISDIR(mode)) { -+ inode->i_op = &cgroup_dir_inode_operations; -+ inode->i_fop = &simple_dir_operations; -+ -+ /* start off with i_nlink == 2 (for "." entry) */ -+ inc_nlink(inode); -+ inc_nlink(dentry->d_parent->d_inode); -+ -+ /* -+ * Control reaches here with cgroup_mutex held. -+ * @inode->i_mutex should nest outside cgroup_mutex but we -+ * want to populate it immediately without releasing -+ * cgroup_mutex. As @inode isn't visible to anyone else -+ * yet, trylock will always succeed without affecting -+ * lockdep checks. -+ */ -+ WARN_ON_ONCE(!mutex_trylock(&inode->i_mutex)); -+ } else if (S_ISREG(mode)) { -+ inode->i_size = 0; -+ inode->i_fop = &cgroup_file_operations; -+ inode->i_op = &cgroup_file_inode_operations; -+ } -+ d_instantiate(dentry, inode); -+ dget(dentry); /* Extra count - pin the dentry in core */ -+ return 0; -+} -+ -+/** -+ * cgroup_file_mode - deduce file mode of a control file -+ * @cft: the control file in question -+ * -+ * returns cft->mode if ->mode is not 0 -+ * returns S_IRUGO|S_IWUSR if it has both a read and a write handler -+ * returns S_IRUGO if it has only a read handler -+ * returns S_IWUSR if it has only a write hander -+ */ -+static umode_t cgroup_file_mode(const struct cftype *cft) -+{ -+ umode_t mode = 0; -+ -+ if (cft->mode) -+ return cft->mode; -+ -+ if (cft->read || cft->read_u64 || cft->read_s64 || -+ cft->read_map || cft->read_seq_string) -+ mode |= S_IRUGO; -+ -+ if (cft->write || cft->write_u64 || cft->write_s64 || -+ cft->write_string || cft->trigger) -+ mode |= S_IWUSR; -+ -+ return mode; -+} -+ -+static int cgroup_add_file(struct cgroup *cgrp, struct cftype *cft) -+{ -+ struct dentry *dir = cgrp->dentry; -+ struct cgroup *parent = __d_cgrp(dir); -+ struct dentry *dentry; -+ struct cfent *cfe; -+ int error; -+ umode_t mode; -+ char name[MAX_CGROUP_TYPE_NAMELEN + MAX_CFTYPE_NAME + 2] = { 0 }; -+ -+ if (cft->ss && !(cft->flags & CFTYPE_NO_PREFIX) && -+ !(cgrp->root->flags & CGRP_ROOT_NOPREFIX)) { -+ strcpy(name, cft->ss->name); -+ strcat(name, "."); -+ } -+ strcat(name, cft->name); -+ -+ BUG_ON(!mutex_is_locked(&dir->d_inode->i_mutex)); -+ -+ cfe = kzalloc(sizeof(*cfe), GFP_KERNEL); -+ if (!cfe) -+ return -ENOMEM; -+ -+ dentry = lookup_one_len(name, dir, strlen(name)); -+ if (IS_ERR(dentry)) { -+ error = PTR_ERR(dentry); -+ goto out; -+ } -+ -+ cfe->type = (void *)cft; -+ cfe->dentry = dentry; -+ dentry->d_fsdata = cfe; -+ simple_xattrs_init(&cfe->xattrs); -+ -+ mode = cgroup_file_mode(cft); -+ error = cgroup_create_file(dentry, mode | S_IFREG, cgrp->root->sb); -+ if (!error) { -+ list_add_tail(&cfe->node, &parent->files); -+ cfe = NULL; -+ } -+ dput(dentry); -+out: -+ kfree(cfe); -+ return error; -+} -+ -+/** -+ * cgroup_addrm_files - add or remove files to a cgroup directory -+ * @cgrp: the target cgroup -+ * @cfts: array of cftypes to be added -+ * @is_add: whether to add or remove -+ * -+ * Depending on @is_add, add or remove files defined by @cfts on @cgrp. -+ * For removals, this function never fails. If addition fails, this -+ * function doesn't remove files already added. The caller is responsible -+ * for cleaning up. -+ */ -+static int cgroup_addrm_files(struct cgroup *cgrp, struct cftype cfts[], -+ bool is_add) -+{ -+ struct cftype *cft; -+ int ret; -+ -+ lockdep_assert_held(&cgrp->dentry->d_inode->i_mutex); -+ lockdep_assert_held(&cgroup_mutex); -+ -+ for (cft = cfts; cft->name[0] != '\0'; cft++) { -+ /* does cft->flags tell us to skip this file on @cgrp? */ -+ if ((cft->flags & CFTYPE_INSANE) && cgroup_sane_behavior(cgrp)) -+ continue; -+ if ((cft->flags & CFTYPE_NOT_ON_ROOT) && !cgrp->parent) -+ continue; -+ if ((cft->flags & CFTYPE_ONLY_ON_ROOT) && cgrp->parent) -+ continue; -+ -+ if (is_add) { -+ ret = cgroup_add_file(cgrp, cft); -+ if (ret) { -+ pr_warn("cgroup_addrm_files: failed to add %s, err=%d\n", -+ cft->name, ret); -+ return ret; -+ } -+ } else { -+ cgroup_rm_file(cgrp, cft); -+ } -+ } -+ return 0; -+} -+ -+static void cgroup_cfts_prepare(void) -+ __acquires(&cgroup_mutex) -+{ -+ /* -+ * Thanks to the entanglement with vfs inode locking, we can't walk -+ * the existing cgroups under cgroup_mutex and create files. -+ * Instead, we use css_for_each_descendant_pre() and drop RCU read -+ * lock before calling cgroup_addrm_files(). -+ */ -+ mutex_lock(&cgroup_mutex); -+} -+ -+static int cgroup_cfts_commit(struct cftype *cfts, bool is_add) -+ __releases(&cgroup_mutex) -+{ -+ LIST_HEAD(pending); -+ struct cgroup_subsys *ss = cfts[0].ss; -+ struct cgroup *root = &ss->root->top_cgroup; -+ struct super_block *sb = ss->root->sb; -+ struct dentry *prev = NULL; -+ struct inode *inode; -+ struct cgroup_subsys_state *css; -+ u64 update_before; -+ int ret = 0; -+ -+ /* %NULL @cfts indicates abort and don't bother if @ss isn't attached */ -+ if (!cfts || ss->root == &cgroup_dummy_root || -+ !atomic_inc_not_zero(&sb->s_active)) { -+ mutex_unlock(&cgroup_mutex); -+ return 0; -+ } -+ -+ /* -+ * All cgroups which are created after we drop cgroup_mutex will -+ * have the updated set of files, so we only need to update the -+ * cgroups created before the current @cgroup_serial_nr_next. -+ */ -+ update_before = cgroup_serial_nr_next; -+ -+ /* add/rm files for all cgroups created before */ -+ css_for_each_descendant_pre(css, cgroup_css(root, ss)) { -+ struct cgroup *cgrp = css->cgroup; -+ -+ if (cgroup_is_dead(cgrp)) -+ continue; -+ -+ inode = cgrp->dentry->d_inode; -+ dget(cgrp->dentry); -+ dput(prev); -+ prev = cgrp->dentry; -+ -+ mutex_unlock(&cgroup_mutex); -+ mutex_lock(&inode->i_mutex); -+ mutex_lock(&cgroup_mutex); -+ if (cgrp->serial_nr < update_before && !cgroup_is_dead(cgrp)) -+ ret = cgroup_addrm_files(cgrp, cfts, is_add); -+ mutex_unlock(&inode->i_mutex); -+ if (ret) -+ break; -+ } -+ mutex_unlock(&cgroup_mutex); -+ dput(prev); -+ deactivate_super(sb); -+ return ret; -+} -+ -+/** -+ * cgroup_add_cftypes - add an array of cftypes to a subsystem -+ * @ss: target cgroup subsystem -+ * @cfts: zero-length name terminated array of cftypes -+ * -+ * Register @cfts to @ss. Files described by @cfts are created for all -+ * existing cgroups to which @ss is attached and all future cgroups will -+ * have them too. This function can be called anytime whether @ss is -+ * attached or not. -+ * -+ * Returns 0 on successful registration, -errno on failure. Note that this -+ * function currently returns 0 as long as @cfts registration is successful -+ * even if some file creation attempts on existing cgroups fail. -+ */ -+int cgroup_add_cftypes(struct cgroup_subsys *ss, struct cftype *cfts) -+{ -+ struct cftype_set *set; -+ struct cftype *cft; -+ int ret; -+ -+ set = kzalloc(sizeof(*set), GFP_KERNEL); -+ if (!set) -+ return -ENOMEM; -+ -+ for (cft = cfts; cft->name[0] != '\0'; cft++) -+ cft->ss = ss; -+ -+ cgroup_cfts_prepare(); -+ set->cfts = cfts; -+ list_add_tail(&set->node, &ss->cftsets); -+ ret = cgroup_cfts_commit(cfts, true); -+ if (ret) -+ cgroup_rm_cftypes(cfts); -+ return ret; -+} -+EXPORT_SYMBOL_GPL(cgroup_add_cftypes); -+ -+/** -+ * cgroup_rm_cftypes - remove an array of cftypes from a subsystem -+ * @cfts: zero-length name terminated array of cftypes -+ * -+ * Unregister @cfts. Files described by @cfts are removed from all -+ * existing cgroups and all future cgroups won't have them either. This -+ * function can be called anytime whether @cfts' subsys is attached or not. -+ * -+ * Returns 0 on successful unregistration, -ENOENT if @cfts is not -+ * registered. -+ */ -+int cgroup_rm_cftypes(struct cftype *cfts) -+{ -+ struct cftype_set *set; -+ -+ if (!cfts || !cfts[0].ss) -+ return -ENOENT; -+ -+ cgroup_cfts_prepare(); -+ -+ list_for_each_entry(set, &cfts[0].ss->cftsets, node) { -+ if (set->cfts == cfts) { -+ list_del(&set->node); -+ kfree(set); -+ cgroup_cfts_commit(cfts, false); -+ return 0; -+ } -+ } -+ -+ cgroup_cfts_commit(NULL, false); -+ return -ENOENT; -+} -+ -+/** -+ * cgroup_task_count - count the number of tasks in a cgroup. -+ * @cgrp: the cgroup in question -+ * -+ * Return the number of tasks in the cgroup. -+ */ -+int cgroup_task_count(const struct cgroup *cgrp) -+{ -+ int count = 0; -+ struct cgrp_cset_link *link; -+ -+ read_lock(&css_set_lock); -+ list_for_each_entry(link, &cgrp->cset_links, cset_link) -+ count += atomic_read(&link->cset->refcount); -+ read_unlock(&css_set_lock); -+ return count; -+} -+ -+/* -+ * To reduce the fork() overhead for systems that are not actually using -+ * their cgroups capability, we don't maintain the lists running through -+ * each css_set to its tasks until we see the list actually used - in other -+ * words after the first call to css_task_iter_start(). -+ */ -+static void cgroup_enable_task_cg_lists(void) -+{ -+ struct task_struct *p, *g; -+ write_lock(&css_set_lock); -+ use_task_css_set_links = 1; -+ /* -+ * We need tasklist_lock because RCU is not safe against -+ * while_each_thread(). Besides, a forking task that has passed -+ * cgroup_post_fork() without seeing use_task_css_set_links = 1 -+ * is not guaranteed to have its child immediately visible in the -+ * tasklist if we walk through it with RCU. -+ */ -+ read_lock(&tasklist_lock); -+ do_each_thread(g, p) { -+ task_lock(p); -+ /* -+ * We should check if the process is exiting, otherwise -+ * it will race with cgroup_exit() in that the list -+ * entry won't be deleted though the process has exited. -+ * Do it while holding siglock so that we don't end up -+ * racing against cgroup_exit(). -+ */ -+ spin_lock_irq(&p->sighand->siglock); -+ if (!(p->flags & PF_EXITING) && list_empty(&p->cg_list)) -+ list_add(&p->cg_list, &task_css_set(p)->tasks); -+ spin_unlock_irq(&p->sighand->siglock); -+ -+ task_unlock(p); -+ } while_each_thread(g, p); -+ read_unlock(&tasklist_lock); -+ write_unlock(&css_set_lock); -+} -+ -+/** -+ * css_next_child - find the next child of a given css -+ * @pos_css: the current position (%NULL to initiate traversal) -+ * @parent_css: css whose children to walk -+ * -+ * This function returns the next child of @parent_css and should be called -+ * under RCU read lock. The only requirement is that @parent_css and -+ * @pos_css are accessible. The next sibling is guaranteed to be returned -+ * regardless of their states. -+ */ -+struct cgroup_subsys_state * -+css_next_child(struct cgroup_subsys_state *pos_css, -+ struct cgroup_subsys_state *parent_css) -+{ -+ struct cgroup *pos = pos_css ? pos_css->cgroup : NULL; -+ struct cgroup *cgrp = parent_css->cgroup; -+ struct cgroup *next; -+ -+ WARN_ON_ONCE(!rcu_read_lock_held()); -+ -+ /* -+ * @pos could already have been removed. Once a cgroup is removed, -+ * its ->sibling.next is no longer updated when its next sibling -+ * changes. As CGRP_DEAD assertion is serialized and happens -+ * before the cgroup is taken off the ->sibling list, if we see it -+ * unasserted, it's guaranteed that the next sibling hasn't -+ * finished its grace period even if it's already removed, and thus -+ * safe to dereference from this RCU critical section. If -+ * ->sibling.next is inaccessible, cgroup_is_dead() is guaranteed -+ * to be visible as %true here. -+ * -+ * If @pos is dead, its next pointer can't be dereferenced; -+ * however, as each cgroup is given a monotonically increasing -+ * unique serial number and always appended to the sibling list, -+ * the next one can be found by walking the parent's children until -+ * we see a cgroup with higher serial number than @pos's. While -+ * this path can be slower, it's taken only when either the current -+ * cgroup is removed or iteration and removal race. -+ */ -+ if (!pos) { -+ next = list_entry_rcu(cgrp->children.next, struct cgroup, sibling); -+ } else if (likely(!cgroup_is_dead(pos))) { -+ next = list_entry_rcu(pos->sibling.next, struct cgroup, sibling); -+ } else { -+ list_for_each_entry_rcu(next, &cgrp->children, sibling) -+ if (next->serial_nr > pos->serial_nr) -+ break; -+ } -+ -+ if (&next->sibling == &cgrp->children) -+ return NULL; -+ -+ return cgroup_css(next, parent_css->ss); -+} -+EXPORT_SYMBOL_GPL(css_next_child); -+ -+/** -+ * css_next_descendant_pre - find the next descendant for pre-order walk -+ * @pos: the current position (%NULL to initiate traversal) -+ * @root: css whose descendants to walk -+ * -+ * To be used by css_for_each_descendant_pre(). Find the next descendant -+ * to visit for pre-order traversal of @root's descendants. @root is -+ * included in the iteration and the first node to be visited. -+ * -+ * While this function requires RCU read locking, it doesn't require the -+ * whole traversal to be contained in a single RCU critical section. This -+ * function will return the correct next descendant as long as both @pos -+ * and @root are accessible and @pos is a descendant of @root. -+ */ -+struct cgroup_subsys_state * -+css_next_descendant_pre(struct cgroup_subsys_state *pos, -+ struct cgroup_subsys_state *root) -+{ -+ struct cgroup_subsys_state *next; -+ -+ WARN_ON_ONCE(!rcu_read_lock_held()); -+ -+ /* if first iteration, visit @root */ -+ if (!pos) -+ return root; -+ -+ /* visit the first child if exists */ -+ next = css_next_child(NULL, pos); -+ if (next) -+ return next; -+ -+ /* no child, visit my or the closest ancestor's next sibling */ -+ while (pos != root) { -+ next = css_next_child(pos, css_parent(pos)); -+ if (next) -+ return next; -+ pos = css_parent(pos); -+ } -+ -+ return NULL; -+} -+EXPORT_SYMBOL_GPL(css_next_descendant_pre); -+ -+/** -+ * css_rightmost_descendant - return the rightmost descendant of a css -+ * @pos: css of interest -+ * -+ * Return the rightmost descendant of @pos. If there's no descendant, @pos -+ * is returned. This can be used during pre-order traversal to skip -+ * subtree of @pos. -+ * -+ * While this function requires RCU read locking, it doesn't require the -+ * whole traversal to be contained in a single RCU critical section. This -+ * function will return the correct rightmost descendant as long as @pos is -+ * accessible. -+ */ -+struct cgroup_subsys_state * -+css_rightmost_descendant(struct cgroup_subsys_state *pos) -+{ -+ struct cgroup_subsys_state *last, *tmp; -+ -+ WARN_ON_ONCE(!rcu_read_lock_held()); -+ -+ do { -+ last = pos; -+ /* ->prev isn't RCU safe, walk ->next till the end */ -+ pos = NULL; -+ css_for_each_child(tmp, last) -+ pos = tmp; -+ } while (pos); -+ -+ return last; -+} -+EXPORT_SYMBOL_GPL(css_rightmost_descendant); -+ -+static struct cgroup_subsys_state * -+css_leftmost_descendant(struct cgroup_subsys_state *pos) -+{ -+ struct cgroup_subsys_state *last; -+ -+ do { -+ last = pos; -+ pos = css_next_child(NULL, pos); -+ } while (pos); -+ -+ return last; -+} -+ -+/** -+ * css_next_descendant_post - find the next descendant for post-order walk -+ * @pos: the current position (%NULL to initiate traversal) -+ * @root: css whose descendants to walk -+ * -+ * To be used by css_for_each_descendant_post(). Find the next descendant -+ * to visit for post-order traversal of @root's descendants. @root is -+ * included in the iteration and the last node to be visited. -+ * -+ * While this function requires RCU read locking, it doesn't require the -+ * whole traversal to be contained in a single RCU critical section. This -+ * function will return the correct next descendant as long as both @pos -+ * and @cgroup are accessible and @pos is a descendant of @cgroup. -+ */ -+struct cgroup_subsys_state * -+css_next_descendant_post(struct cgroup_subsys_state *pos, -+ struct cgroup_subsys_state *root) -+{ -+ struct cgroup_subsys_state *next; -+ -+ WARN_ON_ONCE(!rcu_read_lock_held()); -+ -+ /* if first iteration, visit leftmost descendant which may be @root */ -+ if (!pos) -+ return css_leftmost_descendant(root); -+ -+ /* if we visited @root, we're done */ -+ if (pos == root) -+ return NULL; -+ -+ /* if there's an unvisited sibling, visit its leftmost descendant */ -+ next = css_next_child(pos, css_parent(pos)); -+ if (next) -+ return css_leftmost_descendant(next); -+ -+ /* no sibling left, visit parent */ -+ return css_parent(pos); -+} -+EXPORT_SYMBOL_GPL(css_next_descendant_post); -+ -+/** -+ * css_advance_task_iter - advance a task itererator to the next css_set -+ * @it: the iterator to advance -+ * -+ * Advance @it to the next css_set to walk. -+ */ -+static void css_advance_task_iter(struct css_task_iter *it) -+{ -+ struct list_head *l = it->cset_link; -+ struct cgrp_cset_link *link; -+ struct css_set *cset; -+ -+ /* Advance to the next non-empty css_set */ -+ do { -+ l = l->next; -+ if (l == &it->origin_css->cgroup->cset_links) { -+ it->cset_link = NULL; -+ return; -+ } -+ link = list_entry(l, struct cgrp_cset_link, cset_link); -+ cset = link->cset; -+ } while (list_empty(&cset->tasks)); -+ it->cset_link = l; -+ it->task = cset->tasks.next; -+} -+ -+/** -+ * css_task_iter_start - initiate task iteration -+ * @css: the css to walk tasks of -+ * @it: the task iterator to use -+ * -+ * Initiate iteration through the tasks of @css. The caller can call -+ * css_task_iter_next() to walk through the tasks until the function -+ * returns NULL. On completion of iteration, css_task_iter_end() must be -+ * called. -+ * -+ * Note that this function acquires a lock which is released when the -+ * iteration finishes. The caller can't sleep while iteration is in -+ * progress. -+ */ -+void css_task_iter_start(struct cgroup_subsys_state *css, -+ struct css_task_iter *it) -+ __acquires(css_set_lock) -+{ -+ /* -+ * The first time anyone tries to iterate across a css, we need to -+ * enable the list linking each css_set to its tasks, and fix up -+ * all existing tasks. -+ */ -+ if (!use_task_css_set_links) -+ cgroup_enable_task_cg_lists(); -+ -+ read_lock(&css_set_lock); -+ -+ it->origin_css = css; -+ it->cset_link = &css->cgroup->cset_links; -+ -+ css_advance_task_iter(it); -+} -+ -+/** -+ * css_task_iter_next - return the next task for the iterator -+ * @it: the task iterator being iterated -+ * -+ * The "next" function for task iteration. @it should have been -+ * initialized via css_task_iter_start(). Returns NULL when the iteration -+ * reaches the end. -+ */ -+struct task_struct *css_task_iter_next(struct css_task_iter *it) -+{ -+ struct task_struct *res; -+ struct list_head *l = it->task; -+ struct cgrp_cset_link *link; -+ -+ /* If the iterator cg is NULL, we have no tasks */ -+ if (!it->cset_link) -+ return NULL; -+ res = list_entry(l, struct task_struct, cg_list); -+ /* Advance iterator to find next entry */ -+ l = l->next; -+ link = list_entry(it->cset_link, struct cgrp_cset_link, cset_link); -+ if (l == &link->cset->tasks) { -+ /* -+ * We reached the end of this task list - move on to the -+ * next cgrp_cset_link. -+ */ -+ css_advance_task_iter(it); -+ } else { -+ it->task = l; -+ } -+ return res; -+} -+ -+/** -+ * css_task_iter_end - finish task iteration -+ * @it: the task iterator to finish -+ * -+ * Finish task iteration started by css_task_iter_start(). -+ */ -+void css_task_iter_end(struct css_task_iter *it) -+ __releases(css_set_lock) -+{ -+ read_unlock(&css_set_lock); -+} -+ -+static inline int started_after_time(struct task_struct *t1, -+ struct timespec *time, -+ struct task_struct *t2) -+{ -+ int start_diff = timespec_compare(&t1->start_time, time); -+ if (start_diff > 0) { -+ return 1; -+ } else if (start_diff < 0) { -+ return 0; -+ } else { -+ /* -+ * Arbitrarily, if two processes started at the same -+ * time, we'll say that the lower pointer value -+ * started first. Note that t2 may have exited by now -+ * so this may not be a valid pointer any longer, but -+ * that's fine - it still serves to distinguish -+ * between two tasks started (effectively) simultaneously. -+ */ -+ return t1 > t2; -+ } -+} -+ -+/* -+ * This function is a callback from heap_insert() and is used to order -+ * the heap. -+ * In this case we order the heap in descending task start time. -+ */ -+static inline int started_after(void *p1, void *p2) -+{ -+ struct task_struct *t1 = p1; -+ struct task_struct *t2 = p2; -+ return started_after_time(t1, &t2->start_time, t2); -+} -+ -+/** -+ * css_scan_tasks - iterate though all the tasks in a css -+ * @css: the css to iterate tasks of -+ * @test: optional test callback -+ * @process: process callback -+ * @data: data passed to @test and @process -+ * @heap: optional pre-allocated heap used for task iteration -+ * -+ * Iterate through all the tasks in @css, calling @test for each, and if it -+ * returns %true, call @process for it also. -+ * -+ * @test may be NULL, meaning always true (select all tasks), which -+ * effectively duplicates css_task_iter_{start,next,end}() but does not -+ * lock css_set_lock for the call to @process. -+ * -+ * It is guaranteed that @process will act on every task that is a member -+ * of @css for the duration of this call. This function may or may not -+ * call @process for tasks that exit or move to a different css during the -+ * call, or are forked or move into the css during the call. -+ * -+ * Note that @test may be called with locks held, and may in some -+ * situations be called multiple times for the same task, so it should be -+ * cheap. -+ * -+ * If @heap is non-NULL, a heap has been pre-allocated and will be used for -+ * heap operations (and its "gt" member will be overwritten), else a -+ * temporary heap will be used (allocation of which may cause this function -+ * to fail). -+ */ -+int css_scan_tasks(struct cgroup_subsys_state *css, -+ bool (*test)(struct task_struct *, void *), -+ void (*process)(struct task_struct *, void *), -+ void *data, struct ptr_heap *heap) -+{ -+ int retval, i; -+ struct css_task_iter it; -+ struct task_struct *p, *dropped; -+ /* Never dereference latest_task, since it's not refcounted */ -+ struct task_struct *latest_task = NULL; -+ struct ptr_heap tmp_heap; -+ struct timespec latest_time = { 0, 0 }; -+ -+ if (heap) { -+ /* The caller supplied our heap and pre-allocated its memory */ -+ heap->gt = &started_after; -+ } else { -+ /* We need to allocate our own heap memory */ -+ heap = &tmp_heap; -+ retval = heap_init(heap, PAGE_SIZE, GFP_KERNEL, &started_after); -+ if (retval) -+ /* cannot allocate the heap */ -+ return retval; -+ } -+ -+ again: -+ /* -+ * Scan tasks in the css, using the @test callback to determine -+ * which are of interest, and invoking @process callback on the -+ * ones which need an update. Since we don't want to hold any -+ * locks during the task updates, gather tasks to be processed in a -+ * heap structure. The heap is sorted by descending task start -+ * time. If the statically-sized heap fills up, we overflow tasks -+ * that started later, and in future iterations only consider tasks -+ * that started after the latest task in the previous pass. This -+ * guarantees forward progress and that we don't miss any tasks. -+ */ -+ heap->size = 0; -+ css_task_iter_start(css, &it); -+ while ((p = css_task_iter_next(&it))) { -+ /* -+ * Only affect tasks that qualify per the caller's callback, -+ * if he provided one -+ */ -+ if (test && !test(p, data)) -+ continue; -+ /* -+ * Only process tasks that started after the last task -+ * we processed -+ */ -+ if (!started_after_time(p, &latest_time, latest_task)) -+ continue; -+ dropped = heap_insert(heap, p); -+ if (dropped == NULL) { -+ /* -+ * The new task was inserted; the heap wasn't -+ * previously full -+ */ -+ get_task_struct(p); -+ } else if (dropped != p) { -+ /* -+ * The new task was inserted, and pushed out a -+ * different task -+ */ -+ get_task_struct(p); -+ put_task_struct(dropped); -+ } -+ /* -+ * Else the new task was newer than anything already in -+ * the heap and wasn't inserted -+ */ -+ } -+ css_task_iter_end(&it); -+ -+ if (heap->size) { -+ for (i = 0; i < heap->size; i++) { -+ struct task_struct *q = heap->ptrs[i]; -+ if (i == 0) { -+ latest_time = q->start_time; -+ latest_task = q; -+ } -+ /* Process the task per the caller's callback */ -+ process(q, data); -+ put_task_struct(q); -+ } -+ /* -+ * If we had to process any tasks at all, scan again -+ * in case some of them were in the middle of forking -+ * children that didn't get processed. -+ * Not the most efficient way to do it, but it avoids -+ * having to take callback_mutex in the fork path -+ */ -+ goto again; -+ } -+ if (heap == &tmp_heap) -+ heap_free(&tmp_heap); -+ return 0; -+} -+ -+static void cgroup_transfer_one_task(struct task_struct *task, void *data) -+{ -+ struct cgroup *new_cgroup = data; -+ -+ mutex_lock(&cgroup_mutex); -+ cgroup_attach_task(new_cgroup, task, false); -+ mutex_unlock(&cgroup_mutex); -+} -+ -+/** -+ * cgroup_trasnsfer_tasks - move tasks from one cgroup to another -+ * @to: cgroup to which the tasks will be moved -+ * @from: cgroup in which the tasks currently reside -+ */ -+int cgroup_transfer_tasks(struct cgroup *to, struct cgroup *from) -+{ -+ return css_scan_tasks(&from->dummy_css, NULL, cgroup_transfer_one_task, -+ to, NULL); -+} -+ -+/* -+ * Stuff for reading the 'tasks'/'procs' files. -+ * -+ * Reading this file can return large amounts of data if a cgroup has -+ * *lots* of attached tasks. So it may need several calls to read(), -+ * but we cannot guarantee that the information we produce is correct -+ * unless we produce it entirely atomically. -+ * -+ */ -+ -+/* which pidlist file are we talking about? */ -+enum cgroup_filetype { -+ CGROUP_FILE_PROCS, -+ CGROUP_FILE_TASKS, -+}; -+ -+/* -+ * A pidlist is a list of pids that virtually represents the contents of one -+ * of the cgroup files ("procs" or "tasks"). We keep a list of such pidlists, -+ * a pair (one each for procs, tasks) for each pid namespace that's relevant -+ * to the cgroup. -+ */ -+struct cgroup_pidlist { -+ /* -+ * used to find which pidlist is wanted. doesn't change as long as -+ * this particular list stays in the list. -+ */ -+ struct { enum cgroup_filetype type; struct pid_namespace *ns; } key; -+ /* array of xids */ -+ pid_t *list; -+ /* how many elements the above list has */ -+ int length; -+ /* how many files are using the current array */ -+ int use_count; -+ /* each of these stored in a list by its cgroup */ -+ struct list_head links; -+ /* pointer to the cgroup we belong to, for list removal purposes */ -+ struct cgroup *owner; -+ /* protects the other fields */ -+ struct rw_semaphore rwsem; -+}; -+ -+/* -+ * The following two functions "fix" the issue where there are more pids -+ * than kmalloc will give memory for; in such cases, we use vmalloc/vfree. -+ * TODO: replace with a kernel-wide solution to this problem -+ */ -+#define PIDLIST_TOO_LARGE(c) ((c) * sizeof(pid_t) > (PAGE_SIZE * 2)) -+static void *pidlist_allocate(int count) -+{ -+ if (PIDLIST_TOO_LARGE(count)) -+ return vmalloc(count * sizeof(pid_t)); -+ else -+ return kmalloc(count * sizeof(pid_t), GFP_KERNEL); -+} -+static void pidlist_free(void *p) -+{ -+ if (is_vmalloc_addr(p)) -+ vfree(p); -+ else -+ kfree(p); -+} -+ -+/* -+ * pidlist_uniq - given a kmalloc()ed list, strip out all duplicate entries -+ * Returns the number of unique elements. -+ */ -+static int pidlist_uniq(pid_t *list, int length) -+{ -+ int src, dest = 1; -+ -+ /* -+ * we presume the 0th element is unique, so i starts at 1. trivial -+ * edge cases first; no work needs to be done for either -+ */ -+ if (length == 0 || length == 1) -+ return length; -+ /* src and dest walk down the list; dest counts unique elements */ -+ for (src = 1; src < length; src++) { -+ /* find next unique element */ -+ while (list[src] == list[src-1]) { -+ src++; -+ if (src == length) -+ goto after; -+ } -+ /* dest always points to where the next unique element goes */ -+ list[dest] = list[src]; -+ dest++; -+ } -+after: -+ return dest; -+} -+ -+static int cmppid(const void *a, const void *b) -+{ -+ return *(pid_t *)a - *(pid_t *)b; -+} -+ -+/* -+ * find the appropriate pidlist for our purpose (given procs vs tasks) -+ * returns with the lock on that pidlist already held, and takes care -+ * of the use count, or returns NULL with no locks held if we're out of -+ * memory. -+ */ -+static struct cgroup_pidlist *cgroup_pidlist_find(struct cgroup *cgrp, -+ enum cgroup_filetype type) -+{ -+ struct cgroup_pidlist *l; -+ /* don't need task_nsproxy() if we're looking at ourself */ -+ struct pid_namespace *ns = task_active_pid_ns(current); -+ -+ /* -+ * We can't drop the pidlist_mutex before taking the l->rwsem in case -+ * the last ref-holder is trying to remove l from the list at the same -+ * time. Holding the pidlist_mutex precludes somebody taking whichever -+ * list we find out from under us - compare release_pid_array(). -+ */ -+ mutex_lock(&cgrp->pidlist_mutex); -+ list_for_each_entry(l, &cgrp->pidlists, links) { -+ if (l->key.type == type && l->key.ns == ns) { -+ /* make sure l doesn't vanish out from under us */ -+ down_write(&l->rwsem); -+ mutex_unlock(&cgrp->pidlist_mutex); -+ return l; -+ } -+ } -+ /* entry not found; create a new one */ -+ l = kzalloc(sizeof(struct cgroup_pidlist), GFP_KERNEL); -+ if (!l) { -+ mutex_unlock(&cgrp->pidlist_mutex); -+ return l; -+ } -+ init_rwsem(&l->rwsem); -+ down_write(&l->rwsem); -+ l->key.type = type; -+ l->key.ns = get_pid_ns(ns); -+ l->owner = cgrp; -+ list_add(&l->links, &cgrp->pidlists); -+ mutex_unlock(&cgrp->pidlist_mutex); -+ return l; -+} -+ -+/* -+ * Load a cgroup's pidarray with either procs' tgids or tasks' pids -+ */ -+static int pidlist_array_load(struct cgroup *cgrp, enum cgroup_filetype type, -+ struct cgroup_pidlist **lp) -+{ -+ pid_t *array; -+ int length; -+ int pid, n = 0; /* used for populating the array */ -+ struct css_task_iter it; -+ struct task_struct *tsk; -+ struct cgroup_pidlist *l; -+ -+ /* -+ * If cgroup gets more users after we read count, we won't have -+ * enough space - tough. This race is indistinguishable to the -+ * caller from the case that the additional cgroup users didn't -+ * show up until sometime later on. -+ */ -+ length = cgroup_task_count(cgrp); -+ array = pidlist_allocate(length); -+ if (!array) -+ return -ENOMEM; -+ /* now, populate the array */ -+ css_task_iter_start(&cgrp->dummy_css, &it); -+ while ((tsk = css_task_iter_next(&it))) { -+ if (unlikely(n == length)) -+ break; -+ /* get tgid or pid for procs or tasks file respectively */ -+ if (type == CGROUP_FILE_PROCS) -+ pid = task_tgid_vnr(tsk); -+ else -+ pid = task_pid_vnr(tsk); -+ if (pid > 0) /* make sure to only use valid results */ -+ array[n++] = pid; -+ } -+ css_task_iter_end(&it); -+ length = n; -+ /* now sort & (if procs) strip out duplicates */ -+ sort(array, length, sizeof(pid_t), cmppid, NULL); -+ if (type == CGROUP_FILE_PROCS) -+ length = pidlist_uniq(array, length); -+ l = cgroup_pidlist_find(cgrp, type); -+ if (!l) { -+ pidlist_free(array); -+ return -ENOMEM; -+ } -+ /* store array, freeing old if necessary - lock already held */ -+ pidlist_free(l->list); -+ l->list = array; -+ l->length = length; -+ l->use_count++; -+ up_write(&l->rwsem); -+ *lp = l; -+ return 0; -+} -+ -+/** -+ * cgroupstats_build - build and fill cgroupstats -+ * @stats: cgroupstats to fill information into -+ * @dentry: A dentry entry belonging to the cgroup for which stats have -+ * been requested. -+ * -+ * Build and fill cgroupstats so that taskstats can export it to user -+ * space. -+ */ -+int cgroupstats_build(struct cgroupstats *stats, struct dentry *dentry) -+{ -+ int ret = -EINVAL; -+ struct cgroup *cgrp; -+ struct css_task_iter it; -+ struct task_struct *tsk; -+ -+ /* -+ * Validate dentry by checking the superblock operations, -+ * and make sure it's a directory. -+ */ -+ if (dentry->d_sb->s_op != &cgroup_ops || -+ !S_ISDIR(dentry->d_inode->i_mode)) -+ goto err; -+ -+ ret = 0; -+ cgrp = dentry->d_fsdata; -+ -+ css_task_iter_start(&cgrp->dummy_css, &it); -+ while ((tsk = css_task_iter_next(&it))) { -+ switch (tsk->state) { -+ case TASK_RUNNING: -+ stats->nr_running++; -+ break; -+ case TASK_INTERRUPTIBLE: -+ stats->nr_sleeping++; -+ break; -+ case TASK_UNINTERRUPTIBLE: -+ stats->nr_uninterruptible++; -+ break; -+ case TASK_STOPPED: -+ stats->nr_stopped++; -+ break; -+ default: -+ if (delayacct_is_task_waiting_on_io(tsk)) -+ stats->nr_io_wait++; -+ break; -+ } -+ } -+ css_task_iter_end(&it); -+ -+err: -+ return ret; -+} -+ -+ -+/* -+ * seq_file methods for the tasks/procs files. The seq_file position is the -+ * next pid to display; the seq_file iterator is a pointer to the pid -+ * in the cgroup->l->list array. -+ */ -+ -+static void *cgroup_pidlist_start(struct seq_file *s, loff_t *pos) -+{ -+ /* -+ * Initially we receive a position value that corresponds to -+ * one more than the last pid shown (or 0 on the first call or -+ * after a seek to the start). Use a binary-search to find the -+ * next pid to display, if any -+ */ -+ struct cgroup_pidlist *l = s->private; -+ int index = 0, pid = *pos; -+ int *iter; -+ -+ down_read(&l->rwsem); -+ if (pid) { -+ int end = l->length; -+ -+ while (index < end) { -+ int mid = (index + end) / 2; -+ if (l->list[mid] == pid) { -+ index = mid; -+ break; -+ } else if (l->list[mid] <= pid) -+ index = mid + 1; -+ else -+ end = mid; -+ } -+ } -+ /* If we're off the end of the array, we're done */ -+ if (index >= l->length) -+ return NULL; -+ /* Update the abstract position to be the actual pid that we found */ -+ iter = l->list + index; -+ *pos = *iter; -+ return iter; -+} -+ -+static void cgroup_pidlist_stop(struct seq_file *s, void *v) -+{ -+ struct cgroup_pidlist *l = s->private; -+ up_read(&l->rwsem); -+} -+ -+static void *cgroup_pidlist_next(struct seq_file *s, void *v, loff_t *pos) -+{ -+ struct cgroup_pidlist *l = s->private; -+ pid_t *p = v; -+ pid_t *end = l->list + l->length; -+ /* -+ * Advance to the next pid in the array. If this goes off the -+ * end, we're done -+ */ -+ p++; -+ if (p >= end) { -+ return NULL; -+ } else { -+ *pos = *p; -+ return p; -+ } -+} -+ -+static int cgroup_pidlist_show(struct seq_file *s, void *v) -+{ -+ return seq_printf(s, "%d\n", *(int *)v); -+} -+ -+/* -+ * seq_operations functions for iterating on pidlists through seq_file - -+ * independent of whether it's tasks or procs -+ */ -+static const struct seq_operations cgroup_pidlist_seq_operations = { -+ .start = cgroup_pidlist_start, -+ .stop = cgroup_pidlist_stop, -+ .next = cgroup_pidlist_next, -+ .show = cgroup_pidlist_show, -+}; -+ -+static void cgroup_release_pid_array(struct cgroup_pidlist *l) -+{ -+ /* -+ * the case where we're the last user of this particular pidlist will -+ * have us remove it from the cgroup's list, which entails taking the -+ * mutex. since in pidlist_find the pidlist->lock depends on cgroup-> -+ * pidlist_mutex, we have to take pidlist_mutex first. -+ */ -+ mutex_lock(&l->owner->pidlist_mutex); -+ down_write(&l->rwsem); -+ BUG_ON(!l->use_count); -+ if (!--l->use_count) { -+ /* we're the last user if refcount is 0; remove and free */ -+ list_del(&l->links); -+ mutex_unlock(&l->owner->pidlist_mutex); -+ pidlist_free(l->list); -+ put_pid_ns(l->key.ns); -+ up_write(&l->rwsem); -+ kfree(l); -+ return; -+ } -+ mutex_unlock(&l->owner->pidlist_mutex); -+ up_write(&l->rwsem); -+} -+ -+static int cgroup_pidlist_release(struct inode *inode, struct file *file) -+{ -+ struct cgroup_pidlist *l; -+ if (!(file->f_mode & FMODE_READ)) -+ return 0; -+ /* -+ * the seq_file will only be initialized if the file was opened for -+ * reading; hence we check if it's not null only in that case. -+ */ -+ l = ((struct seq_file *)file->private_data)->private; -+ cgroup_release_pid_array(l); -+ return seq_release(inode, file); -+} -+ -+static const struct file_operations cgroup_pidlist_operations = { -+ .read = seq_read, -+ .llseek = seq_lseek, -+ .write = cgroup_file_write, -+ .release = cgroup_pidlist_release, -+}; -+ -+/* -+ * The following functions handle opens on a file that displays a pidlist -+ * (tasks or procs). Prepare an array of the process/thread IDs of whoever's -+ * in the cgroup. -+ */ -+/* helper function for the two below it */ -+static int cgroup_pidlist_open(struct file *file, enum cgroup_filetype type) -+{ -+ struct cgroup *cgrp = __d_cgrp(file->f_dentry->d_parent); -+ struct cgroup_pidlist *l; -+ int retval; -+ -+ /* Nothing to do for write-only files */ -+ if (!(file->f_mode & FMODE_READ)) -+ return 0; -+ -+ /* have the array populated */ -+ retval = pidlist_array_load(cgrp, type, &l); -+ if (retval) -+ return retval; -+ /* configure file information */ -+ file->f_op = &cgroup_pidlist_operations; -+ -+ retval = seq_open(file, &cgroup_pidlist_seq_operations); -+ if (retval) { -+ cgroup_release_pid_array(l); -+ return retval; -+ } -+ ((struct seq_file *)file->private_data)->private = l; -+ return 0; -+} -+static int cgroup_tasks_open(struct inode *unused, struct file *file) -+{ -+ return cgroup_pidlist_open(file, CGROUP_FILE_TASKS); -+} -+static int cgroup_procs_open(struct inode *unused, struct file *file) -+{ -+ return cgroup_pidlist_open(file, CGROUP_FILE_PROCS); -+} -+ -+static u64 cgroup_read_notify_on_release(struct cgroup_subsys_state *css, -+ struct cftype *cft) -+{ -+ return notify_on_release(css->cgroup); -+} -+ -+static int cgroup_write_notify_on_release(struct cgroup_subsys_state *css, -+ struct cftype *cft, u64 val) -+{ -+ clear_bit(CGRP_RELEASABLE, &css->cgroup->flags); -+ if (val) -+ set_bit(CGRP_NOTIFY_ON_RELEASE, &css->cgroup->flags); -+ else -+ clear_bit(CGRP_NOTIFY_ON_RELEASE, &css->cgroup->flags); -+ return 0; -+} -+ -+/* -+ * When dput() is called asynchronously, if umount has been done and -+ * then deactivate_super() in cgroup_free_fn() kills the superblock, -+ * there's a small window that vfs will see the root dentry with non-zero -+ * refcnt and trigger BUG(). -+ * -+ * That's why we hold a reference before dput() and drop it right after. -+ */ -+static void cgroup_dput(struct cgroup *cgrp) -+{ -+ struct super_block *sb = cgrp->root->sb; -+ -+ atomic_inc(&sb->s_active); -+ dput(cgrp->dentry); -+ deactivate_super(sb); -+} -+ -+/* -+ * Unregister event and free resources. -+ * -+ * Gets called from workqueue. -+ */ -+static void cgroup_event_remove(struct work_struct *work) -+{ -+ struct cgroup_event *event = container_of(work, struct cgroup_event, -+ remove); -+ struct cgroup_subsys_state *css = event->css; -+ -+ remove_wait_queue(event->wqh, &event->wait); -+ -+ event->cft->unregister_event(css, event->cft, event->eventfd); -+ -+ /* Notify userspace the event is going away. */ -+ eventfd_signal(event->eventfd, 1); -+ -+ eventfd_ctx_put(event->eventfd); -+ kfree(event); -+ css_put(css); -+} -+ -+/* -+ * Gets called on POLLHUP on eventfd when user closes it. -+ * -+ * Called with wqh->lock held and interrupts disabled. -+ */ -+static int cgroup_event_wake(wait_queue_t *wait, unsigned mode, -+ int sync, void *key) -+{ -+ struct cgroup_event *event = container_of(wait, -+ struct cgroup_event, wait); -+ struct cgroup *cgrp = event->css->cgroup; -+ unsigned long flags = (unsigned long)key; -+ -+ if (flags & POLLHUP) { -+ /* -+ * If the event has been detached at cgroup removal, we -+ * can simply return knowing the other side will cleanup -+ * for us. -+ * -+ * We can't race against event freeing since the other -+ * side will require wqh->lock via remove_wait_queue(), -+ * which we hold. -+ */ -+ spin_lock(&cgrp->event_list_lock); -+ if (!list_empty(&event->list)) { -+ list_del_init(&event->list); -+ /* -+ * We are in atomic context, but cgroup_event_remove() -+ * may sleep, so we have to call it in workqueue. -+ */ -+ schedule_work(&event->remove); -+ } -+ spin_unlock(&cgrp->event_list_lock); -+ } -+ -+ return 0; -+} -+ -+static void cgroup_event_ptable_queue_proc(struct file *file, -+ wait_queue_head_t *wqh, poll_table *pt) -+{ -+ struct cgroup_event *event = container_of(pt, -+ struct cgroup_event, pt); -+ -+ event->wqh = wqh; -+ add_wait_queue(wqh, &event->wait); -+} -+ -+/* -+ * Parse input and register new cgroup event handler. -+ * -+ * Input must be in format '<event_fd> <control_fd> <args>'. -+ * Interpretation of args is defined by control file implementation. -+ */ -+static int cgroup_write_event_control(struct cgroup_subsys_state *dummy_css, -+ struct cftype *cft, const char *buffer) -+{ -+ struct cgroup *cgrp = dummy_css->cgroup; -+ struct cgroup_event *event; -+ struct cgroup_subsys_state *cfile_css; -+ unsigned int efd, cfd; -+ struct fd efile; -+ struct fd cfile; -+ char *endp; -+ int ret; -+ -+ efd = simple_strtoul(buffer, &endp, 10); -+ if (*endp != ' ') -+ return -EINVAL; -+ buffer = endp + 1; -+ -+ cfd = simple_strtoul(buffer, &endp, 10); -+ if ((*endp != ' ') && (*endp != '\0')) -+ return -EINVAL; -+ buffer = endp + 1; -+ -+ event = kzalloc(sizeof(*event), GFP_KERNEL); -+ if (!event) -+ return -ENOMEM; -+ -+ INIT_LIST_HEAD(&event->list); -+ init_poll_funcptr(&event->pt, cgroup_event_ptable_queue_proc); -+ init_waitqueue_func_entry(&event->wait, cgroup_event_wake); -+ INIT_WORK(&event->remove, cgroup_event_remove); -+ -+ efile = fdget(efd); -+ if (!efile.file) { -+ ret = -EBADF; -+ goto out_kfree; -+ } -+ -+ event->eventfd = eventfd_ctx_fileget(efile.file); -+ if (IS_ERR(event->eventfd)) { -+ ret = PTR_ERR(event->eventfd); -+ goto out_put_efile; -+ } -+ -+ cfile = fdget(cfd); -+ if (!cfile.file) { -+ ret = -EBADF; -+ goto out_put_eventfd; -+ } -+ -+ /* the process need read permission on control file */ -+ /* AV: shouldn't we check that it's been opened for read instead? */ -+ ret = inode_permission(file_inode(cfile.file), MAY_READ); -+ if (ret < 0) -+ goto out_put_cfile; -+ -+ event->cft = __file_cft(cfile.file); -+ if (IS_ERR(event->cft)) { -+ ret = PTR_ERR(event->cft); -+ goto out_put_cfile; -+ } -+ -+ if (!event->cft->ss) { -+ ret = -EBADF; -+ goto out_put_cfile; -+ } -+ -+ /* -+ * Determine the css of @cfile, verify it belongs to the same -+ * cgroup as cgroup.event_control, and associate @event with it. -+ * Remaining events are automatically removed on cgroup destruction -+ * but the removal is asynchronous, so take an extra ref. -+ */ -+ rcu_read_lock(); -+ -+ ret = -EINVAL; -+ event->css = cgroup_css(cgrp, event->cft->ss); -+ cfile_css = css_from_dir(cfile.file->f_dentry->d_parent, event->cft->ss); -+ if (event->css && event->css == cfile_css && css_tryget(event->css)) -+ ret = 0; -+ -+ rcu_read_unlock(); -+ if (ret) -+ goto out_put_cfile; -+ -+ if (!event->cft->register_event || !event->cft->unregister_event) { -+ ret = -EINVAL; -+ goto out_put_css; -+ } -+ -+ ret = event->cft->register_event(event->css, event->cft, -+ event->eventfd, buffer); -+ if (ret) -+ goto out_put_css; -+ -+ efile.file->f_op->poll(efile.file, &event->pt); -+ -+ spin_lock(&cgrp->event_list_lock); -+ list_add(&event->list, &cgrp->event_list); -+ spin_unlock(&cgrp->event_list_lock); -+ -+ fdput(cfile); -+ fdput(efile); -+ -+ return 0; -+ -+out_put_css: -+ css_put(event->css); -+out_put_cfile: -+ fdput(cfile); -+out_put_eventfd: -+ eventfd_ctx_put(event->eventfd); -+out_put_efile: -+ fdput(efile); -+out_kfree: -+ kfree(event); -+ -+ return ret; -+} -+ -+static u64 cgroup_clone_children_read(struct cgroup_subsys_state *css, -+ struct cftype *cft) -+{ -+ return test_bit(CGRP_CPUSET_CLONE_CHILDREN, &css->cgroup->flags); -+} -+ -+static int cgroup_clone_children_write(struct cgroup_subsys_state *css, -+ struct cftype *cft, u64 val) -+{ -+ if (val) -+ set_bit(CGRP_CPUSET_CLONE_CHILDREN, &css->cgroup->flags); -+ else -+ clear_bit(CGRP_CPUSET_CLONE_CHILDREN, &css->cgroup->flags); -+ return 0; -+} -+ -+static struct cftype cgroup_base_files[] = { -+ { -+ .name = "cgroup.procs", -+ .open = cgroup_procs_open, -+ .write_u64 = cgroup_procs_write, -+ .release = cgroup_pidlist_release, -+ .mode = S_IRUGO | S_IWUSR, -+ }, -+ { -+ .name = "cgroup.event_control", -+ .write_string = cgroup_write_event_control, -+ .mode = S_IWUGO, -+ }, -+ { -+ .name = "cgroup.clone_children", -+ .flags = CFTYPE_INSANE, -+ .read_u64 = cgroup_clone_children_read, -+ .write_u64 = cgroup_clone_children_write, -+ }, -+ { -+ .name = "cgroup.sane_behavior", -+ .flags = CFTYPE_ONLY_ON_ROOT, -+ .read_seq_string = cgroup_sane_behavior_show, -+ }, -+ -+ /* -+ * Historical crazy stuff. These don't have "cgroup." prefix and -+ * don't exist if sane_behavior. If you're depending on these, be -+ * prepared to be burned. -+ */ -+ { -+ .name = "tasks", -+ .flags = CFTYPE_INSANE, /* use "procs" instead */ -+ .open = cgroup_tasks_open, -+ .write_u64 = cgroup_tasks_write, -+ .release = cgroup_pidlist_release, -+ .mode = S_IRUGO | S_IWUSR, -+ }, -+ { -+ .name = "notify_on_release", -+ .flags = CFTYPE_INSANE, -+ .read_u64 = cgroup_read_notify_on_release, -+ .write_u64 = cgroup_write_notify_on_release, -+ }, -+ { -+ .name = "release_agent", -+ .flags = CFTYPE_INSANE | CFTYPE_ONLY_ON_ROOT, -+ .read_seq_string = cgroup_release_agent_show, -+ .write_string = cgroup_release_agent_write, -+ .max_write_len = PATH_MAX, -+ }, -+ { } /* terminate */ -+}; -+ -+/** -+ * cgroup_populate_dir - create subsys files in a cgroup directory -+ * @cgrp: target cgroup -+ * @subsys_mask: mask of the subsystem ids whose files should be added -+ * -+ * On failure, no file is added. -+ */ -+static int cgroup_populate_dir(struct cgroup *cgrp, unsigned long subsys_mask) -+{ -+ struct cgroup_subsys *ss; -+ int i, ret = 0; -+ -+ /* process cftsets of each subsystem */ -+ for_each_subsys(ss, i) { -+ struct cftype_set *set; -+ -+ if (!test_bit(i, &subsys_mask)) -+ continue; -+ -+ list_for_each_entry(set, &ss->cftsets, node) { -+ ret = cgroup_addrm_files(cgrp, set->cfts, true); -+ if (ret < 0) -+ goto err; -+ } -+ } -+ return 0; -+err: -+ cgroup_clear_dir(cgrp, subsys_mask); -+ return ret; -+} -+ -+/* -+ * css destruction is four-stage process. -+ * -+ * 1. Destruction starts. Killing of the percpu_ref is initiated. -+ * Implemented in kill_css(). -+ * -+ * 2. When the percpu_ref is confirmed to be visible as killed on all CPUs -+ * and thus css_tryget() is guaranteed to fail, the css can be offlined -+ * by invoking offline_css(). After offlining, the base ref is put. -+ * Implemented in css_killed_work_fn(). -+ * -+ * 3. When the percpu_ref reaches zero, the only possible remaining -+ * accessors are inside RCU read sections. css_release() schedules the -+ * RCU callback. -+ * -+ * 4. After the grace period, the css can be freed. Implemented in -+ * css_free_work_fn(). -+ * -+ * It is actually hairier because both step 2 and 4 require process context -+ * and thus involve punting to css->destroy_work adding two additional -+ * steps to the already complex sequence. -+ */ -+static void css_free_work_fn(struct work_struct *work) -+{ -+ struct cgroup_subsys_state *css = -+ container_of(work, struct cgroup_subsys_state, destroy_work); -+ struct cgroup *cgrp = css->cgroup; -+ -+ if (css->parent) -+ css_put(css->parent); -+ -+ css->ss->css_free(css); -+ cgroup_dput(cgrp); -+} -+ -+static void css_free_rcu_fn(struct rcu_head *rcu_head) -+{ -+ struct cgroup_subsys_state *css = -+ container_of(rcu_head, struct cgroup_subsys_state, rcu_head); -+ -+ /* -+ * css holds an extra ref to @cgrp->dentry which is put on the last -+ * css_put(). dput() requires process context which we don't have. -+ */ -+ INIT_WORK(&css->destroy_work, css_free_work_fn); -+ queue_work(cgroup_destroy_wq, &css->destroy_work); -+} -+ -+static void css_release(struct percpu_ref *ref) -+{ -+ struct cgroup_subsys_state *css = -+ container_of(ref, struct cgroup_subsys_state, refcnt); -+ -+ rcu_assign_pointer(css->cgroup->subsys[css->ss->subsys_id], NULL); -+ call_rcu(&css->rcu_head, css_free_rcu_fn); -+} -+ -+static void init_css(struct cgroup_subsys_state *css, struct cgroup_subsys *ss, -+ struct cgroup *cgrp) -+{ -+ css->cgroup = cgrp; -+ css->ss = ss; -+ css->flags = 0; -+ -+ if (cgrp->parent) -+ css->parent = cgroup_css(cgrp->parent, ss); -+ else -+ css->flags |= CSS_ROOT; -+ -+ BUG_ON(cgroup_css(cgrp, ss)); -+} -+ -+/* invoke ->css_online() on a new CSS and mark it online if successful */ -+static int online_css(struct cgroup_subsys_state *css) -+{ -+ struct cgroup_subsys *ss = css->ss; -+ int ret = 0; -+ -+ lockdep_assert_held(&cgroup_mutex); -+ -+ if (ss->css_online) -+ ret = ss->css_online(css); -+ if (!ret) { -+ css->flags |= CSS_ONLINE; -+ css->cgroup->nr_css++; -+ rcu_assign_pointer(css->cgroup->subsys[ss->subsys_id], css); -+ } -+ return ret; -+} -+ -+/* if the CSS is online, invoke ->css_offline() on it and mark it offline */ -+static void offline_css(struct cgroup_subsys_state *css) -+{ -+ struct cgroup_subsys *ss = css->ss; -+ -+ lockdep_assert_held(&cgroup_mutex); -+ -+ if (!(css->flags & CSS_ONLINE)) -+ return; -+ -+ if (ss->css_offline) -+ ss->css_offline(css); -+ -+ css->flags &= ~CSS_ONLINE; -+ css->cgroup->nr_css--; -+ RCU_INIT_POINTER(css->cgroup->subsys[ss->subsys_id], css); -+} -+ -+/* -+ * cgroup_create - create a cgroup -+ * @parent: cgroup that will be parent of the new cgroup -+ * @dentry: dentry of the new cgroup -+ * @mode: mode to set on new inode -+ * -+ * Must be called with the mutex on the parent inode held -+ */ -+static long cgroup_create(struct cgroup *parent, struct dentry *dentry, -+ umode_t mode) -+{ -+ struct cgroup_subsys_state *css_ar[CGROUP_SUBSYS_COUNT] = { }; -+ struct cgroup *cgrp; -+ struct cgroup_name *name; -+ struct cgroupfs_root *root = parent->root; -+ int err; -+ struct cgroup_subsys *ss; -+ struct super_block *sb = root->sb; -+ -+ /* allocate the cgroup and its ID, 0 is reserved for the root */ -+ cgrp = kzalloc(sizeof(*cgrp), GFP_KERNEL); -+ if (!cgrp) -+ return -ENOMEM; -+ -+ name = cgroup_alloc_name(dentry); -+ if (!name) { -+ err = -ENOMEM; -+ goto err_free_cgrp; -+ } -+ rcu_assign_pointer(cgrp->name, name); -+ -+ /* -+ * Temporarily set the pointer to NULL, so idr_find() won't return -+ * a half-baked cgroup. -+ */ -+ cgrp->id = idr_alloc(&root->cgroup_idr, NULL, 1, 0, GFP_KERNEL); -+ if (cgrp->id < 0) { -+ err = -ENOMEM; -+ goto err_free_name; -+ } -+ -+ /* -+ * Only live parents can have children. Note that the liveliness -+ * check isn't strictly necessary because cgroup_mkdir() and -+ * cgroup_rmdir() are fully synchronized by i_mutex; however, do it -+ * anyway so that locking is contained inside cgroup proper and we -+ * don't get nasty surprises if we ever grow another caller. -+ */ -+ if (!cgroup_lock_live_group(parent)) { -+ err = -ENODEV; -+ goto err_free_id; -+ } -+ -+ /* Grab a reference on the superblock so the hierarchy doesn't -+ * get deleted on unmount if there are child cgroups. This -+ * can be done outside cgroup_mutex, since the sb can't -+ * disappear while someone has an open control file on the -+ * fs */ -+ atomic_inc(&sb->s_active); -+ -+ init_cgroup_housekeeping(cgrp); -+ -+ dentry->d_fsdata = cgrp; -+ cgrp->dentry = dentry; -+ -+ cgrp->parent = parent; -+ cgrp->dummy_css.parent = &parent->dummy_css; -+ cgrp->root = parent->root; -+ -+ if (notify_on_release(parent)) -+ set_bit(CGRP_NOTIFY_ON_RELEASE, &cgrp->flags); -+ -+ if (test_bit(CGRP_CPUSET_CLONE_CHILDREN, &parent->flags)) -+ set_bit(CGRP_CPUSET_CLONE_CHILDREN, &cgrp->flags); -+ -+ for_each_root_subsys(root, ss) { -+ struct cgroup_subsys_state *css; -+ -+ css = ss->css_alloc(cgroup_css(parent, ss)); -+ if (IS_ERR(css)) { -+ err = PTR_ERR(css); -+ goto err_free_all; -+ } -+ css_ar[ss->subsys_id] = css; -+ -+ err = percpu_ref_init(&css->refcnt, css_release); -+ if (err) -+ goto err_free_all; -+ -+ init_css(css, ss, cgrp); -+ } -+ -+ /* -+ * Create directory. cgroup_create_file() returns with the new -+ * directory locked on success so that it can be populated without -+ * dropping cgroup_mutex. -+ */ -+ err = cgroup_create_file(dentry, S_IFDIR | mode, sb); -+ if (err < 0) -+ goto err_free_all; -+ lockdep_assert_held(&dentry->d_inode->i_mutex); -+ -+ cgrp->serial_nr = cgroup_serial_nr_next++; -+ -+ /* allocation complete, commit to creation */ -+ list_add_tail_rcu(&cgrp->sibling, &cgrp->parent->children); -+ root->number_of_cgroups++; -+ -+ /* hold a ref to the parent's dentry */ -+ dget(parent->dentry); -+ -+ /* creation succeeded, notify subsystems */ -+ for_each_root_subsys(root, ss) { -+ struct cgroup_subsys_state *css = css_ar[ss->subsys_id]; -+ -+ err = online_css(css); -+ if (err) -+ goto err_destroy; -+ -+ /* each css holds a ref to the cgroup's dentry and parent css */ -+ dget(dentry); -+ css_get(css->parent); -+ -+ /* mark it consumed for error path */ -+ css_ar[ss->subsys_id] = NULL; -+ -+ if (ss->broken_hierarchy && !ss->warned_broken_hierarchy && -+ parent->parent) { -+ pr_warning("cgroup: %s (%d) created nested cgroup for controller \"%s\" which has incomplete hierarchy support. Nested cgroups may change behavior in the future.\n", -+ current->comm, current->pid, ss->name); -+ if (!strcmp(ss->name, "memory")) -+ pr_warning("cgroup: \"memory\" requires setting use_hierarchy to 1 on the root.\n"); -+ ss->warned_broken_hierarchy = true; -+ } -+ } -+ -+ idr_replace(&root->cgroup_idr, cgrp, cgrp->id); -+ -+ err = cgroup_addrm_files(cgrp, cgroup_base_files, true); -+ if (err) -+ goto err_destroy; -+ -+ err = cgroup_populate_dir(cgrp, root->subsys_mask); -+ if (err) -+ goto err_destroy; -+ -+ mutex_unlock(&cgroup_mutex); -+ mutex_unlock(&cgrp->dentry->d_inode->i_mutex); -+ -+ return 0; -+ -+err_free_all: -+ for_each_root_subsys(root, ss) { -+ struct cgroup_subsys_state *css = css_ar[ss->subsys_id]; -+ -+ if (css) { -+ percpu_ref_cancel_init(&css->refcnt); -+ ss->css_free(css); -+ } -+ } -+ mutex_unlock(&cgroup_mutex); -+ /* Release the reference count that we took on the superblock */ -+ deactivate_super(sb); -+err_free_id: -+ idr_remove(&root->cgroup_idr, cgrp->id); -+err_free_name: -+ kfree(rcu_dereference_raw(cgrp->name)); -+err_free_cgrp: -+ kfree(cgrp); -+ return err; -+ -+err_destroy: -+ for_each_root_subsys(root, ss) { -+ struct cgroup_subsys_state *css = css_ar[ss->subsys_id]; -+ -+ if (css) { -+ percpu_ref_cancel_init(&css->refcnt); -+ ss->css_free(css); -+ } -+ } -+ cgroup_destroy_locked(cgrp); -+ mutex_unlock(&cgroup_mutex); -+ mutex_unlock(&dentry->d_inode->i_mutex); -+ return err; -+} -+ -+static int cgroup_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) -+{ -+ struct cgroup *c_parent = dentry->d_parent->d_fsdata; -+ -+ /* the vfs holds inode->i_mutex already */ -+ return cgroup_create(c_parent, dentry, mode | S_IFDIR); -+} -+ -+/* -+ * This is called when the refcnt of a css is confirmed to be killed. -+ * css_tryget() is now guaranteed to fail. -+ */ -+static void css_killed_work_fn(struct work_struct *work) -+{ -+ struct cgroup_subsys_state *css = -+ container_of(work, struct cgroup_subsys_state, destroy_work); -+ struct cgroup *cgrp = css->cgroup; -+ -+ mutex_lock(&cgroup_mutex); -+ -+ /* -+ * css_tryget() is guaranteed to fail now. Tell subsystems to -+ * initate destruction. -+ */ -+ offline_css(css); -+ -+ /* -+ * If @cgrp is marked dead, it's waiting for refs of all css's to -+ * be disabled before proceeding to the second phase of cgroup -+ * destruction. If we are the last one, kick it off. -+ */ -+ if (!cgrp->nr_css && cgroup_is_dead(cgrp)) -+ cgroup_destroy_css_killed(cgrp); -+ -+ mutex_unlock(&cgroup_mutex); -+ -+ /* -+ * Put the css refs from kill_css(). Each css holds an extra -+ * reference to the cgroup's dentry and cgroup removal proceeds -+ * regardless of css refs. On the last put of each css, whenever -+ * that may be, the extra dentry ref is put so that dentry -+ * destruction happens only after all css's are released. -+ */ -+ css_put(css); -+} -+ -+/* css kill confirmation processing requires process context, bounce */ -+static void css_killed_ref_fn(struct percpu_ref *ref) -+{ -+ struct cgroup_subsys_state *css = -+ container_of(ref, struct cgroup_subsys_state, refcnt); -+ -+ INIT_WORK(&css->destroy_work, css_killed_work_fn); -+ queue_work(cgroup_destroy_wq, &css->destroy_work); -+} -+ -+/** -+ * kill_css - destroy a css -+ * @css: css to destroy -+ * -+ * This function initiates destruction of @css by removing cgroup interface -+ * files and putting its base reference. ->css_offline() will be invoked -+ * asynchronously once css_tryget() is guaranteed to fail and when the -+ * reference count reaches zero, @css will be released. -+ */ -+static void kill_css(struct cgroup_subsys_state *css) -+{ -+ cgroup_clear_dir(css->cgroup, 1 << css->ss->subsys_id); -+ -+ /* -+ * Killing would put the base ref, but we need to keep it alive -+ * until after ->css_offline(). -+ */ -+ css_get(css); -+ -+ /* -+ * cgroup core guarantees that, by the time ->css_offline() is -+ * invoked, no new css reference will be given out via -+ * css_tryget(). We can't simply call percpu_ref_kill() and -+ * proceed to offlining css's because percpu_ref_kill() doesn't -+ * guarantee that the ref is seen as killed on all CPUs on return. -+ * -+ * Use percpu_ref_kill_and_confirm() to get notifications as each -+ * css is confirmed to be seen as killed on all CPUs. -+ */ -+ percpu_ref_kill_and_confirm(&css->refcnt, css_killed_ref_fn); -+} -+ -+/** -+ * cgroup_destroy_locked - the first stage of cgroup destruction -+ * @cgrp: cgroup to be destroyed -+ * -+ * css's make use of percpu refcnts whose killing latency shouldn't be -+ * exposed to userland and are RCU protected. Also, cgroup core needs to -+ * guarantee that css_tryget() won't succeed by the time ->css_offline() is -+ * invoked. To satisfy all the requirements, destruction is implemented in -+ * the following two steps. -+ * -+ * s1. Verify @cgrp can be destroyed and mark it dying. Remove all -+ * userland visible parts and start killing the percpu refcnts of -+ * css's. Set up so that the next stage will be kicked off once all -+ * the percpu refcnts are confirmed to be killed. -+ * -+ * s2. Invoke ->css_offline(), mark the cgroup dead and proceed with the -+ * rest of destruction. Once all cgroup references are gone, the -+ * cgroup is RCU-freed. -+ * -+ * This function implements s1. After this step, @cgrp is gone as far as -+ * the userland is concerned and a new cgroup with the same name may be -+ * created. As cgroup doesn't care about the names internally, this -+ * doesn't cause any problem. -+ */ -+static int cgroup_destroy_locked(struct cgroup *cgrp) -+ __releases(&cgroup_mutex) __acquires(&cgroup_mutex) -+{ -+ struct dentry *d = cgrp->dentry; -+ struct cgroup_event *event, *tmp; -+ struct cgroup_subsys *ss; -+ struct cgroup *child; -+ bool empty; -+ -+ lockdep_assert_held(&d->d_inode->i_mutex); -+ lockdep_assert_held(&cgroup_mutex); -+ -+ /* -+ * css_set_lock synchronizes access to ->cset_links and prevents -+ * @cgrp from being removed while __put_css_set() is in progress. -+ */ -+ read_lock(&css_set_lock); -+ empty = list_empty(&cgrp->cset_links); -+ read_unlock(&css_set_lock); -+ if (!empty) -+ return -EBUSY; -+ -+ /* -+ * Make sure there's no live children. We can't test ->children -+ * emptiness as dead children linger on it while being destroyed; -+ * otherwise, "rmdir parent/child parent" may fail with -EBUSY. -+ */ -+ empty = true; -+ rcu_read_lock(); -+ list_for_each_entry_rcu(child, &cgrp->children, sibling) { -+ empty = cgroup_is_dead(child); -+ if (!empty) -+ break; -+ } -+ rcu_read_unlock(); -+ if (!empty) -+ return -EBUSY; -+ -+ /* -+ * Initiate massacre of all css's. cgroup_destroy_css_killed() -+ * will be invoked to perform the rest of destruction once the -+ * percpu refs of all css's are confirmed to be killed. -+ */ -+ for_each_root_subsys(cgrp->root, ss) { -+ struct cgroup_subsys_state *css = cgroup_css(cgrp, ss); -+ -+ if (css) -+ kill_css(css); -+ } -+ -+ /* -+ * Mark @cgrp dead. This prevents further task migration and child -+ * creation by disabling cgroup_lock_live_group(). Note that -+ * CGRP_DEAD assertion is depended upon by css_next_child() to -+ * resume iteration after dropping RCU read lock. See -+ * css_next_child() for details. -+ */ -+ set_bit(CGRP_DEAD, &cgrp->flags); -+ -+ /* CGRP_DEAD is set, remove from ->release_list for the last time */ -+ raw_spin_lock(&release_list_lock); -+ if (!list_empty(&cgrp->release_list)) -+ list_del_init(&cgrp->release_list); -+ raw_spin_unlock(&release_list_lock); -+ -+ /* -+ * If @cgrp has css's attached, the second stage of cgroup -+ * destruction is kicked off from css_killed_work_fn() after the -+ * refs of all attached css's are killed. If @cgrp doesn't have -+ * any css, we kick it off here. -+ */ -+ if (!cgrp->nr_css) -+ cgroup_destroy_css_killed(cgrp); -+ -+ /* -+ * Clear the base files and remove @cgrp directory. The removal -+ * puts the base ref but we aren't quite done with @cgrp yet, so -+ * hold onto it. -+ */ -+ cgroup_addrm_files(cgrp, cgroup_base_files, false); -+ dget(d); -+ cgroup_d_remove_dir(d); -+ -+ /* -+ * Unregister events and notify userspace. -+ * Notify userspace about cgroup removing only after rmdir of cgroup -+ * directory to avoid race between userspace and kernelspace. -+ */ -+ spin_lock(&cgrp->event_list_lock); -+ list_for_each_entry_safe(event, tmp, &cgrp->event_list, list) { -+ list_del_init(&event->list); -+ schedule_work(&event->remove); -+ } -+ spin_unlock(&cgrp->event_list_lock); -+ -+ return 0; -+}; -+ -+/** -+ * cgroup_destroy_css_killed - the second step of cgroup destruction -+ * @work: cgroup->destroy_free_work -+ * -+ * This function is invoked from a work item for a cgroup which is being -+ * destroyed after all css's are offlined and performs the rest of -+ * destruction. This is the second step of destruction described in the -+ * comment above cgroup_destroy_locked(). -+ */ -+static void cgroup_destroy_css_killed(struct cgroup *cgrp) -+{ -+ struct cgroup *parent = cgrp->parent; -+ struct dentry *d = cgrp->dentry; -+ -+ lockdep_assert_held(&cgroup_mutex); -+ -+ /* delete this cgroup from parent->children */ -+ list_del_rcu(&cgrp->sibling); -+ -+ dput(d); -+ -+ set_bit(CGRP_RELEASABLE, &parent->flags); -+ check_for_release(parent); -+} -+ -+static int cgroup_rmdir(struct inode *unused_dir, struct dentry *dentry) -+{ -+ int ret; -+ -+ mutex_lock(&cgroup_mutex); -+ ret = cgroup_destroy_locked(dentry->d_fsdata); -+ mutex_unlock(&cgroup_mutex); -+ -+ return ret; -+} -+ -+static void __init_or_module cgroup_init_cftsets(struct cgroup_subsys *ss) -+{ -+ INIT_LIST_HEAD(&ss->cftsets); -+ -+ /* -+ * base_cftset is embedded in subsys itself, no need to worry about -+ * deregistration. -+ */ -+ if (ss->base_cftypes) { -+ struct cftype *cft; -+ -+ for (cft = ss->base_cftypes; cft->name[0] != '\0'; cft++) -+ cft->ss = ss; -+ -+ ss->base_cftset.cfts = ss->base_cftypes; -+ list_add_tail(&ss->base_cftset.node, &ss->cftsets); -+ } -+} -+ -+static void __init cgroup_init_subsys(struct cgroup_subsys *ss) -+{ -+ struct cgroup_subsys_state *css; -+ -+ printk(KERN_INFO "Initializing cgroup subsys %s\n", ss->name); -+ -+ mutex_lock(&cgroup_mutex); -+ -+ /* init base cftset */ -+ cgroup_init_cftsets(ss); -+ -+ /* Create the top cgroup state for this subsystem */ -+ list_add(&ss->sibling, &cgroup_dummy_root.subsys_list); -+ ss->root = &cgroup_dummy_root; -+ css = ss->css_alloc(cgroup_css(cgroup_dummy_top, ss)); -+ /* We don't handle early failures gracefully */ -+ BUG_ON(IS_ERR(css)); -+ init_css(css, ss, cgroup_dummy_top); -+ -+ /* Update the init_css_set to contain a subsys -+ * pointer to this state - since the subsystem is -+ * newly registered, all tasks and hence the -+ * init_css_set is in the subsystem's top cgroup. */ -+ init_css_set.subsys[ss->subsys_id] = css; -+ -+ need_forkexit_callback |= ss->fork || ss->exit; -+ -+ /* At system boot, before all subsystems have been -+ * registered, no tasks have been forked, so we don't -+ * need to invoke fork callbacks here. */ -+ BUG_ON(!list_empty(&init_task.tasks)); -+ -+ BUG_ON(online_css(css)); -+ -+ mutex_unlock(&cgroup_mutex); -+ -+ /* this function shouldn't be used with modular subsystems, since they -+ * need to register a subsys_id, among other things */ -+ BUG_ON(ss->module); -+} -+ -+/** -+ * cgroup_load_subsys: load and register a modular subsystem at runtime -+ * @ss: the subsystem to load -+ * -+ * This function should be called in a modular subsystem's initcall. If the -+ * subsystem is built as a module, it will be assigned a new subsys_id and set -+ * up for use. If the subsystem is built-in anyway, work is delegated to the -+ * simpler cgroup_init_subsys. -+ */ -+int __init_or_module cgroup_load_subsys(struct cgroup_subsys *ss) -+{ -+ struct cgroup_subsys_state *css; -+ int i, ret; -+ struct hlist_node *tmp; -+ struct css_set *cset; -+ unsigned long key; -+ -+ /* check name and function validity */ -+ if (ss->name == NULL || strlen(ss->name) > MAX_CGROUP_TYPE_NAMELEN || -+ ss->css_alloc == NULL || ss->css_free == NULL) -+ return -EINVAL; -+ -+ /* -+ * we don't support callbacks in modular subsystems. this check is -+ * before the ss->module check for consistency; a subsystem that could -+ * be a module should still have no callbacks even if the user isn't -+ * compiling it as one. -+ */ -+ if (ss->fork || ss->exit) -+ return -EINVAL; -+ -+ /* -+ * an optionally modular subsystem is built-in: we want to do nothing, -+ * since cgroup_init_subsys will have already taken care of it. -+ */ -+ if (ss->module == NULL) { -+ /* a sanity check */ -+ BUG_ON(cgroup_subsys[ss->subsys_id] != ss); -+ return 0; -+ } -+ -+ /* init base cftset */ -+ cgroup_init_cftsets(ss); -+ -+ mutex_lock(&cgroup_mutex); -+ cgroup_subsys[ss->subsys_id] = ss; -+ -+ /* -+ * no ss->css_alloc seems to need anything important in the ss -+ * struct, so this can happen first (i.e. before the dummy root -+ * attachment). -+ */ -+ css = ss->css_alloc(cgroup_css(cgroup_dummy_top, ss)); -+ if (IS_ERR(css)) { -+ /* failure case - need to deassign the cgroup_subsys[] slot. */ -+ cgroup_subsys[ss->subsys_id] = NULL; -+ mutex_unlock(&cgroup_mutex); -+ return PTR_ERR(css); -+ } -+ -+ list_add(&ss->sibling, &cgroup_dummy_root.subsys_list); -+ ss->root = &cgroup_dummy_root; -+ -+ /* our new subsystem will be attached to the dummy hierarchy. */ -+ init_css(css, ss, cgroup_dummy_top); -+ -+ /* -+ * Now we need to entangle the css into the existing css_sets. unlike -+ * in cgroup_init_subsys, there are now multiple css_sets, so each one -+ * will need a new pointer to it; done by iterating the css_set_table. -+ * furthermore, modifying the existing css_sets will corrupt the hash -+ * table state, so each changed css_set will need its hash recomputed. -+ * this is all done under the css_set_lock. -+ */ -+ write_lock(&css_set_lock); -+ hash_for_each_safe(css_set_table, i, tmp, cset, hlist) { -+ /* skip entries that we already rehashed */ -+ if (cset->subsys[ss->subsys_id]) -+ continue; -+ /* remove existing entry */ -+ hash_del(&cset->hlist); -+ /* set new value */ -+ cset->subsys[ss->subsys_id] = css; -+ /* recompute hash and restore entry */ -+ key = css_set_hash(cset->subsys); -+ hash_add(css_set_table, &cset->hlist, key); -+ } -+ write_unlock(&css_set_lock); -+ -+ ret = online_css(css); -+ if (ret) -+ goto err_unload; -+ -+ /* success! */ -+ mutex_unlock(&cgroup_mutex); -+ return 0; -+ -+err_unload: -+ mutex_unlock(&cgroup_mutex); -+ /* @ss can't be mounted here as try_module_get() would fail */ -+ cgroup_unload_subsys(ss); -+ return ret; -+} -+EXPORT_SYMBOL_GPL(cgroup_load_subsys); -+ -+/** -+ * cgroup_unload_subsys: unload a modular subsystem -+ * @ss: the subsystem to unload -+ * -+ * This function should be called in a modular subsystem's exitcall. When this -+ * function is invoked, the refcount on the subsystem's module will be 0, so -+ * the subsystem will not be attached to any hierarchy. -+ */ -+void cgroup_unload_subsys(struct cgroup_subsys *ss) -+{ -+ struct cgrp_cset_link *link; -+ -+ BUG_ON(ss->module == NULL); -+ -+ /* -+ * we shouldn't be called if the subsystem is in use, and the use of -+ * try_module_get() in rebind_subsystems() should ensure that it -+ * doesn't start being used while we're killing it off. -+ */ -+ BUG_ON(ss->root != &cgroup_dummy_root); -+ -+ mutex_lock(&cgroup_mutex); -+ -+ offline_css(cgroup_css(cgroup_dummy_top, ss)); -+ -+ /* deassign the subsys_id */ -+ cgroup_subsys[ss->subsys_id] = NULL; -+ -+ /* remove subsystem from the dummy root's list of subsystems */ -+ list_del_init(&ss->sibling); -+ -+ /* -+ * disentangle the css from all css_sets attached to the dummy -+ * top. as in loading, we need to pay our respects to the hashtable -+ * gods. -+ */ -+ write_lock(&css_set_lock); -+ list_for_each_entry(link, &cgroup_dummy_top->cset_links, cset_link) { -+ struct css_set *cset = link->cset; -+ unsigned long key; -+ -+ hash_del(&cset->hlist); -+ cset->subsys[ss->subsys_id] = NULL; -+ key = css_set_hash(cset->subsys); -+ hash_add(css_set_table, &cset->hlist, key); -+ } -+ write_unlock(&css_set_lock); -+ -+ /* -+ * remove subsystem's css from the cgroup_dummy_top and free it - -+ * need to free before marking as null because ss->css_free needs -+ * the cgrp->subsys pointer to find their state. -+ */ -+ ss->css_free(cgroup_css(cgroup_dummy_top, ss)); -+ RCU_INIT_POINTER(cgroup_dummy_top->subsys[ss->subsys_id], NULL); -+ -+ mutex_unlock(&cgroup_mutex); -+} -+EXPORT_SYMBOL_GPL(cgroup_unload_subsys); -+ -+/** -+ * cgroup_init_early - cgroup initialization at system boot -+ * -+ * Initialize cgroups at system boot, and initialize any -+ * subsystems that request early init. -+ */ -+int __init cgroup_init_early(void) -+{ -+ struct cgroup_subsys *ss; -+ int i; -+ -+ atomic_set(&init_css_set.refcount, 1); -+ INIT_LIST_HEAD(&init_css_set.cgrp_links); -+ INIT_LIST_HEAD(&init_css_set.tasks); -+ INIT_HLIST_NODE(&init_css_set.hlist); -+ css_set_count = 1; -+ init_cgroup_root(&cgroup_dummy_root); -+ cgroup_root_count = 1; -+ RCU_INIT_POINTER(init_task.cgroups, &init_css_set); -+ -+ init_cgrp_cset_link.cset = &init_css_set; -+ init_cgrp_cset_link.cgrp = cgroup_dummy_top; -+ list_add(&init_cgrp_cset_link.cset_link, &cgroup_dummy_top->cset_links); -+ list_add(&init_cgrp_cset_link.cgrp_link, &init_css_set.cgrp_links); -+ -+ /* at bootup time, we don't worry about modular subsystems */ -+ for_each_builtin_subsys(ss, i) { -+ BUG_ON(!ss->name); -+ BUG_ON(strlen(ss->name) > MAX_CGROUP_TYPE_NAMELEN); -+ BUG_ON(!ss->css_alloc); -+ BUG_ON(!ss->css_free); -+ if (ss->subsys_id != i) { -+ printk(KERN_ERR "cgroup: Subsys %s id == %d\n", -+ ss->name, ss->subsys_id); -+ BUG(); -+ } -+ -+ if (ss->early_init) -+ cgroup_init_subsys(ss); -+ } -+ return 0; -+} -+ -+/** -+ * cgroup_init - cgroup initialization -+ * -+ * Register cgroup filesystem and /proc file, and initialize -+ * any subsystems that didn't request early init. -+ */ -+int __init cgroup_init(void) -+{ -+ struct cgroup_subsys *ss; -+ unsigned long key; -+ int i, err; -+ -+ err = bdi_init(&cgroup_backing_dev_info); -+ if (err) -+ return err; -+ -+ for_each_builtin_subsys(ss, i) { -+ if (!ss->early_init) -+ cgroup_init_subsys(ss); -+ } -+ -+ /* allocate id for the dummy hierarchy */ -+ mutex_lock(&cgroup_mutex); -+ mutex_lock(&cgroup_root_mutex); -+ -+ /* Add init_css_set to the hash table */ -+ key = css_set_hash(init_css_set.subsys); -+ hash_add(css_set_table, &init_css_set.hlist, key); -+ -+ BUG_ON(cgroup_init_root_id(&cgroup_dummy_root, 0, 1)); -+ -+ err = idr_alloc(&cgroup_dummy_root.cgroup_idr, cgroup_dummy_top, -+ 0, 1, GFP_KERNEL); -+ BUG_ON(err < 0); -+ -+ mutex_unlock(&cgroup_root_mutex); -+ mutex_unlock(&cgroup_mutex); -+ -+ cgroup_kobj = kobject_create_and_add("cgroup", fs_kobj); -+ if (!cgroup_kobj) { -+ err = -ENOMEM; -+ goto out; -+ } -+ -+ err = register_filesystem(&cgroup_fs_type); -+ if (err < 0) { -+ kobject_put(cgroup_kobj); -+ goto out; -+ } -+ -+ proc_create("cgroups", 0, NULL, &proc_cgroupstats_operations); -+ -+out: -+ if (err) -+ bdi_destroy(&cgroup_backing_dev_info); -+ -+ return err; -+} -+ -+static int __init cgroup_wq_init(void) -+{ -+ /* -+ * There isn't much point in executing destruction path in -+ * parallel. Good chunk is serialized with cgroup_mutex anyway. -+ * Use 1 for @max_active. -+ * -+ * We would prefer to do this in cgroup_init() above, but that -+ * is called before init_workqueues(): so leave this until after. -+ */ -+ cgroup_destroy_wq = alloc_workqueue("cgroup_destroy", 0, 1); -+ BUG_ON(!cgroup_destroy_wq); -+ return 0; -+} -+core_initcall(cgroup_wq_init); -+ -+/* -+ * proc_cgroup_show() -+ * - Print task's cgroup paths into seq_file, one line for each hierarchy -+ * - Used for /proc/<pid>/cgroup. -+ * - No need to task_lock(tsk) on this tsk->cgroup reference, as it -+ * doesn't really matter if tsk->cgroup changes after we read it, -+ * and we take cgroup_mutex, keeping cgroup_attach_task() from changing it -+ * anyway. No need to check that tsk->cgroup != NULL, thanks to -+ * the_top_cgroup_hack in cgroup_exit(), which sets an exiting tasks -+ * cgroup to top_cgroup. -+ */ -+ -+/* TODO: Use a proper seq_file iterator */ -+int proc_cgroup_show(struct seq_file *m, void *v) -+{ -+ struct pid *pid; -+ struct task_struct *tsk; -+ char *buf; -+ int retval; -+ struct cgroupfs_root *root; -+ -+ retval = -ENOMEM; -+ buf = kmalloc(PAGE_SIZE, GFP_KERNEL); -+ if (!buf) -+ goto out; -+ -+ retval = -ESRCH; -+ pid = m->private; -+ tsk = get_pid_task(pid, PIDTYPE_PID); -+ if (!tsk) -+ goto out_free; -+ -+ retval = 0; -+ -+ mutex_lock(&cgroup_mutex); -+ -+ for_each_active_root(root) { -+ struct cgroup_subsys *ss; -+ struct cgroup *cgrp; -+ int count = 0; -+ -+ seq_printf(m, "%d:", root->hierarchy_id); -+ for_each_root_subsys(root, ss) -+ seq_printf(m, "%s%s", count++ ? "," : "", ss->name); -+ if (strlen(root->name)) -+ seq_printf(m, "%sname=%s", count ? "," : "", -+ root->name); -+ seq_putc(m, ':'); -+ cgrp = task_cgroup_from_root(tsk, root); -+ retval = cgroup_path(cgrp, buf, PAGE_SIZE); -+ if (retval < 0) -+ goto out_unlock; -+ seq_puts(m, buf); -+ seq_putc(m, '\n'); -+ } -+ -+out_unlock: -+ mutex_unlock(&cgroup_mutex); -+ put_task_struct(tsk); -+out_free: -+ kfree(buf); -+out: -+ return retval; -+} -+ -+/* Display information about each subsystem and each hierarchy */ -+static int proc_cgroupstats_show(struct seq_file *m, void *v) -+{ -+ struct cgroup_subsys *ss; -+ int i; -+ -+ seq_puts(m, "#subsys_name\thierarchy\tnum_cgroups\tenabled\n"); -+ /* -+ * ideally we don't want subsystems moving around while we do this. -+ * cgroup_mutex is also necessary to guarantee an atomic snapshot of -+ * subsys/hierarchy state. -+ */ -+ mutex_lock(&cgroup_mutex); -+ -+ for_each_subsys(ss, i) -+ seq_printf(m, "%s\t%d\t%d\t%d\n", -+ ss->name, ss->root->hierarchy_id, -+ ss->root->number_of_cgroups, !ss->disabled); -+ -+ mutex_unlock(&cgroup_mutex); -+ return 0; -+} -+ -+static int cgroupstats_open(struct inode *inode, struct file *file) -+{ -+ return single_open(file, proc_cgroupstats_show, NULL); -+} -+ -+static const struct file_operations proc_cgroupstats_operations = { -+ .open = cgroupstats_open, -+ .read = seq_read, -+ .llseek = seq_lseek, -+ .release = single_release, -+}; -+ -+/** -+ * cgroup_fork - attach newly forked task to its parents cgroup. -+ * @child: pointer to task_struct of forking parent process. -+ * -+ * Description: A task inherits its parent's cgroup at fork(). -+ * -+ * A pointer to the shared css_set was automatically copied in -+ * fork.c by dup_task_struct(). However, we ignore that copy, since -+ * it was not made under the protection of RCU or cgroup_mutex, so -+ * might no longer be a valid cgroup pointer. cgroup_attach_task() might -+ * have already changed current->cgroups, allowing the previously -+ * referenced cgroup group to be removed and freed. -+ * -+ * At the point that cgroup_fork() is called, 'current' is the parent -+ * task, and the passed argument 'child' points to the child task. -+ */ -+void cgroup_fork(struct task_struct *child) -+{ -+ task_lock(current); -+ get_css_set(task_css_set(current)); -+ child->cgroups = current->cgroups; -+ task_unlock(current); -+ INIT_LIST_HEAD(&child->cg_list); -+} -+ -+/** -+ * cgroup_post_fork - called on a new task after adding it to the task list -+ * @child: the task in question -+ * -+ * Adds the task to the list running through its css_set if necessary and -+ * call the subsystem fork() callbacks. Has to be after the task is -+ * visible on the task list in case we race with the first call to -+ * cgroup_task_iter_start() - to guarantee that the new task ends up on its -+ * list. -+ */ -+void cgroup_post_fork(struct task_struct *child) -+{ -+ struct cgroup_subsys *ss; -+ int i; -+ -+ /* -+ * use_task_css_set_links is set to 1 before we walk the tasklist -+ * under the tasklist_lock and we read it here after we added the child -+ * to the tasklist under the tasklist_lock as well. If the child wasn't -+ * yet in the tasklist when we walked through it from -+ * cgroup_enable_task_cg_lists(), then use_task_css_set_links value -+ * should be visible now due to the paired locking and barriers implied -+ * by LOCK/UNLOCK: it is written before the tasklist_lock unlock -+ * in cgroup_enable_task_cg_lists() and read here after the tasklist_lock -+ * lock on fork. -+ */ -+ if (use_task_css_set_links) { -+ write_lock(&css_set_lock); -+ task_lock(child); -+ if (list_empty(&child->cg_list)) -+ list_add(&child->cg_list, &task_css_set(child)->tasks); -+ task_unlock(child); -+ write_unlock(&css_set_lock); -+ } -+ -+ /* -+ * Call ss->fork(). This must happen after @child is linked on -+ * css_set; otherwise, @child might change state between ->fork() -+ * and addition to css_set. -+ */ -+ if (need_forkexit_callback) { -+ /* -+ * fork/exit callbacks are supported only for builtin -+ * subsystems, and the builtin section of the subsys -+ * array is immutable, so we don't need to lock the -+ * subsys array here. On the other hand, modular section -+ * of the array can be freed at module unload, so we -+ * can't touch that. -+ */ -+ for_each_builtin_subsys(ss, i) -+ if (ss->fork) -+ ss->fork(child); -+ } -+} -+ -+/** -+ * cgroup_exit - detach cgroup from exiting task -+ * @tsk: pointer to task_struct of exiting process -+ * @run_callback: run exit callbacks? -+ * -+ * Description: Detach cgroup from @tsk and release it. -+ * -+ * Note that cgroups marked notify_on_release force every task in -+ * them to take the global cgroup_mutex mutex when exiting. -+ * This could impact scaling on very large systems. Be reluctant to -+ * use notify_on_release cgroups where very high task exit scaling -+ * is required on large systems. -+ * -+ * the_top_cgroup_hack: -+ * -+ * Set the exiting tasks cgroup to the root cgroup (top_cgroup). -+ * -+ * We call cgroup_exit() while the task is still competent to -+ * handle notify_on_release(), then leave the task attached to the -+ * root cgroup in each hierarchy for the remainder of its exit. -+ * -+ * To do this properly, we would increment the reference count on -+ * top_cgroup, and near the very end of the kernel/exit.c do_exit() -+ * code we would add a second cgroup function call, to drop that -+ * reference. This would just create an unnecessary hot spot on -+ * the top_cgroup reference count, to no avail. -+ * -+ * Normally, holding a reference to a cgroup without bumping its -+ * count is unsafe. The cgroup could go away, or someone could -+ * attach us to a different cgroup, decrementing the count on -+ * the first cgroup that we never incremented. But in this case, -+ * top_cgroup isn't going away, and either task has PF_EXITING set, -+ * which wards off any cgroup_attach_task() attempts, or task is a failed -+ * fork, never visible to cgroup_attach_task. -+ */ -+void cgroup_exit(struct task_struct *tsk, int run_callbacks) -+{ -+ struct cgroup_subsys *ss; -+ struct css_set *cset; -+ int i; -+ -+ /* -+ * Unlink from the css_set task list if necessary. -+ * Optimistically check cg_list before taking -+ * css_set_lock -+ */ -+ if (!list_empty(&tsk->cg_list)) { -+ write_lock(&css_set_lock); -+ if (!list_empty(&tsk->cg_list)) -+ list_del_init(&tsk->cg_list); -+ write_unlock(&css_set_lock); -+ } -+ -+ /* Reassign the task to the init_css_set. */ -+ task_lock(tsk); -+ cset = task_css_set(tsk); -+ RCU_INIT_POINTER(tsk->cgroups, &init_css_set); -+ -+ if (run_callbacks && need_forkexit_callback) { -+ /* -+ * fork/exit callbacks are supported only for builtin -+ * subsystems, see cgroup_post_fork() for details. -+ */ -+ for_each_builtin_subsys(ss, i) { -+ if (ss->exit) { -+ struct cgroup_subsys_state *old_css = cset->subsys[i]; -+ struct cgroup_subsys_state *css = task_css(tsk, i); -+ -+ ss->exit(css, old_css, tsk); -+ } -+ } -+ } -+ task_unlock(tsk); -+ -+ put_css_set_taskexit(cset); -+} -+ -+static void check_for_release(struct cgroup *cgrp) -+{ -+ if (cgroup_is_releasable(cgrp) && -+ list_empty(&cgrp->cset_links) && list_empty(&cgrp->children)) { -+ /* -+ * Control Group is currently removeable. If it's not -+ * already queued for a userspace notification, queue -+ * it now -+ */ -+ int need_schedule_work = 0; -+ -+ raw_spin_lock(&release_list_lock); -+ if (!cgroup_is_dead(cgrp) && -+ list_empty(&cgrp->release_list)) { -+ list_add(&cgrp->release_list, &release_list); -+ need_schedule_work = 1; -+ } -+ raw_spin_unlock(&release_list_lock); -+ if (need_schedule_work) -+ schedule_work(&release_agent_work); -+ } -+} -+ -+/* -+ * Notify userspace when a cgroup is released, by running the -+ * configured release agent with the name of the cgroup (path -+ * relative to the root of cgroup file system) as the argument. -+ * -+ * Most likely, this user command will try to rmdir this cgroup. -+ * -+ * This races with the possibility that some other task will be -+ * attached to this cgroup before it is removed, or that some other -+ * user task will 'mkdir' a child cgroup of this cgroup. That's ok. -+ * The presumed 'rmdir' will fail quietly if this cgroup is no longer -+ * unused, and this cgroup will be reprieved from its death sentence, -+ * to continue to serve a useful existence. Next time it's released, -+ * we will get notified again, if it still has 'notify_on_release' set. -+ * -+ * The final arg to call_usermodehelper() is UMH_WAIT_EXEC, which -+ * means only wait until the task is successfully execve()'d. The -+ * separate release agent task is forked by call_usermodehelper(), -+ * then control in this thread returns here, without waiting for the -+ * release agent task. We don't bother to wait because the caller of -+ * this routine has no use for the exit status of the release agent -+ * task, so no sense holding our caller up for that. -+ */ -+static void cgroup_release_agent(struct work_struct *work) -+{ -+ BUG_ON(work != &release_agent_work); -+ mutex_lock(&cgroup_mutex); -+ raw_spin_lock(&release_list_lock); -+ while (!list_empty(&release_list)) { -+ char *argv[3], *envp[3]; -+ int i; -+ char *pathbuf = NULL, *agentbuf = NULL; -+ struct cgroup *cgrp = list_entry(release_list.next, -+ struct cgroup, -+ release_list); -+ list_del_init(&cgrp->release_list); -+ raw_spin_unlock(&release_list_lock); -+ pathbuf = kmalloc(PAGE_SIZE, GFP_KERNEL); -+ if (!pathbuf) -+ goto continue_free; -+ if (cgroup_path(cgrp, pathbuf, PAGE_SIZE) < 0) -+ goto continue_free; -+ agentbuf = kstrdup(cgrp->root->release_agent_path, GFP_KERNEL); -+ if (!agentbuf) -+ goto continue_free; -+ -+ i = 0; -+ argv[i++] = agentbuf; -+ argv[i++] = pathbuf; -+ argv[i] = NULL; -+ -+ i = 0; -+ /* minimal command environment */ -+ envp[i++] = "HOME=/"; -+ envp[i++] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin"; -+ envp[i] = NULL; -+ -+ /* Drop the lock while we invoke the usermode helper, -+ * since the exec could involve hitting disk and hence -+ * be a slow process */ -+ mutex_unlock(&cgroup_mutex); -+ call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC); -+ mutex_lock(&cgroup_mutex); -+ continue_free: -+ kfree(pathbuf); -+ kfree(agentbuf); -+ raw_spin_lock(&release_list_lock); -+ } -+ raw_spin_unlock(&release_list_lock); -+ mutex_unlock(&cgroup_mutex); -+} -+ -+static int __init cgroup_disable(char *str) -+{ -+ struct cgroup_subsys *ss; -+ char *token; -+ int i; -+ -+ while ((token = strsep(&str, ",")) != NULL) { -+ if (!*token) -+ continue; -+ -+ /* -+ * cgroup_disable, being at boot time, can't know about -+ * module subsystems, so we don't worry about them. -+ */ -+ for_each_builtin_subsys(ss, i) { -+ if (!strcmp(token, ss->name)) { -+ ss->disabled = 1; -+ printk(KERN_INFO "Disabling %s control group" -+ " subsystem\n", ss->name); -+ break; -+ } -+ } -+ } -+ return 1; -+} -+__setup("cgroup_disable=", cgroup_disable); -+ -+/** -+ * css_from_dir - get corresponding css from the dentry of a cgroup dir -+ * @dentry: directory dentry of interest -+ * @ss: subsystem of interest -+ * -+ * Must be called under RCU read lock. The caller is responsible for -+ * pinning the returned css if it needs to be accessed outside the RCU -+ * critical section. -+ */ -+struct cgroup_subsys_state *css_from_dir(struct dentry *dentry, -+ struct cgroup_subsys *ss) -+{ -+ struct cgroup *cgrp; -+ -+ WARN_ON_ONCE(!rcu_read_lock_held()); -+ -+ /* is @dentry a cgroup dir? */ -+ if (!dentry->d_inode || -+ dentry->d_inode->i_op != &cgroup_dir_inode_operations) -+ return ERR_PTR(-EBADF); -+ -+ cgrp = __d_cgrp(dentry); -+ return cgroup_css(cgrp, ss) ?: ERR_PTR(-ENOENT); -+} -+ -+/** -+ * css_from_id - lookup css by id -+ * @id: the cgroup id -+ * @ss: cgroup subsys to be looked into -+ * -+ * Returns the css if there's valid one with @id, otherwise returns NULL. -+ * Should be called under rcu_read_lock(). -+ */ -+struct cgroup_subsys_state *css_from_id(int id, struct cgroup_subsys *ss) -+{ -+ struct cgroup *cgrp; -+ -+ rcu_lockdep_assert(rcu_read_lock_held() || -+ lockdep_is_held(&cgroup_mutex), -+ "css_from_id() needs proper protection"); -+ -+ cgrp = idr_find(&ss->root->cgroup_idr, id); -+ if (cgrp) -+ return cgroup_css(cgrp, ss); -+ return NULL; -+} -+ -+#ifdef CONFIG_CGROUP_DEBUG -+static struct cgroup_subsys_state * -+debug_css_alloc(struct cgroup_subsys_state *parent_css) -+{ -+ struct cgroup_subsys_state *css = kzalloc(sizeof(*css), GFP_KERNEL); -+ -+ if (!css) -+ return ERR_PTR(-ENOMEM); -+ -+ return css; -+} -+ -+static void debug_css_free(struct cgroup_subsys_state *css) -+{ -+ kfree(css); -+} -+ -+static u64 debug_taskcount_read(struct cgroup_subsys_state *css, -+ struct cftype *cft) -+{ -+ return cgroup_task_count(css->cgroup); -+} -+ -+static u64 current_css_set_read(struct cgroup_subsys_state *css, -+ struct cftype *cft) -+{ -+ return (u64)(unsigned long)current->cgroups; -+} -+ -+static u64 current_css_set_refcount_read(struct cgroup_subsys_state *css, -+ struct cftype *cft) -+{ -+ u64 count; -+ -+ rcu_read_lock(); -+ count = atomic_read(&task_css_set(current)->refcount); -+ rcu_read_unlock(); -+ return count; -+} -+ -+static int current_css_set_cg_links_read(struct cgroup_subsys_state *css, -+ struct cftype *cft, -+ struct seq_file *seq) -+{ -+ struct cgrp_cset_link *link; -+ struct css_set *cset; -+ -+ read_lock(&css_set_lock); -+ rcu_read_lock(); -+ cset = rcu_dereference(current->cgroups); -+ list_for_each_entry(link, &cset->cgrp_links, cgrp_link) { -+ struct cgroup *c = link->cgrp; -+ const char *name; -+ -+ if (c->dentry) -+ name = c->dentry->d_name.name; -+ else -+ name = "?"; -+ seq_printf(seq, "Root %d group %s\n", -+ c->root->hierarchy_id, name); -+ } -+ rcu_read_unlock(); -+ read_unlock(&css_set_lock); -+ return 0; -+} -+ -+#define MAX_TASKS_SHOWN_PER_CSS 25 -+static int cgroup_css_links_read(struct cgroup_subsys_state *css, -+ struct cftype *cft, struct seq_file *seq) -+{ -+ struct cgrp_cset_link *link; -+ -+ read_lock(&css_set_lock); -+ list_for_each_entry(link, &css->cgroup->cset_links, cset_link) { -+ struct css_set *cset = link->cset; -+ struct task_struct *task; -+ int count = 0; -+ seq_printf(seq, "css_set %p\n", cset); -+ list_for_each_entry(task, &cset->tasks, cg_list) { -+ if (count++ > MAX_TASKS_SHOWN_PER_CSS) { -+ seq_puts(seq, " ...\n"); -+ break; -+ } else { -+ seq_printf(seq, " task %d\n", -+ task_pid_vnr(task)); -+ } -+ } -+ } -+ read_unlock(&css_set_lock); -+ return 0; -+} -+ -+static u64 releasable_read(struct cgroup_subsys_state *css, struct cftype *cft) -+{ -+ return test_bit(CGRP_RELEASABLE, &css->cgroup->flags); -+} -+ -+static struct cftype debug_files[] = { -+ { -+ .name = "taskcount", -+ .read_u64 = debug_taskcount_read, -+ }, -+ -+ { -+ .name = "current_css_set", -+ .read_u64 = current_css_set_read, -+ }, -+ -+ { -+ .name = "current_css_set_refcount", -+ .read_u64 = current_css_set_refcount_read, -+ }, -+ -+ { -+ .name = "current_css_set_cg_links", -+ .read_seq_string = current_css_set_cg_links_read, -+ }, -+ -+ { -+ .name = "cgroup_css_links", -+ .read_seq_string = cgroup_css_links_read, -+ }, -+ -+ { -+ .name = "releasable", -+ .read_u64 = releasable_read, -+ }, -+ -+ { } /* terminate */ -+}; -+ -+struct cgroup_subsys debug_subsys = { -+ .name = "debug", -+ .css_alloc = debug_css_alloc, -+ .css_free = debug_css_free, -+ .subsys_id = debug_subsys_id, -+ .base_cftypes = debug_files, -+}; -+#endif /* CONFIG_CGROUP_DEBUG */ -diff -Nur linux-3.13.6.orig/mm/memcontrol.c linux-3.13.6/mm/memcontrol.c ---- linux-3.13.6.orig/mm/memcontrol.c 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/mm/memcontrol.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/mm/memcontrol.c linux-raspberry-pi/mm/memcontrol.c +--- linux-3.13.6/mm/memcontrol.c 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/mm/memcontrol.c 2014-03-11 16:55:47.000000000 +0100 @@ -7030,6 +7030,7 @@ .bind = mem_cgroup_bind, .base_cftypes = mem_cgroup_files, @@ -101607,9 +96467,9 @@ diff -Nur linux-3.13.6.orig/mm/memcontrol.c linux-3.13.6/mm/memcontrol.c }; #ifdef CONFIG_MEMCG_SWAP -diff -Nur linux-3.13.6.orig/sound/arm/bcm2835.c linux-3.13.6/sound/arm/bcm2835.c ---- linux-3.13.6.orig/sound/arm/bcm2835.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/sound/arm/bcm2835.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/sound/arm/bcm2835.c linux-raspberry-pi/sound/arm/bcm2835.c +--- linux-3.13.6/sound/arm/bcm2835.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/sound/arm/bcm2835.c 2014-03-11 16:55:50.000000000 +0100 @@ -0,0 +1,413 @@ +/***************************************************************************** +* Copyright 2011 Broadcom Corporation. All rights reserved. @@ -102024,9 +96884,9 @@ diff -Nur linux-3.13.6.orig/sound/arm/bcm2835.c linux-3.13.6/sound/arm/bcm2835.c +MODULE_DESCRIPTION("Alsa driver for BCM2835 chip"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:bcm2835_alsa"); -diff -Nur linux-3.13.6.orig/sound/arm/bcm2835-ctl.c linux-3.13.6/sound/arm/bcm2835-ctl.c ---- linux-3.13.6.orig/sound/arm/bcm2835-ctl.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/sound/arm/bcm2835-ctl.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/sound/arm/bcm2835-ctl.c linux-raspberry-pi/sound/arm/bcm2835-ctl.c +--- linux-3.13.6/sound/arm/bcm2835-ctl.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/sound/arm/bcm2835-ctl.c 2014-03-11 16:55:50.000000000 +0100 @@ -0,0 +1,200 @@ +/***************************************************************************** +* Copyright 2011 Broadcom Corporation. All rights reserved. @@ -102228,9 +97088,9 @@ diff -Nur linux-3.13.6.orig/sound/arm/bcm2835-ctl.c linux-3.13.6/sound/arm/bcm28 + } + return 0; +} -diff -Nur linux-3.13.6.orig/sound/arm/bcm2835.h linux-3.13.6/sound/arm/bcm2835.h ---- linux-3.13.6.orig/sound/arm/bcm2835.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/sound/arm/bcm2835.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/sound/arm/bcm2835.h linux-raspberry-pi/sound/arm/bcm2835.h +--- linux-3.13.6/sound/arm/bcm2835.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/sound/arm/bcm2835.h 2014-03-11 16:55:50.000000000 +0100 @@ -0,0 +1,157 @@ +/***************************************************************************** +* Copyright 2011 Broadcom Corporation. All rights reserved. @@ -102389,9 +97249,9 @@ diff -Nur linux-3.13.6.orig/sound/arm/bcm2835.h linux-3.13.6/sound/arm/bcm2835.h +void bcm2835_audio_flush_playback_buffers(bcm2835_alsa_stream_t * alsa_stream); + +#endif /* __SOUND_ARM_BCM2835_H */ -diff -Nur linux-3.13.6.orig/sound/arm/bcm2835-pcm.c linux-3.13.6/sound/arm/bcm2835-pcm.c ---- linux-3.13.6.orig/sound/arm/bcm2835-pcm.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/sound/arm/bcm2835-pcm.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/sound/arm/bcm2835-pcm.c linux-raspberry-pi/sound/arm/bcm2835-pcm.c +--- linux-3.13.6/sound/arm/bcm2835-pcm.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/sound/arm/bcm2835-pcm.c 2014-03-11 16:55:50.000000000 +0100 @@ -0,0 +1,426 @@ +/***************************************************************************** +* Copyright 2011 Broadcom Corporation. All rights reserved. @@ -102819,9 +97679,9 @@ diff -Nur linux-3.13.6.orig/sound/arm/bcm2835-pcm.c linux-3.13.6/sound/arm/bcm28 + + return 0; +} -diff -Nur linux-3.13.6.orig/sound/arm/bcm2835-vchiq.c linux-3.13.6/sound/arm/bcm2835-vchiq.c ---- linux-3.13.6.orig/sound/arm/bcm2835-vchiq.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/sound/arm/bcm2835-vchiq.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/sound/arm/bcm2835-vchiq.c linux-raspberry-pi/sound/arm/bcm2835-vchiq.c +--- linux-3.13.6/sound/arm/bcm2835-vchiq.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/sound/arm/bcm2835-vchiq.c 2014-03-11 16:55:50.000000000 +0100 @@ -0,0 +1,879 @@ +/***************************************************************************** +* Copyright 2011 Broadcom Corporation. All rights reserved. @@ -103003,7 +97863,7 @@ diff -Nur linux-3.13.6.orig/sound/arm/bcm2835-vchiq.c linux-3.13.6/sound/arm/bcm + +void my_workqueue_init(bcm2835_alsa_stream_t * alsa_stream) +{ -+ alsa_stream->my_wq = create_workqueue("my_queue"); ++ alsa_stream->my_wq = alloc_workqueue("my_queue", WQ_HIGHPRI, 1); + return; +} + @@ -103702,9 +98562,9 @@ diff -Nur linux-3.13.6.orig/sound/arm/bcm2835-vchiq.c linux-3.13.6/sound/arm/bcm + +module_param(force_bulk, bool, 0444); +MODULE_PARM_DESC(force_bulk, "Force use of vchiq bulk for audio"); -diff -Nur linux-3.13.6.orig/sound/arm/Kconfig linux-3.13.6/sound/arm/Kconfig ---- linux-3.13.6.orig/sound/arm/Kconfig 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/sound/arm/Kconfig 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/sound/arm/Kconfig linux-raspberry-pi/sound/arm/Kconfig +--- linux-3.13.6/sound/arm/Kconfig 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/sound/arm/Kconfig 2014-03-11 16:53:23.000000000 +0100 @@ -39,5 +39,12 @@ Say Y or M if you want to support any AC97 codec attached to the PXA2xx AC97 interface. @@ -103718,9 +98578,9 @@ diff -Nur linux-3.13.6.orig/sound/arm/Kconfig linux-3.13.6/sound/arm/Kconfig + endif # SND_ARM -diff -Nur linux-3.13.6.orig/sound/arm/Makefile linux-3.13.6/sound/arm/Makefile ---- linux-3.13.6.orig/sound/arm/Makefile 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/sound/arm/Makefile 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/sound/arm/Makefile linux-raspberry-pi/sound/arm/Makefile +--- linux-3.13.6/sound/arm/Makefile 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/sound/arm/Makefile 2014-03-11 16:55:50.000000000 +0100 @@ -14,3 +14,8 @@ obj-$(CONFIG_SND_PXA2XX_AC97) += snd-pxa2xx-ac97.o @@ -103730,9 +98590,9 @@ diff -Nur linux-3.13.6.orig/sound/arm/Makefile linux-3.13.6/sound/arm/Makefile +snd-bcm2835-objs := bcm2835.o bcm2835-ctl.o bcm2835-pcm.o bcm2835-vchiq.o + +EXTRA_CFLAGS += -Idrivers/misc/vc04_services -Idrivers/misc/vc04_services/interface/vcos/linuxkernel -D__VCCOREVER__=0x04000000 -diff -Nur linux-3.13.6.orig/sound/arm/vc_vchi_audioserv_defs.h linux-3.13.6/sound/arm/vc_vchi_audioserv_defs.h ---- linux-3.13.6.orig/sound/arm/vc_vchi_audioserv_defs.h 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/sound/arm/vc_vchi_audioserv_defs.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/sound/arm/vc_vchi_audioserv_defs.h linux-raspberry-pi/sound/arm/vc_vchi_audioserv_defs.h +--- linux-3.13.6/sound/arm/vc_vchi_audioserv_defs.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/sound/arm/vc_vchi_audioserv_defs.h 2014-03-11 16:53:23.000000000 +0100 @@ -0,0 +1,116 @@ +/***************************************************************************** +* Copyright 2011 Broadcom Corporation. All rights reserved. @@ -103850,9 +98710,9 @@ diff -Nur linux-3.13.6.orig/sound/arm/vc_vchi_audioserv_defs.h linux-3.13.6/soun +} VC_AUDIO_MSG_T; + +#endif // _VC_AUDIO_DEFS_H_ -diff -Nur linux-3.13.6.orig/sound/soc/bcm/bcm2708-i2s.c linux-3.13.6/sound/soc/bcm/bcm2708-i2s.c ---- linux-3.13.6.orig/sound/soc/bcm/bcm2708-i2s.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/sound/soc/bcm/bcm2708-i2s.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/sound/soc/bcm/bcm2708-i2s.c linux-raspberry-pi/sound/soc/bcm/bcm2708-i2s.c +--- linux-3.13.6/sound/soc/bcm/bcm2708-i2s.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/sound/soc/bcm/bcm2708-i2s.c 2014-03-11 16:53:24.000000000 +0100 @@ -0,0 +1,945 @@ +/* + * ALSA SoC I2S Audio Layer for Broadcom BCM2708 SoC @@ -104799,9 +99659,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/bcm/bcm2708-i2s.c linux-3.13.6/sound/soc/b +MODULE_DESCRIPTION("BCM2708 I2S interface"); +MODULE_AUTHOR("Florian Meier <florian.meier@koalo.de>"); +MODULE_LICENSE("GPL v2"); -diff -Nur linux-3.13.6.orig/sound/soc/bcm/hifiberry_dac.c linux-3.13.6/sound/soc/bcm/hifiberry_dac.c ---- linux-3.13.6.orig/sound/soc/bcm/hifiberry_dac.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/sound/soc/bcm/hifiberry_dac.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/sound/soc/bcm/hifiberry_dac.c linux-raspberry-pi/sound/soc/bcm/hifiberry_dac.c +--- linux-3.13.6/sound/soc/bcm/hifiberry_dac.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/sound/soc/bcm/hifiberry_dac.c 2014-03-11 16:53:24.000000000 +0100 @@ -0,0 +1,100 @@ +/* + * ASoC Driver for HifiBerry DAC @@ -104903,9 +99763,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/bcm/hifiberry_dac.c linux-3.13.6/sound/soc +MODULE_AUTHOR("Florian Meier <florian.meier@koalo.de>"); +MODULE_DESCRIPTION("ASoC Driver for HifiBerry DAC"); +MODULE_LICENSE("GPL v2"); -diff -Nur linux-3.13.6.orig/sound/soc/bcm/hifiberry_digi.c linux-3.13.6/sound/soc/bcm/hifiberry_digi.c ---- linux-3.13.6.orig/sound/soc/bcm/hifiberry_digi.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/sound/soc/bcm/hifiberry_digi.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/sound/soc/bcm/hifiberry_digi.c linux-raspberry-pi/sound/soc/bcm/hifiberry_digi.c +--- linux-3.13.6/sound/soc/bcm/hifiberry_digi.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/sound/soc/bcm/hifiberry_digi.c 2014-03-11 16:55:50.000000000 +0100 @@ -0,0 +1,153 @@ +/* + * ASoC Driver for HifiBerry Digi @@ -105060,9 +99920,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/bcm/hifiberry_digi.c linux-3.13.6/sound/so +MODULE_AUTHOR("Daniel Matuschek <info@crazy-audio.com>"); +MODULE_DESCRIPTION("ASoC Driver for HifiBerry Digi"); +MODULE_LICENSE("GPL v2"); -diff -Nur linux-3.13.6.orig/sound/soc/bcm/Kconfig linux-3.13.6/sound/soc/bcm/Kconfig ---- linux-3.13.6.orig/sound/soc/bcm/Kconfig 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/sound/soc/bcm/Kconfig 2014-03-10 14:42:21.000000000 +0100 +diff -Nur linux-3.13.6/sound/soc/bcm/Kconfig linux-raspberry-pi/sound/soc/bcm/Kconfig +--- linux-3.13.6/sound/soc/bcm/Kconfig 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/sound/soc/bcm/Kconfig 2014-03-11 16:57:48.000000000 +0100 @@ -0,0 +1,73 @@ +config SND_BCM2708_SOC_I2S + tristate "SoC Audio support for the Broadcom BCM2708 I2S module" @@ -105137,9 +99997,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/bcm/Kconfig linux-3.13.6/sound/soc/bcm/Kco + select SND_SOC_PCM5102A + help + Say Y if you want to add support for PCM5102A -diff -Nur linux-3.13.6.orig/sound/soc/bcm/Makefile linux-3.13.6/sound/soc/bcm/Makefile ---- linux-3.13.6.orig/sound/soc/bcm/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/sound/soc/bcm/Makefile 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/sound/soc/bcm/Makefile linux-raspberry-pi/sound/soc/bcm/Makefile +--- linux-3.13.6/sound/soc/bcm/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/sound/soc/bcm/Makefile 2014-03-11 16:55:50.000000000 +0100 @@ -0,0 +1,23 @@ +# BCM2708 Platform Support +snd-soc-bcm2708-i2s-objs := bcm2708-i2s.o @@ -105164,9 +100024,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/bcm/Makefile linux-3.13.6/sound/soc/bcm/Ma +obj-$(CONFIG_SND_BCM2708_SOC_RPI_CODEC_PROTO) += snd-soc-rpi-proto.o +obj-$(CONFIG_SND_BCM2708_SOC_RPI_CODEC_ESS9018) += snd-soc-rpi-ess9018.o +obj-$(CONFIG_SND_BCM2708_SOC_RPI_CODEC_PCM5102A) += snd-soc-rpi-pcm5102a.o -diff -Nur linux-3.13.6.orig/sound/soc/bcm/rpi-cs534x.c linux-3.13.6/sound/soc/bcm/rpi-cs534x.c ---- linux-3.13.6.orig/sound/soc/bcm/rpi-cs534x.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/sound/soc/bcm/rpi-cs534x.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/sound/soc/bcm/rpi-cs534x.c linux-raspberry-pi/sound/soc/bcm/rpi-cs534x.c +--- linux-3.13.6/sound/soc/bcm/rpi-cs534x.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/sound/soc/bcm/rpi-cs534x.c 2014-03-11 16:55:50.000000000 +0100 @@ -0,0 +1,105 @@ +/* + * ASoC driver for CS5343/CS5344 ADC @@ -105273,9 +100133,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/bcm/rpi-cs534x.c linux-3.13.6/sound/soc/bc +MODULE_AUTHOR("Wojciech M. Zabolotny"); +MODULE_DESCRIPTION("ASoC Driver for Raspberry Pi connected to a cs534x"); +MODULE_LICENSE("GPL"); -diff -Nur linux-3.13.6.orig/sound/soc/bcm/rpi-dac.c linux-3.13.6/sound/soc/bcm/rpi-dac.c ---- linux-3.13.6.orig/sound/soc/bcm/rpi-dac.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/sound/soc/bcm/rpi-dac.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/sound/soc/bcm/rpi-dac.c linux-raspberry-pi/sound/soc/bcm/rpi-dac.c +--- linux-3.13.6/sound/soc/bcm/rpi-dac.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/sound/soc/bcm/rpi-dac.c 2014-03-11 16:53:24.000000000 +0100 @@ -0,0 +1,97 @@ +/* + * ASoC Driver for RPi-DAC. @@ -105374,9 +100234,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/bcm/rpi-dac.c linux-3.13.6/sound/soc/bcm/r +MODULE_AUTHOR("Florian Meier <florian.meier@koalo.de>"); +MODULE_DESCRIPTION("ASoC Driver for RPi-DAC"); +MODULE_LICENSE("GPL v2"); -diff -Nur linux-3.13.6.orig/sound/soc/bcm/rpi-ess9018.c linux-3.13.6/sound/soc/bcm/rpi-ess9018.c ---- linux-3.13.6.orig/sound/soc/bcm/rpi-ess9018.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/sound/soc/bcm/rpi-ess9018.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/sound/soc/bcm/rpi-ess9018.c linux-raspberry-pi/sound/soc/bcm/rpi-ess9018.c +--- linux-3.13.6/sound/soc/bcm/rpi-ess9018.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/sound/soc/bcm/rpi-ess9018.c 2014-03-11 16:55:50.000000000 +0100 @@ -0,0 +1,92 @@ +/* + * ASoC driver for ESS9018 codec @@ -105470,9 +100330,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/bcm/rpi-ess9018.c linux-3.13.6/sound/soc/b +MODULE_AUTHOR("Florian Meier"); +MODULE_DESCRIPTION("ASoC Driver for Raspberry Pi connected to a ESS9018"); +MODULE_LICENSE("GPL"); -diff -Nur linux-3.13.6.orig/sound/soc/bcm/rpi-mbed.c linux-3.13.6/sound/soc/bcm/rpi-mbed.c ---- linux-3.13.6.orig/sound/soc/bcm/rpi-mbed.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/sound/soc/bcm/rpi-mbed.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/sound/soc/bcm/rpi-mbed.c linux-raspberry-pi/sound/soc/bcm/rpi-mbed.c +--- linux-3.13.6/sound/soc/bcm/rpi-mbed.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/sound/soc/bcm/rpi-mbed.c 2014-03-11 16:55:50.000000000 +0100 @@ -0,0 +1,103 @@ +/* + * ASoC driver for mbed AudioCODEC (with a TLV320AIC23b) @@ -105577,9 +100437,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/bcm/rpi-mbed.c linux-3.13.6/sound/soc/bcm/ +MODULE_AUTHOR("Florian Meier"); +MODULE_DESCRIPTION("ASoC Driver for Raspberry Pi connected to mbed AudioCODEC"); +MODULE_LICENSE("GPL"); -diff -Nur linux-3.13.6.orig/sound/soc/bcm/rpi-pcm5102a.c linux-3.13.6/sound/soc/bcm/rpi-pcm5102a.c ---- linux-3.13.6.orig/sound/soc/bcm/rpi-pcm5102a.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/sound/soc/bcm/rpi-pcm5102a.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/sound/soc/bcm/rpi-pcm5102a.c linux-raspberry-pi/sound/soc/bcm/rpi-pcm5102a.c +--- linux-3.13.6/sound/soc/bcm/rpi-pcm5102a.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/sound/soc/bcm/rpi-pcm5102a.c 2014-03-11 16:55:50.000000000 +0100 @@ -0,0 +1,93 @@ +/* + * ASoC driver for PCM5102A codec @@ -105674,9 +100534,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/bcm/rpi-pcm5102a.c linux-3.13.6/sound/soc/ +MODULE_AUTHOR("Francesco Valla"); +MODULE_DESCRIPTION("ASoC Driver for Raspberry Pi connected to a PCM5102A"); +MODULE_LICENSE("GPL"); -diff -Nur linux-3.13.6.orig/sound/soc/bcm/rpi-proto.c linux-3.13.6/sound/soc/bcm/rpi-proto.c ---- linux-3.13.6.orig/sound/soc/bcm/rpi-proto.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/sound/soc/bcm/rpi-proto.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/sound/soc/bcm/rpi-proto.c linux-raspberry-pi/sound/soc/bcm/rpi-proto.c +--- linux-3.13.6/sound/soc/bcm/rpi-proto.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/sound/soc/bcm/rpi-proto.c 2014-03-11 16:55:50.000000000 +0100 @@ -0,0 +1,130 @@ +/* + * ASoC driver for PROTO AudioCODEC (with a WM8731) @@ -105808,9 +100668,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/bcm/rpi-proto.c linux-3.13.6/sound/soc/bcm +MODULE_AUTHOR("Florian Meier"); +MODULE_DESCRIPTION("ASoC Driver for Raspberry Pi connected to PROTO board (WM8731)"); +MODULE_LICENSE("GPL"); -diff -Nur linux-3.13.6.orig/sound/soc/bcm/rpi-tda1541a.c linux-3.13.6/sound/soc/bcm/rpi-tda1541a.c ---- linux-3.13.6.orig/sound/soc/bcm/rpi-tda1541a.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/sound/soc/bcm/rpi-tda1541a.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/sound/soc/bcm/rpi-tda1541a.c linux-raspberry-pi/sound/soc/bcm/rpi-tda1541a.c +--- linux-3.13.6/sound/soc/bcm/rpi-tda1541a.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/sound/soc/bcm/rpi-tda1541a.c 2014-03-11 16:55:50.000000000 +0100 @@ -0,0 +1,92 @@ +/* + * ASoC driver for TDA1541A codec @@ -105904,9 +100764,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/bcm/rpi-tda1541a.c linux-3.13.6/sound/soc/ +MODULE_AUTHOR("Florian Meier"); +MODULE_DESCRIPTION("ASoC Driver for Raspberry Pi connected to a TDA1541A"); +MODULE_LICENSE("GPL"); -diff -Nur linux-3.13.6.orig/sound/soc/codecs/Kconfig linux-3.13.6/sound/soc/codecs/Kconfig ---- linux-3.13.6.orig/sound/soc/codecs/Kconfig 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/sound/soc/codecs/Kconfig 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/sound/soc/codecs/Kconfig linux-raspberry-pi/sound/soc/codecs/Kconfig +--- linux-3.13.6/sound/soc/codecs/Kconfig 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/sound/soc/codecs/Kconfig 2014-03-11 16:55:50.000000000 +0100 @@ -59,6 +59,8 @@ select SND_SOC_PCM1681 if I2C select SND_SOC_PCM1792A if SPI_MASTER @@ -105929,9 +100789,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/codecs/Kconfig linux-3.13.6/sound/soc/code config SND_SOC_RT5631 tristate -diff -Nur linux-3.13.6.orig/sound/soc/codecs/Makefile linux-3.13.6/sound/soc/codecs/Makefile ---- linux-3.13.6.orig/sound/soc/codecs/Makefile 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/sound/soc/codecs/Makefile 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/sound/soc/codecs/Makefile linux-raspberry-pi/sound/soc/codecs/Makefile +--- linux-3.13.6/sound/soc/codecs/Makefile 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/sound/soc/codecs/Makefile 2014-03-11 16:55:50.000000000 +0100 @@ -46,6 +46,8 @@ snd-soc-pcm1681-objs := pcm1681.o snd-soc-pcm1792a-codec-objs := pcm1792a.o @@ -105950,9 +100810,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/codecs/Makefile linux-3.13.6/sound/soc/cod obj-$(CONFIG_SND_SOC_RT5631) += snd-soc-rt5631.o obj-$(CONFIG_SND_SOC_RT5640) += snd-soc-rt5640.o obj-$(CONFIG_SND_SOC_SGTL5000) += snd-soc-sgtl5000.o -diff -Nur linux-3.13.6.orig/sound/soc/codecs/pcm1794a.c linux-3.13.6/sound/soc/codecs/pcm1794a.c ---- linux-3.13.6.orig/sound/soc/codecs/pcm1794a.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/sound/soc/codecs/pcm1794a.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/sound/soc/codecs/pcm1794a.c linux-raspberry-pi/sound/soc/codecs/pcm1794a.c +--- linux-3.13.6/sound/soc/codecs/pcm1794a.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/sound/soc/codecs/pcm1794a.c 2014-03-11 16:53:24.000000000 +0100 @@ -0,0 +1,62 @@ +/* + * Driver for the PCM1794A codec @@ -106016,9 +100876,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/codecs/pcm1794a.c linux-3.13.6/sound/soc/c +MODULE_DESCRIPTION("ASoC PCM1794A codec driver"); +MODULE_AUTHOR("Florian Meier <florian.meier@koalo.de>"); +MODULE_LICENSE("GPL v2"); -diff -Nur linux-3.13.6.orig/sound/soc/codecs/pcm5102a.c linux-3.13.6/sound/soc/codecs/pcm5102a.c ---- linux-3.13.6.orig/sound/soc/codecs/pcm5102a.c 1970-01-01 01:00:00.000000000 +0100 -+++ linux-3.13.6/sound/soc/codecs/pcm5102a.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/sound/soc/codecs/pcm5102a.c linux-raspberry-pi/sound/soc/codecs/pcm5102a.c +--- linux-3.13.6/sound/soc/codecs/pcm5102a.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-raspberry-pi/sound/soc/codecs/pcm5102a.c 2014-03-11 16:55:50.000000000 +0100 @@ -0,0 +1,63 @@ +/* + * Driver for the PCM5102A codec @@ -106083,9 +100943,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/codecs/pcm5102a.c linux-3.13.6/sound/soc/c +MODULE_DESCRIPTION("ASoC PCM5102A codec driver"); +MODULE_AUTHOR("Florian Meier <florian.meier@koalo.de>"); +MODULE_LICENSE("GPL v2"); -diff -Nur linux-3.13.6.orig/sound/soc/codecs/wm8804.c linux-3.13.6/sound/soc/codecs/wm8804.c ---- linux-3.13.6.orig/sound/soc/codecs/wm8804.c 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/sound/soc/codecs/wm8804.c 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/sound/soc/codecs/wm8804.c linux-raspberry-pi/sound/soc/codecs/wm8804.c +--- linux-3.13.6/sound/soc/codecs/wm8804.c 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/sound/soc/codecs/wm8804.c 2014-03-11 16:53:24.000000000 +0100 @@ -63,6 +63,7 @@ struct regmap *regmap; struct regulator_bulk_data supplies[WM8804_NUM_SUPPLIES]; @@ -106171,9 +101031,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/codecs/wm8804.c linux-3.13.6/sound/soc/cod .controls = wm8804_snd_controls, .num_controls = ARRAY_SIZE(wm8804_snd_controls), -diff -Nur linux-3.13.6.orig/sound/soc/codecs/wm8804.h linux-3.13.6/sound/soc/codecs/wm8804.h ---- linux-3.13.6.orig/sound/soc/codecs/wm8804.h 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/sound/soc/codecs/wm8804.h 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/sound/soc/codecs/wm8804.h linux-raspberry-pi/sound/soc/codecs/wm8804.h +--- linux-3.13.6/sound/soc/codecs/wm8804.h 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/sound/soc/codecs/wm8804.h 2014-03-11 16:53:24.000000000 +0100 @@ -57,5 +57,9 @@ #define WM8804_CLKOUT_SRC_OSCCLK 4 @@ -106184,9 +101044,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/codecs/wm8804.h linux-3.13.6/sound/soc/cod +#define WM8804_MCLKDIV_128FS 1 #endif /* _WM8804_H */ -diff -Nur linux-3.13.6.orig/sound/soc/Kconfig linux-3.13.6/sound/soc/Kconfig ---- linux-3.13.6.orig/sound/soc/Kconfig 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/sound/soc/Kconfig 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/sound/soc/Kconfig linux-raspberry-pi/sound/soc/Kconfig +--- linux-3.13.6/sound/soc/Kconfig 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/sound/soc/Kconfig 2014-03-11 16:55:50.000000000 +0100 @@ -33,6 +33,7 @@ # All the supported SoCs source "sound/soc/atmel/Kconfig" @@ -106195,9 +101055,9 @@ diff -Nur linux-3.13.6.orig/sound/soc/Kconfig linux-3.13.6/sound/soc/Kconfig source "sound/soc/blackfin/Kconfig" source "sound/soc/cirrus/Kconfig" source "sound/soc/davinci/Kconfig" -diff -Nur linux-3.13.6.orig/sound/soc/Makefile linux-3.13.6/sound/soc/Makefile ---- linux-3.13.6.orig/sound/soc/Makefile 2014-03-07 07:07:02.000000000 +0100 -+++ linux-3.13.6/sound/soc/Makefile 2014-03-10 14:41:55.000000000 +0100 +diff -Nur linux-3.13.6/sound/soc/Makefile linux-raspberry-pi/sound/soc/Makefile +--- linux-3.13.6/sound/soc/Makefile 2014-03-07 07:07:02.000000000 +0100 ++++ linux-raspberry-pi/sound/soc/Makefile 2014-03-11 16:55:50.000000000 +0100 @@ -10,6 +10,7 @@ obj-$(CONFIG_SND_SOC) += generic/ obj-$(CONFIG_SND_SOC) += atmel/ |