diff options
277 files changed, 1827 insertions, 985 deletions
| @@ -655,6 +655,11 @@ S: Stanford University  S: Stanford, California 94305  S: USA +N: Carlos Chinea +D: Author of HSI Subsystem +  N: Randolph Chung  D: Linux/PA-RISC hacker diff --git a/Documentation/devicetree/bindings/arm/omap/mpu.txt b/Documentation/devicetree/bindings/arm/omap/mpu.txt index 1a5a42ce21bb..83f405bde138 100644 --- a/Documentation/devicetree/bindings/arm/omap/mpu.txt +++ b/Documentation/devicetree/bindings/arm/omap/mpu.txt @@ -7,10 +7,18 @@ The MPU contain CPUs, GIC, L2 cache and a local PRCM.  Required properties:  - compatible : Should be "ti,omap3-mpu" for OMAP3                 Should be "ti,omap4-mpu" for OMAP4 +	       Should be "ti,omap5-mpu" for OMAP5  - ti,hwmods: "mpu"  Examples: +- For an OMAP5 SMP system: + +mpu { +    compatible = "ti,omap5-mpu"; +    ti,hwmods = "mpu" +}; +  - For an OMAP4 SMP system:  mpu { diff --git a/Documentation/devicetree/bindings/arm/pmu.txt b/Documentation/devicetree/bindings/arm/pmu.txt index 343781b9f246..3e1e498fea96 100644 --- a/Documentation/devicetree/bindings/arm/pmu.txt +++ b/Documentation/devicetree/bindings/arm/pmu.txt @@ -7,6 +7,7 @@ representation in the device tree should be done as under:-  Required properties:  - compatible : should be one of +	"arm,armv8-pmuv3"  	"arm,cortex-a15-pmu"  	"arm,cortex-a9-pmu"  	"arm,cortex-a8-pmu" diff --git a/Documentation/devicetree/bindings/arm/samsung/exynos-adc.txt b/Documentation/devicetree/bindings/arm/samsung/exynos-adc.txt index 47ada1dff216..5d49f2b37f68 100644 --- a/Documentation/devicetree/bindings/arm/samsung/exynos-adc.txt +++ b/Documentation/devicetree/bindings/arm/samsung/exynos-adc.txt @@ -49,7 +49,7 @@ adc@12D10000 {  	/* NTC thermistor is a hwmon device */  	ncp15wb473@0 {  		compatible = "ntc,ncp15wb473"; -		pullup-uV = <1800000>; +		pullup-uv = <1800000>;  		pullup-ohm = <47000>;  		pulldown-ohm = <0>;  		io-channels = <&adc 4>; diff --git a/Documentation/devicetree/bindings/clock/exynos4-clock.txt b/Documentation/devicetree/bindings/clock/exynos4-clock.txt index c6bf8a6c8f52..a2ac2d9ac71a 100644 --- a/Documentation/devicetree/bindings/clock/exynos4-clock.txt +++ b/Documentation/devicetree/bindings/clock/exynos4-clock.txt @@ -6,7 +6,7 @@ SoC's in the Exynos4 family.  Required Properties: -- comptible: should be one of the following. +- compatible: should be one of the following.    - "samsung,exynos4210-clock" - controller compatible with Exynos4210 SoC.    - "samsung,exynos4412-clock" - controller compatible with Exynos4412 SoC. diff --git a/Documentation/devicetree/bindings/clock/exynos5250-clock.txt b/Documentation/devicetree/bindings/clock/exynos5250-clock.txt index 24765c146e31..46f5c791ea0d 100644 --- a/Documentation/devicetree/bindings/clock/exynos5250-clock.txt +++ b/Documentation/devicetree/bindings/clock/exynos5250-clock.txt @@ -5,7 +5,7 @@ controllers within the Exynos5250 SoC.  Required Properties: -- comptible: should be one of the following. +- compatible: should be one of the following.    - "samsung,exynos5250-clock" - controller compatible with Exynos5250 SoC.  - reg: physical base address of the controller and length of memory mapped diff --git a/Documentation/devicetree/bindings/clock/exynos5420-clock.txt b/Documentation/devicetree/bindings/clock/exynos5420-clock.txt index 32aa34ecad36..458f34789e5d 100644 --- a/Documentation/devicetree/bindings/clock/exynos5420-clock.txt +++ b/Documentation/devicetree/bindings/clock/exynos5420-clock.txt @@ -5,7 +5,7 @@ controllers within the Exynos5420 SoC.  Required Properties: -- comptible: should be one of the following. +- compatible: should be one of the following.    - "samsung,exynos5420-clock" - controller compatible with Exynos5420 SoC.  - reg: physical base address of the controller and length of memory mapped diff --git a/Documentation/devicetree/bindings/clock/exynos5440-clock.txt b/Documentation/devicetree/bindings/clock/exynos5440-clock.txt index 4499e9966bc9..9955dc9c7d96 100644 --- a/Documentation/devicetree/bindings/clock/exynos5440-clock.txt +++ b/Documentation/devicetree/bindings/clock/exynos5440-clock.txt @@ -5,7 +5,7 @@ controllers within the Exynos5440 SoC.  Required Properties: -- comptible: should be "samsung,exynos5440-clock". +- compatible: should be "samsung,exynos5440-clock".  - reg: physical base address of the controller and length of memory mapped    region. diff --git a/Documentation/devicetree/bindings/gpio/8xxx_gpio.txt b/Documentation/devicetree/bindings/gpio/8xxx_gpio.txt index b0019eb5330e..798cfc9d3839 100644 --- a/Documentation/devicetree/bindings/gpio/8xxx_gpio.txt +++ b/Documentation/devicetree/bindings/gpio/8xxx_gpio.txt @@ -5,16 +5,42 @@ This is for the non-QE/CPM/GUTs GPIO controllers as found on  Every GPIO controller node must have #gpio-cells property defined,  this information will be used to translate gpio-specifiers. +See bindings/gpio/gpio.txt for details of how to specify GPIO +information for devices. + +The GPIO module usually is connected to the SoC's internal interrupt +controller, see bindings/interrupt-controller/interrupts.txt (the +interrupt client nodes section) for details how to specify this GPIO +module's interrupt. + +The GPIO module may serve as another interrupt controller (cascaded to +the SoC's internal interrupt controller).  See the interrupt controller +nodes section in bindings/interrupt-controller/interrupts.txt for +details.  Required properties: -- compatible : "fsl,<CHIP>-gpio" followed by "fsl,mpc8349-gpio" for -  83xx, "fsl,mpc8572-gpio" for 85xx and "fsl,mpc8610-gpio" for 86xx. -- #gpio-cells : Should be two. The first cell is the pin number and the -  second cell is used to specify optional parameters (currently unused). - - interrupts : Interrupt mapping for GPIO IRQ. - - interrupt-parent : Phandle for the interrupt controller that -   services interrupts for this device. -- gpio-controller : Marks the port as GPIO controller. +- compatible:		"fsl,<chip>-gpio" followed by "fsl,mpc8349-gpio" +			for 83xx, "fsl,mpc8572-gpio" for 85xx, or +			"fsl,mpc8610-gpio" for 86xx. +- #gpio-cells:		Should be two. The first cell is the pin number +			and the second cell is used to specify optional +			parameters (currently unused). +- interrupt-parent:	Phandle for the interrupt controller that +			services interrupts for this device. +- interrupts:		Interrupt mapping for GPIO IRQ. +- gpio-controller:	Marks the port as GPIO controller. + +Optional properties: +- interrupt-controller:	Empty boolean property which marks the GPIO +			module as an IRQ controller. +- #interrupt-cells:	Should be two.  Defines the number of integer +			cells required to specify an interrupt within +			this interrupt controller.  The first cell +			defines the pin number, the second cell +			defines additional flags (trigger type, +			trigger polarity).  Note that the available +			set of trigger conditions supported by the +			GPIO module depends on the actual SoC.  Example of gpio-controller nodes for a MPC8347 SoC: @@ -22,39 +48,27 @@ Example of gpio-controller nodes for a MPC8347 SoC:  		#gpio-cells = <2>;  		compatible = "fsl,mpc8347-gpio", "fsl,mpc8349-gpio";  		reg = <0xc00 0x100>; -		interrupts = <74 0x8>;  		interrupt-parent = <&ipic>; +		interrupts = <74 0x8>;  		gpio-controller; +		interrupt-controller; +		#interrupt-cells = <2>;  	};  	gpio2: gpio-controller@d00 {  		#gpio-cells = <2>;  		compatible = "fsl,mpc8347-gpio", "fsl,mpc8349-gpio";  		reg = <0xd00 0x100>; -		interrupts = <75 0x8>;  		interrupt-parent = <&ipic>; +		interrupts = <75 0x8>;  		gpio-controller;  	}; -See booting-without-of.txt for details of how to specify GPIO -information for devices. - -To use GPIO pins as interrupt sources for peripherals, specify the -GPIO controller as the interrupt parent and define GPIO number + -trigger mode using the interrupts property, which is defined like -this: - -interrupts = <number trigger>, where: - - number: GPIO pin (0..31) - - trigger: trigger mode: -	2 = trigger on falling edge -	3 = trigger on both edges - -Example of device using this is: +Example of a peripheral using the GPIO module as an IRQ controller:  	funkyfpga@0 {  		compatible = "funky-fpga";  		... -		interrupts = <4 3>;  		interrupt-parent = <&gpio1>; +		interrupts = <4 3>;  	}; diff --git a/Documentation/devicetree/bindings/net/fsl-fec.txt b/Documentation/devicetree/bindings/net/fsl-fec.txt index d53639221403..845ff848d895 100644 --- a/Documentation/devicetree/bindings/net/fsl-fec.txt +++ b/Documentation/devicetree/bindings/net/fsl-fec.txt @@ -15,6 +15,7 @@ Optional properties:    only if property "phy-reset-gpios" is available.  Missing the property    will have the duration be 1 millisecond.  Numbers greater than 1000 are    invalid and 1 millisecond will be used instead. +- phy-supply: regulator that powers the Ethernet PHY.  Example: @@ -25,4 +26,5 @@ ethernet@83fec000 {  	phy-mode = "mii";  	phy-reset-gpios = <&gpio2 14 0>; /* GPIO2_14 */  	local-mac-address = [00 04 9F 01 1B B9]; +	phy-supply = <®_fec_supply>;  }; diff --git a/Documentation/devicetree/bindings/spi/nvidia,tegra20-spi.txt b/Documentation/devicetree/bindings/spi/nvidia,tegra20-spi.txt deleted file mode 100644 index 6b9e51896693..000000000000 --- a/Documentation/devicetree/bindings/spi/nvidia,tegra20-spi.txt +++ /dev/null @@ -1,5 +0,0 @@ -NVIDIA Tegra 2 SPI device - -Required properties: -- compatible : should be "nvidia,tegra20-spi". -- gpios : should specify GPIOs used for chipselect. diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt b/Documentation/devicetree/bindings/vendor-prefixes.txt index ce95ed1c6d3e..edbb8d88c85e 100644 --- a/Documentation/devicetree/bindings/vendor-prefixes.txt +++ b/Documentation/devicetree/bindings/vendor-prefixes.txt @@ -32,12 +32,14 @@ est	ESTeem Wireless Modems  fsl	Freescale Semiconductor  GEFanuc	GE Fanuc Intelligent Platforms Embedded Systems, Inc.  gef	GE Fanuc Intelligent Platforms Embedded Systems, Inc. +gmt	Global Mixed-mode Technology, Inc.  hisilicon	Hisilicon Limited.  hp	Hewlett Packard  ibm	International Business Machines (IBM)  idt	Integrated Device Technologies, Inc.  img	Imagination Technologies Ltd.  intercontrol	Inter Control Group +lg	LG Corporation  linux	Linux-specific binding  lsi	LSI Corp. (LSI Logic)  marvell	Marvell Technology Group Ltd. diff --git a/Documentation/mic/mpssd/mpssd.c b/Documentation/mic/mpssd/mpssd.c index 0c980ad40b17..4d17487d5ad9 100644 --- a/Documentation/mic/mpssd/mpssd.c +++ b/Documentation/mic/mpssd/mpssd.c @@ -313,7 +313,7 @@ static struct mic_device_desc *get_device_desc(struct mic_info *mic, int type)  	int i;  	void *dp = get_dp(mic, type); -	for (i = mic_aligned_size(struct mic_bootparam); i < PAGE_SIZE; +	for (i = sizeof(struct mic_bootparam); i < PAGE_SIZE;  		i += mic_total_desc_size(d)) {  		d = dp + i; @@ -445,8 +445,8 @@ init_vr(struct mic_info *mic, int fd, int type,  		__func__, mic->name, vr0->va, vr0->info, vr_size,  		vring_size(MIC_VRING_ENTRIES, MIC_VIRTIO_RING_ALIGN));  	mpsslog("magic 0x%x expected 0x%x\n", -		vr0->info->magic, MIC_MAGIC + type); -	assert(vr0->info->magic == MIC_MAGIC + type); +		le32toh(vr0->info->magic), MIC_MAGIC + type); +	assert(le32toh(vr0->info->magic) == MIC_MAGIC + type);  	if (vr1) {  		vr1->va = (struct mic_vring *)  			&va[MIC_DEVICE_PAGE_END + vr_size]; @@ -458,8 +458,8 @@ init_vr(struct mic_info *mic, int fd, int type,  			__func__, mic->name, vr1->va, vr1->info, vr_size,  			vring_size(MIC_VRING_ENTRIES, MIC_VIRTIO_RING_ALIGN));  		mpsslog("magic 0x%x expected 0x%x\n", -			vr1->info->magic, MIC_MAGIC + type + 1); -		assert(vr1->info->magic == MIC_MAGIC + type + 1); +			le32toh(vr1->info->magic), MIC_MAGIC + type + 1); +		assert(le32toh(vr1->info->magic) == MIC_MAGIC + type + 1);  	}  done:  	return va; @@ -520,7 +520,7 @@ static void *  virtio_net(void *arg)  {  	static __u8 vnet_hdr[2][sizeof(struct virtio_net_hdr)]; -	static __u8 vnet_buf[2][MAX_NET_PKT_SIZE] __aligned(64); +	static __u8 vnet_buf[2][MAX_NET_PKT_SIZE] __attribute__ ((aligned(64)));  	struct iovec vnet_iov[2][2] = {  		{ { .iov_base = vnet_hdr[0], .iov_len = sizeof(vnet_hdr[0]) },  		  { .iov_base = vnet_buf[0], .iov_len = sizeof(vnet_buf[0]) } }, @@ -1412,6 +1412,12 @@ mic_config(void *arg)  	}  	do { +		ret = lseek(fd, 0, SEEK_SET); +		if (ret < 0) { +			mpsslog("%s: Failed to seek to file start '%s': %s\n", +				mic->name, pathname, strerror(errno)); +			goto close_error1; +		}  		ret = read(fd, value, sizeof(value));  		if (ret < 0) {  			mpsslog("%s: Failed to read sysfs entry '%s': %s\n", diff --git a/MAINTAINERS b/MAINTAINERS index 4afcfb4c892b..9486fb6fe38e 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1934,7 +1934,8 @@ S:	Maintained  F:	drivers/gpio/gpio-bt8xx.c  BTRFS FILE SYSTEM -M:	Chris Mason <[email protected]> +M:	Chris Mason <[email protected]> +M:	Josef Bacik <[email protected]>  W:	http://btrfs.wiki.kernel.org/  Q:	http://patchwork.kernel.org/project/linux-btrfs/list/ @@ -2137,7 +2138,8 @@ S:	Maintained  F:	Documentation/zh_CN/  CHIPIDEA USB HIGH SPEED DUAL ROLE CONTROLLER -M:	Alexander Shishkin <[email protected]> +M:	Peter Chen <[email protected]> +T:	git://github.com/hzpeterchen/linux-usb.git  S:	Maintained  F:	drivers/usb/chipidea/ @@ -4043,6 +4045,14 @@ W:	http://artax.karlin.mff.cuni.cz/~mikulas/vyplody/hpfs/index-e.cgi  S:	Maintained  F:	fs/hpfs/ +HSI SUBSYSTEM +M:	Sebastian Reichel <[email protected]> +S:	Maintained +F:	Documentation/ABI/testing/sysfs-bus-hsi +F:	drivers/hsi/ +F:	include/linux/hsi/ +F:	include/uapi/linux/hsi/ +  HSO 3G MODEM DRIVER  M:	Jan Dumon <[email protected]>  W:	http://www.pharscape.org @@ -5979,10 +5989,10 @@ F:	drivers/nfc/  F:	include/linux/platform_data/pn544.h  NFS, SUNRPC, AND LOCKD CLIENTS -M:	Trond Myklebust <[email protected]> +M:	Trond Myklebust <[email protected]>  W:	http://client.linux-nfs.org -T:	git git://git.linux-nfs.org/pub/linux/nfs-2.6.git +T:	git git://git.linux-nfs.org/projects/trondmy/linux-nfs.git  S:	Maintained  F:	fs/lockd/  F:	fs/nfs/ @@ -6249,8 +6259,8 @@ OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS  M:	Rob Herring <[email protected]>  M:	Pawel Moll <[email protected]>  M:	Mark Rutland <[email protected]> -M:	Stephen Warren <[email protected]>  M:	Ian Campbell <[email protected]> +M:	Kumar Gala <[email protected]>  S:	Maintained  F:	Documentation/devicetree/ @@ -1,7 +1,7 @@  VERSION = 3  PATCHLEVEL = 13  SUBLEVEL = 0 -EXTRAVERSION = -rc2 +EXTRAVERSION = -rc3  NAME = One Giant Leap for Frogkind  # *DOCUMENTATION* diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 88c8b6c1341a..6d4dd22ee4b7 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -159,8 +159,7 @@ config NR_CPUS  	range 2 32  	depends on SMP  	# These have to remain sorted largest to smallest -	default "8" if ARCH_XGENE -	default "4" +	default "8"  config HOTPLUG_CPU  	bool "Support for hot-pluggable CPUs" diff --git a/arch/arm64/include/asm/io.h b/arch/arm64/include/asm/io.h index 4cc813eddacb..572769727227 100644 --- a/arch/arm64/include/asm/io.h +++ b/arch/arm64/include/asm/io.h @@ -229,7 +229,7 @@ extern void __iomem *__ioremap(phys_addr_t phys_addr, size_t size, pgprot_t prot  extern void __iounmap(volatile void __iomem *addr);  extern void __iomem *ioremap_cache(phys_addr_t phys_addr, size_t size); -#define PROT_DEFAULT		(PTE_TYPE_PAGE | PTE_AF | PTE_DIRTY) +#define PROT_DEFAULT		(pgprot_default | PTE_DIRTY)  #define PROT_DEVICE_nGnRE	(PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_ATTRINDX(MT_DEVICE_nGnRE))  #define PROT_NORMAL_NC		(PROT_DEFAULT | PTE_ATTRINDX(MT_NORMAL_NC))  #define PROT_NORMAL		(PROT_DEFAULT | PTE_ATTRINDX(MT_NORMAL)) diff --git a/arch/arm64/include/asm/pgtable-hwdef.h b/arch/arm64/include/asm/pgtable-hwdef.h index 755f86143320..b1d2e26c3c88 100644 --- a/arch/arm64/include/asm/pgtable-hwdef.h +++ b/arch/arm64/include/asm/pgtable-hwdef.h @@ -43,7 +43,7 @@   * Section   */  #define PMD_SECT_VALID		(_AT(pmdval_t, 1) << 0) -#define PMD_SECT_PROT_NONE	(_AT(pmdval_t, 1) << 2) +#define PMD_SECT_PROT_NONE	(_AT(pmdval_t, 1) << 58)  #define PMD_SECT_USER		(_AT(pmdval_t, 1) << 6)		/* AP[1] */  #define PMD_SECT_RDONLY		(_AT(pmdval_t, 1) << 7)		/* AP[2] */  #define PMD_SECT_S		(_AT(pmdval_t, 3) << 8) diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S index 7009387348b7..c68cca5c3523 100644 --- a/arch/arm64/kernel/head.S +++ b/arch/arm64/kernel/head.S @@ -282,8 +282,9 @@ ENDPROC(secondary_holding_pen)  	 * be used where CPUs are brought online dynamically by the kernel.  	 */  ENTRY(secondary_entry) -	bl	__calc_phys_offset		// x2=phys offset  	bl	el2_setup			// Drop to EL1 +	bl	__calc_phys_offset		// x24=PHYS_OFFSET, x28=PHYS_OFFSET-PAGE_OFFSET +	bl	set_cpu_boot_mode_flag  	b	secondary_startup  ENDPROC(secondary_entry) diff --git a/arch/arm64/mm/proc.S b/arch/arm64/mm/proc.S index 421b99fd635d..0f7fec52c7f8 100644 --- a/arch/arm64/mm/proc.S +++ b/arch/arm64/mm/proc.S @@ -111,12 +111,12 @@ ENTRY(__cpu_setup)  	bl	__flush_dcache_all  	mov	lr, x28  	ic	iallu				// I+BTB cache invalidate +	tlbi	vmalle1is			// invalidate I + D TLBs  	dsb	sy  	mov	x0, #3 << 20  	msr	cpacr_el1, x0			// Enable FP/ASIMD  	msr	mdscr_el1, xzr			// Reset mdscr_el1 -	tlbi	vmalle1is			// invalidate I + D TLBs  	/*  	 * Memory region attributes for LPAE:  	 * diff --git a/arch/avr32/boards/favr-32/setup.c b/arch/avr32/boards/favr-32/setup.c index 7b1f2cd85400..1f121497b517 100644 --- a/arch/avr32/boards/favr-32/setup.c +++ b/arch/avr32/boards/favr-32/setup.c @@ -298,8 +298,10 @@ static int __init set_abdac_rate(struct platform_device *pdev)  	 */  	retval = clk_round_rate(pll1,  			CONFIG_BOARD_FAVR32_ABDAC_RATE * 256 * 16); -	if (retval < 0) +	if (retval <= 0) { +		retval = -EINVAL;  		goto out_abdac; +	}  	retval = clk_set_rate(pll1, retval);  	if (retval != 0) diff --git a/arch/avr32/configs/atngw100_defconfig b/arch/avr32/configs/atngw100_defconfig index d5aff36ade92..4733e38e7ae6 100644 --- a/arch/avr32/configs/atngw100_defconfig +++ b/arch/avr32/configs/atngw100_defconfig @@ -59,7 +59,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"  # CONFIG_PREVENT_FIRMWARE_BUILD is not set  # CONFIG_FW_LOADER is not set  CONFIG_MTD=y -CONFIG_MTD_PARTITIONS=y  CONFIG_MTD_CMDLINE_PARTS=y  CONFIG_MTD_CHAR=y  CONFIG_MTD_BLOCK=y diff --git a/arch/avr32/configs/atngw100_evklcd100_defconfig b/arch/avr32/configs/atngw100_evklcd100_defconfig index 4abcf435d599..1be0ee31bd91 100644 --- a/arch/avr32/configs/atngw100_evklcd100_defconfig +++ b/arch/avr32/configs/atngw100_evklcd100_defconfig @@ -61,7 +61,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"  # CONFIG_PREVENT_FIRMWARE_BUILD is not set  # CONFIG_FW_LOADER is not set  CONFIG_MTD=y -CONFIG_MTD_PARTITIONS=y  CONFIG_MTD_CMDLINE_PARTS=y  CONFIG_MTD_CHAR=y  CONFIG_MTD_BLOCK=y diff --git a/arch/avr32/configs/atngw100_evklcd101_defconfig b/arch/avr32/configs/atngw100_evklcd101_defconfig index 18f3fa0470ff..796e536f7bc4 100644 --- a/arch/avr32/configs/atngw100_evklcd101_defconfig +++ b/arch/avr32/configs/atngw100_evklcd101_defconfig @@ -60,7 +60,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"  # CONFIG_PREVENT_FIRMWARE_BUILD is not set  # CONFIG_FW_LOADER is not set  CONFIG_MTD=y -CONFIG_MTD_PARTITIONS=y  CONFIG_MTD_CMDLINE_PARTS=y  CONFIG_MTD_CHAR=y  CONFIG_MTD_BLOCK=y diff --git a/arch/avr32/configs/atngw100_mrmt_defconfig b/arch/avr32/configs/atngw100_mrmt_defconfig index 06e389cfcd12..9a57da44eb6f 100644 --- a/arch/avr32/configs/atngw100_mrmt_defconfig +++ b/arch/avr32/configs/atngw100_mrmt_defconfig @@ -48,7 +48,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"  # CONFIG_PREVENT_FIRMWARE_BUILD is not set  # CONFIG_FW_LOADER is not set  CONFIG_MTD=y -CONFIG_MTD_PARTITIONS=y  CONFIG_MTD_CMDLINE_PARTS=y  CONFIG_MTD_CHAR=y  CONFIG_MTD_BLOCK=y diff --git a/arch/avr32/configs/atngw100mkii_defconfig b/arch/avr32/configs/atngw100mkii_defconfig index 2518a1368d7c..97fe1b399b06 100644 --- a/arch/avr32/configs/atngw100mkii_defconfig +++ b/arch/avr32/configs/atngw100mkii_defconfig @@ -59,7 +59,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"  # CONFIG_PREVENT_FIRMWARE_BUILD is not set  # CONFIG_FW_LOADER is not set  CONFIG_MTD=y -CONFIG_MTD_PARTITIONS=y  CONFIG_MTD_CMDLINE_PARTS=y  CONFIG_MTD_CHAR=y  CONFIG_MTD_BLOCK=y diff --git a/arch/avr32/configs/atngw100mkii_evklcd100_defconfig b/arch/avr32/configs/atngw100mkii_evklcd100_defconfig index 245ef6bd0fa6..a176d24467e9 100644 --- a/arch/avr32/configs/atngw100mkii_evklcd100_defconfig +++ b/arch/avr32/configs/atngw100mkii_evklcd100_defconfig @@ -62,7 +62,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"  # CONFIG_PREVENT_FIRMWARE_BUILD is not set  # CONFIG_FW_LOADER is not set  CONFIG_MTD=y -CONFIG_MTD_PARTITIONS=y  CONFIG_MTD_CMDLINE_PARTS=y  CONFIG_MTD_CHAR=y  CONFIG_MTD_BLOCK=y diff --git a/arch/avr32/configs/atngw100mkii_evklcd101_defconfig b/arch/avr32/configs/atngw100mkii_evklcd101_defconfig index fa6cbac6e418..d1bf6dcfc47d 100644 --- a/arch/avr32/configs/atngw100mkii_evklcd101_defconfig +++ b/arch/avr32/configs/atngw100mkii_evklcd101_defconfig @@ -61,7 +61,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"  # CONFIG_PREVENT_FIRMWARE_BUILD is not set  # CONFIG_FW_LOADER is not set  CONFIG_MTD=y -CONFIG_MTD_PARTITIONS=y  CONFIG_MTD_CMDLINE_PARTS=y  CONFIG_MTD_CHAR=y  CONFIG_MTD_BLOCK=y diff --git a/arch/avr32/configs/atstk1002_defconfig b/arch/avr32/configs/atstk1002_defconfig index bbd5131021a5..2813dd2b9138 100644 --- a/arch/avr32/configs/atstk1002_defconfig +++ b/arch/avr32/configs/atstk1002_defconfig @@ -53,7 +53,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"  # CONFIG_PREVENT_FIRMWARE_BUILD is not set  # CONFIG_FW_LOADER is not set  CONFIG_MTD=y -CONFIG_MTD_PARTITIONS=y  CONFIG_MTD_CMDLINE_PARTS=y  CONFIG_MTD_CHAR=y  CONFIG_MTD_BLOCK=y diff --git a/arch/avr32/configs/atstk1003_defconfig b/arch/avr32/configs/atstk1003_defconfig index c1cd726f9012..f8ff3a3baad4 100644 --- a/arch/avr32/configs/atstk1003_defconfig +++ b/arch/avr32/configs/atstk1003_defconfig @@ -42,7 +42,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"  # CONFIG_PREVENT_FIRMWARE_BUILD is not set  # CONFIG_FW_LOADER is not set  CONFIG_MTD=y -CONFIG_MTD_PARTITIONS=y  CONFIG_MTD_CMDLINE_PARTS=y  CONFIG_MTD_CHAR=y  CONFIG_MTD_BLOCK=y diff --git a/arch/avr32/configs/atstk1004_defconfig b/arch/avr32/configs/atstk1004_defconfig index 754ae56b2767..992228e54e38 100644 --- a/arch/avr32/configs/atstk1004_defconfig +++ b/arch/avr32/configs/atstk1004_defconfig @@ -42,7 +42,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"  # CONFIG_PREVENT_FIRMWARE_BUILD is not set  # CONFIG_FW_LOADER is not set  CONFIG_MTD=y -CONFIG_MTD_PARTITIONS=y  CONFIG_MTD_CMDLINE_PARTS=y  CONFIG_MTD_CHAR=y  CONFIG_MTD_BLOCK=y diff --git a/arch/avr32/configs/atstk1006_defconfig b/arch/avr32/configs/atstk1006_defconfig index 58589d8cc0ac..b8e698b0d1fa 100644 --- a/arch/avr32/configs/atstk1006_defconfig +++ b/arch/avr32/configs/atstk1006_defconfig @@ -54,7 +54,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"  # CONFIG_PREVENT_FIRMWARE_BUILD is not set  # CONFIG_FW_LOADER is not set  CONFIG_MTD=y -CONFIG_MTD_PARTITIONS=y  CONFIG_MTD_CMDLINE_PARTS=y  CONFIG_MTD_CHAR=y  CONFIG_MTD_BLOCK=y diff --git a/arch/avr32/configs/favr-32_defconfig b/arch/avr32/configs/favr-32_defconfig index c90fbf6d35bc..07bed3f7eb5e 100644 --- a/arch/avr32/configs/favr-32_defconfig +++ b/arch/avr32/configs/favr-32_defconfig @@ -58,7 +58,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"  # CONFIG_PREVENT_FIRMWARE_BUILD is not set  # CONFIG_FW_LOADER is not set  CONFIG_MTD=y -CONFIG_MTD_PARTITIONS=y  CONFIG_MTD_CMDLINE_PARTS=y  CONFIG_MTD_CHAR=y  CONFIG_MTD_BLOCK=y diff --git a/arch/avr32/configs/hammerhead_defconfig b/arch/avr32/configs/hammerhead_defconfig index ba7c31e269cb..18db853386c8 100644 --- a/arch/avr32/configs/hammerhead_defconfig +++ b/arch/avr32/configs/hammerhead_defconfig @@ -58,7 +58,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"  # CONFIG_PREVENT_FIRMWARE_BUILD is not set  # CONFIG_FW_LOADER is not set  CONFIG_MTD=y -CONFIG_MTD_PARTITIONS=y  CONFIG_MTD_CMDLINE_PARTS=y  CONFIG_MTD_CHAR=y  CONFIG_MTD_BLOCK=y diff --git a/arch/avr32/configs/merisc_defconfig b/arch/avr32/configs/merisc_defconfig index 65de4431108c..91df6b2986be 100644 --- a/arch/avr32/configs/merisc_defconfig +++ b/arch/avr32/configs/merisc_defconfig @@ -46,7 +46,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"  # CONFIG_FW_LOADER is not set  CONFIG_MTD=y  CONFIG_MTD_CONCAT=y -CONFIG_MTD_PARTITIONS=y  CONFIG_MTD_CHAR=y  CONFIG_MTD_BLOCK=y  CONFIG_MTD_CFI=y diff --git a/arch/avr32/configs/mimc200_defconfig b/arch/avr32/configs/mimc200_defconfig index 0a8bfdc420e0..d630e089dd32 100644 --- a/arch/avr32/configs/mimc200_defconfig +++ b/arch/avr32/configs/mimc200_defconfig @@ -49,7 +49,6 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"  # CONFIG_PREVENT_FIRMWARE_BUILD is not set  # CONFIG_FW_LOADER is not set  CONFIG_MTD=y -CONFIG_MTD_PARTITIONS=y  CONFIG_MTD_CMDLINE_PARTS=y  CONFIG_MTD_CHAR=y  CONFIG_MTD_BLOCK=y diff --git a/arch/avr32/kernel/time.c b/arch/avr32/kernel/time.c index 12f828ad5058..d0f771be9e96 100644 --- a/arch/avr32/kernel/time.c +++ b/arch/avr32/kernel/time.c @@ -59,7 +59,7 @@ static irqreturn_t timer_interrupt(int irq, void *dev_id)  static struct irqaction timer_irqaction = {  	.handler	= timer_interrupt,  	/* Oprofile uses the same irq as the timer, so allow it to be shared */ -	.flags		= IRQF_TIMER | IRQF_DISABLED | IRQF_SHARED, +	.flags		= IRQF_TIMER | IRQF_SHARED,  	.name		= "avr32_comparator",  }; diff --git a/arch/avr32/mach-at32ap/pm.c b/arch/avr32/mach-at32ap/pm.c index 32d680eb6f48..db190842b80c 100644 --- a/arch/avr32/mach-at32ap/pm.c +++ b/arch/avr32/mach-at32ap/pm.c @@ -181,7 +181,7 @@ static const struct platform_suspend_ops avr32_pm_ops = {  	.enter	= avr32_pm_enter,  }; -static unsigned long avr32_pm_offset(void *symbol) +static unsigned long __init avr32_pm_offset(void *symbol)  {  	extern u8 pm_exception[]; diff --git a/arch/powerpc/boot/dts/mpc5121.dtsi b/arch/powerpc/boot/dts/mpc5121.dtsi index bd14c00e5146..2d7cb04ac962 100644 --- a/arch/powerpc/boot/dts/mpc5121.dtsi +++ b/arch/powerpc/boot/dts/mpc5121.dtsi @@ -77,7 +77,6 @@  		compatible = "fsl,mpc5121-immr";  		#address-cells = <1>;  		#size-cells = <1>; -		#interrupt-cells = <2>;  		ranges = <0x0 0x80000000 0x400000>;  		reg = <0x80000000 0x400000>;  		bus-frequency = <66000000>;	/* 66 MHz ips bus */ diff --git a/arch/powerpc/configs/52xx/cm5200_defconfig b/arch/powerpc/configs/52xx/cm5200_defconfig index 69b57daf402e..0b88c7b30bb9 100644 --- a/arch/powerpc/configs/52xx/cm5200_defconfig +++ b/arch/powerpc/configs/52xx/cm5200_defconfig @@ -12,7 +12,6 @@ CONFIG_EXPERT=y  CONFIG_PPC_MPC52xx=y  CONFIG_PPC_MPC5200_SIMPLE=y  # CONFIG_PPC_PMAC is not set -CONFIG_PPC_BESTCOMM=y  CONFIG_SPARSE_IRQ=y  CONFIG_PM=y  # CONFIG_PCI is not set @@ -71,6 +70,8 @@ CONFIG_USB_DEVICEFS=y  CONFIG_USB_OHCI_HCD=y  CONFIG_USB_OHCI_HCD_PPC_OF_BE=y  CONFIG_USB_STORAGE=y +CONFIG_DMADEVICES=y +CONFIG_PPC_BESTCOMM=y  CONFIG_EXT2_FS=y  CONFIG_EXT3_FS=y  # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set diff --git a/arch/powerpc/configs/52xx/lite5200b_defconfig b/arch/powerpc/configs/52xx/lite5200b_defconfig index f3638ae0a627..104a332e79ab 100644 --- a/arch/powerpc/configs/52xx/lite5200b_defconfig +++ b/arch/powerpc/configs/52xx/lite5200b_defconfig @@ -15,7 +15,6 @@ CONFIG_PPC_MPC52xx=y  CONFIG_PPC_MPC5200_SIMPLE=y  CONFIG_PPC_LITE5200=y  # CONFIG_PPC_PMAC is not set -CONFIG_PPC_BESTCOMM=y  CONFIG_NO_HZ=y  CONFIG_HIGH_RES_TIMERS=y  CONFIG_SPARSE_IRQ=y @@ -59,6 +58,8 @@ CONFIG_I2C_CHARDEV=y  CONFIG_I2C_MPC=y  # CONFIG_HWMON is not set  CONFIG_VIDEO_OUTPUT_CONTROL=m +CONFIG_DMADEVICES=y +CONFIG_PPC_BESTCOMM=y  CONFIG_EXT2_FS=y  CONFIG_EXT3_FS=y  # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set diff --git a/arch/powerpc/configs/52xx/motionpro_defconfig b/arch/powerpc/configs/52xx/motionpro_defconfig index 0c7de9620ea6..0d13ad7e4478 100644 --- a/arch/powerpc/configs/52xx/motionpro_defconfig +++ b/arch/powerpc/configs/52xx/motionpro_defconfig @@ -12,7 +12,6 @@ CONFIG_EXPERT=y  CONFIG_PPC_MPC52xx=y  CONFIG_PPC_MPC5200_SIMPLE=y  # CONFIG_PPC_PMAC is not set -CONFIG_PPC_BESTCOMM=y  CONFIG_SPARSE_IRQ=y  CONFIG_PM=y  # CONFIG_PCI is not set @@ -84,6 +83,8 @@ CONFIG_LEDS_TRIGGERS=y  CONFIG_LEDS_TRIGGER_TIMER=y  CONFIG_RTC_CLASS=y  CONFIG_RTC_DRV_DS1307=y +CONFIG_DMADEVICES=y +CONFIG_PPC_BESTCOMM=y  CONFIG_EXT2_FS=y  CONFIG_EXT3_FS=y  # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set diff --git a/arch/powerpc/configs/52xx/pcm030_defconfig b/arch/powerpc/configs/52xx/pcm030_defconfig index 22e719575c60..430aa182fa1c 100644 --- a/arch/powerpc/configs/52xx/pcm030_defconfig +++ b/arch/powerpc/configs/52xx/pcm030_defconfig @@ -21,7 +21,6 @@ CONFIG_MODULE_UNLOAD=y  CONFIG_PPC_MPC52xx=y  CONFIG_PPC_MPC5200_SIMPLE=y  # CONFIG_PPC_PMAC is not set -CONFIG_PPC_BESTCOMM=y  CONFIG_NO_HZ=y  CONFIG_HIGH_RES_TIMERS=y  CONFIG_HZ_100=y @@ -87,6 +86,8 @@ CONFIG_USB_OHCI_HCD_PPC_OF_BE=y  CONFIG_USB_STORAGE=m  CONFIG_RTC_CLASS=y  CONFIG_RTC_DRV_PCF8563=m +CONFIG_DMADEVICES=y +CONFIG_PPC_BESTCOMM=y  CONFIG_EXT2_FS=m  CONFIG_EXT3_FS=m  # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set diff --git a/arch/powerpc/configs/52xx/tqm5200_defconfig b/arch/powerpc/configs/52xx/tqm5200_defconfig index 716a37be16e3..7af4c5bb7c63 100644 --- a/arch/powerpc/configs/52xx/tqm5200_defconfig +++ b/arch/powerpc/configs/52xx/tqm5200_defconfig @@ -17,7 +17,6 @@ CONFIG_PPC_MPC52xx=y  CONFIG_PPC_MPC5200_SIMPLE=y  CONFIG_PPC_MPC5200_BUGFIX=y  # CONFIG_PPC_PMAC is not set -CONFIG_PPC_BESTCOMM=y  CONFIG_PM=y  # CONFIG_PCI is not set  CONFIG_NET=y @@ -86,6 +85,8 @@ CONFIG_USB_STORAGE=y  CONFIG_RTC_CLASS=y  CONFIG_RTC_DRV_DS1307=y  CONFIG_RTC_DRV_DS1374=y +CONFIG_DMADEVICES=y +CONFIG_PPC_BESTCOMM=y  CONFIG_EXT2_FS=y  CONFIG_EXT3_FS=y  # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set diff --git a/arch/powerpc/configs/mpc5200_defconfig b/arch/powerpc/configs/mpc5200_defconfig index 6640a35bebb7..8b682d1cf4d6 100644 --- a/arch/powerpc/configs/mpc5200_defconfig +++ b/arch/powerpc/configs/mpc5200_defconfig @@ -15,7 +15,6 @@ CONFIG_PPC_MEDIA5200=y  CONFIG_PPC_MPC5200_BUGFIX=y  CONFIG_PPC_MPC5200_LPBFIFO=m  # CONFIG_PPC_PMAC is not set -CONFIG_PPC_BESTCOMM=y  CONFIG_SIMPLE_GPIO=y  CONFIG_NO_HZ=y  CONFIG_HIGH_RES_TIMERS=y @@ -125,6 +124,8 @@ CONFIG_RTC_CLASS=y  CONFIG_RTC_DRV_DS1307=y  CONFIG_RTC_DRV_DS1374=y  CONFIG_RTC_DRV_PCF8563=m +CONFIG_DMADEVICES=y +CONFIG_PPC_BESTCOMM=y  CONFIG_EXT2_FS=y  CONFIG_EXT3_FS=y  # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set diff --git a/arch/powerpc/configs/pasemi_defconfig b/arch/powerpc/configs/pasemi_defconfig index bd8a6f71944f..cec044a3ff69 100644 --- a/arch/powerpc/configs/pasemi_defconfig +++ b/arch/powerpc/configs/pasemi_defconfig @@ -2,7 +2,6 @@ CONFIG_PPC64=y  CONFIG_ALTIVEC=y  CONFIG_SMP=y  CONFIG_NR_CPUS=2 -CONFIG_EXPERIMENTAL=y  CONFIG_SYSVIPC=y  CONFIG_NO_HZ=y  CONFIG_HIGH_RES_TIMERS=y @@ -45,8 +44,9 @@ CONFIG_INET_AH=y  CONFIG_INET_ESP=y  # CONFIG_IPV6 is not set  CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +CONFIG_DEVTMPFS=y +CONFIG_DEVTMPFS_MOUNT=y  CONFIG_MTD=y -CONFIG_MTD_CHAR=y  CONFIG_MTD_BLOCK=y  CONFIG_MTD_SLRAM=y  CONFIG_MTD_PHRAM=y @@ -88,7 +88,6 @@ CONFIG_BLK_DEV_DM=y  CONFIG_DM_CRYPT=y  CONFIG_NETDEVICES=y  CONFIG_DUMMY=y -CONFIG_MII=y  CONFIG_TIGON3=y  CONFIG_E1000=y  CONFIG_PASEMI_MAC=y @@ -174,8 +173,8 @@ CONFIG_NLS_CODEPAGE_437=y  CONFIG_NLS_ISO8859_1=y  CONFIG_CRC_CCITT=y  CONFIG_PRINTK_TIME=y -CONFIG_MAGIC_SYSRQ=y  CONFIG_DEBUG_FS=y +CONFIG_MAGIC_SYSRQ=y  CONFIG_DEBUG_KERNEL=y  CONFIG_DETECT_HUNG_TASK=y  # CONFIG_SCHED_DEBUG is not set diff --git a/arch/powerpc/include/asm/pgalloc-32.h b/arch/powerpc/include/asm/pgalloc-32.h index 27b2386f738a..842846c1b711 100644 --- a/arch/powerpc/include/asm/pgalloc-32.h +++ b/arch/powerpc/include/asm/pgalloc-32.h @@ -84,10 +84,8 @@ static inline void pgtable_free_tlb(struct mmu_gather *tlb,  static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table,  				  unsigned long address)  { -	struct page *page = page_address(table); -  	tlb_flush_pgtable(tlb, address); -	pgtable_page_dtor(page); -	pgtable_free_tlb(tlb, page, 0); +	pgtable_page_dtor(table); +	pgtable_free_tlb(tlb, page_address(table), 0);  }  #endif /* _ASM_POWERPC_PGALLOC_32_H */ diff --git a/arch/powerpc/include/asm/pgalloc-64.h b/arch/powerpc/include/asm/pgalloc-64.h index 694012877bf7..4b0be20fcbfd 100644 --- a/arch/powerpc/include/asm/pgalloc-64.h +++ b/arch/powerpc/include/asm/pgalloc-64.h @@ -148,11 +148,9 @@ static inline void pgtable_free_tlb(struct mmu_gather *tlb,  static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table,  				  unsigned long address)  { -	struct page *page = page_address(table); -  	tlb_flush_pgtable(tlb, address); -	pgtable_page_dtor(page); -	pgtable_free_tlb(tlb, page, 0); +	pgtable_page_dtor(table); +	pgtable_free_tlb(tlb, page_address(table), 0);  }  #else /* if CONFIG_PPC_64K_PAGES */ diff --git a/arch/powerpc/kernel/machine_kexec.c b/arch/powerpc/kernel/machine_kexec.c index 88a7fb458dfd..75d4f7340da8 100644 --- a/arch/powerpc/kernel/machine_kexec.c +++ b/arch/powerpc/kernel/machine_kexec.c @@ -148,7 +148,7 @@ void __init reserve_crashkernel(void)  		 * a small SLB (128MB) since the crash kernel needs to place  		 * itself and some stacks to be in the first segment.  		 */ -		crashk_res.start = min(0x80000000ULL, (ppc64_rma_size / 2)); +		crashk_res.start = min(0x8000000ULL, (ppc64_rma_size / 2));  #else  		crashk_res.start = KDUMP_KERNELBASE;  #endif diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S index e59caf874d05..64bf8db12b15 100644 --- a/arch/powerpc/kernel/misc_64.S +++ b/arch/powerpc/kernel/misc_64.S @@ -246,8 +246,8 @@ _GLOBAL(__bswapdi2)  	or	r3,r7,r9  	blr -#if defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE) +#ifdef CONFIG_PPC_EARLY_DEBUG_BOOTX  _GLOBAL(rmci_on)  	sync  	isync @@ -277,6 +277,9 @@ _GLOBAL(rmci_off)  	isync  	sync  	blr +#endif /* CONFIG_PPC_EARLY_DEBUG_BOOTX */ + +#if defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE)  /*   * Do an IO access in real mode diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c index 084cdfa40682..2c6d173842b2 100644 --- a/arch/powerpc/platforms/powernv/pci-ioda.c +++ b/arch/powerpc/platforms/powernv/pci-ioda.c @@ -720,6 +720,7 @@ static void pnv_pci_ioda2_setup_dma_pe(struct pnv_phb *phb,  		tbl->it_type = TCE_PCI_SWINV_CREATE | TCE_PCI_SWINV_FREE;  	}  	iommu_init_table(tbl, phb->hose->node); +	iommu_register_group(tbl, pci_domain_nr(pe->pbus), pe->pe_number);  	if (pe->pdev)  		set_iommu_table_base(&pe->pdev->dev, tbl); diff --git a/arch/powerpc/sysdev/ppc4xx_ocm.c b/arch/powerpc/sysdev/ppc4xx_ocm.c index b7c43453236d..85d9e37f5ccb 100644 --- a/arch/powerpc/sysdev/ppc4xx_ocm.c +++ b/arch/powerpc/sysdev/ppc4xx_ocm.c @@ -339,7 +339,7 @@ void *ppc4xx_ocm_alloc(phys_addr_t *phys, int size, int align,  		if (IS_ERR_VALUE(offset))  			continue; -		ocm_blk = kzalloc(sizeof(struct ocm_block *), GFP_KERNEL); +		ocm_blk = kzalloc(sizeof(struct ocm_block), GFP_KERNEL);  		if (!ocm_blk) {  			printk(KERN_ERR "PPC4XX OCM: could not allocate ocm block");  			rh_free(ocm_reg->rh, offset); diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index 5877e71901b3..1e1a03d2d19f 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig @@ -347,14 +347,14 @@ config SMP  	  Even if you don't know what to do here, say Y.  config NR_CPUS -	int "Maximum number of CPUs (2-64)" -	range 2 64 +	int "Maximum number of CPUs (2-256)" +	range 2 256  	depends on SMP  	default "32" if !64BIT  	default "64" if 64BIT  	help  	  This allows you to specify the maximum number of CPUs which this -	  kernel will support.  The maximum supported value is 64 and the +	  kernel will support. The maximum supported value is 256 and the  	  minimum value which makes sense is 2.  	  This is purely to save memory - each supported CPU adds diff --git a/arch/s390/include/asm/sclp.h b/arch/s390/include/asm/sclp.h index 30ef748bc161..2f390956c7c1 100644 --- a/arch/s390/include/asm/sclp.h +++ b/arch/s390/include/asm/sclp.h @@ -8,6 +8,7 @@  #include <linux/types.h>  #include <asm/chpid.h> +#include <asm/cpu.h>  #define SCLP_CHP_INFO_MASK_SIZE		32 @@ -37,7 +38,7 @@ struct sclp_cpu_info {  	unsigned int standby;  	unsigned int combined;  	int has_cpu_type; -	struct sclp_cpu_entry cpu[255]; +	struct sclp_cpu_entry cpu[MAX_CPU_ADDRESS + 1];  };  int sclp_get_cpu_info(struct sclp_cpu_info *info); diff --git a/arch/s390/kernel/asm-offsets.c b/arch/s390/kernel/asm-offsets.c index 496116cd65ec..e4c99a183651 100644 --- a/arch/s390/kernel/asm-offsets.c +++ b/arch/s390/kernel/asm-offsets.c @@ -72,6 +72,7 @@ int main(void)  	/* constants used by the vdso */  	DEFINE(__CLOCK_REALTIME, CLOCK_REALTIME);  	DEFINE(__CLOCK_MONOTONIC, CLOCK_MONOTONIC); +	DEFINE(__CLOCK_THREAD_CPUTIME_ID, CLOCK_THREAD_CPUTIME_ID);  	DEFINE(__CLOCK_REALTIME_RES, MONOTONIC_RES_NSEC);  	BLANK();  	/* idle data offsets */ diff --git a/arch/s390/kernel/vdso.c b/arch/s390/kernel/vdso.c index a84476f2a9bb..613649096783 100644 --- a/arch/s390/kernel/vdso.c +++ b/arch/s390/kernel/vdso.c @@ -125,7 +125,7 @@ int vdso_alloc_per_cpu(struct _lowcore *lowcore)  		psal[i] = 0x80000000;  	lowcore->paste[4] = (u32)(addr_t) psal; -	psal[0] = 0x20000000; +	psal[0] = 0x02000000;  	psal[2] = (u32)(addr_t) aste;  	*(unsigned long *) (aste + 2) = segment_table +  		_ASCE_TABLE_LENGTH + _ASCE_USER_BITS + _ASCE_TYPE_SEGMENT; diff --git a/arch/s390/kernel/vdso32/clock_gettime.S b/arch/s390/kernel/vdso32/clock_gettime.S index 5be8e472f57d..65fc3979c2f1 100644 --- a/arch/s390/kernel/vdso32/clock_gettime.S +++ b/arch/s390/kernel/vdso32/clock_gettime.S @@ -46,18 +46,13 @@ __kernel_clock_gettime:  	jnm	3f  	a	%r0,__VDSO_TK_MULT(%r5)  3:	alr	%r0,%r2 -	al	%r0,__VDSO_XTIME_NSEC(%r5)	/*  + tk->xtime_nsec */ -	al	%r1,__VDSO_XTIME_NSEC+4(%r5) -	brc	12,4f -	ahi	%r0,1 -4:	al	%r0,__VDSO_WTOM_NSEC(%r5)	/*  + wall_to_monotonic.nsec */ +	al	%r0,__VDSO_WTOM_NSEC(%r5)  	al	%r1,__VDSO_WTOM_NSEC+4(%r5)  	brc	12,5f  	ahi	%r0,1  5:	l	%r2,__VDSO_TK_SHIFT(%r5)	/* Timekeeper shift */  	srdl	%r0,0(%r2)			/*  >> tk->shift */ -	l	%r2,__VDSO_XTIME_SEC+4(%r5) -	al	%r2,__VDSO_WTOM_SEC+4(%r5) +	l	%r2,__VDSO_WTOM_SEC+4(%r5)  	cl	%r4,__VDSO_UPD_COUNT+4(%r5)	/* check update counter */  	jne	1b  	basr	%r5,0 diff --git a/arch/s390/kernel/vdso64/clock_getres.S b/arch/s390/kernel/vdso64/clock_getres.S index 176e1f75f9aa..34deba7c7ed1 100644 --- a/arch/s390/kernel/vdso64/clock_getres.S +++ b/arch/s390/kernel/vdso64/clock_getres.S @@ -23,7 +23,9 @@ __kernel_clock_getres:  	je	0f  	cghi	%r2,__CLOCK_MONOTONIC  	je	0f -	cghi	%r2,-2		/* CLOCK_THREAD_CPUTIME_ID for this thread */ +	cghi	%r2,__CLOCK_THREAD_CPUTIME_ID +	je	0f +	cghi	%r2,-2		/* Per-thread CPUCLOCK with PID=0, VIRT=1 */  	jne	2f  	larl	%r5,_vdso_data  	icm	%r0,15,__LC_ECTG_OK(%r5) diff --git a/arch/s390/kernel/vdso64/clock_gettime.S b/arch/s390/kernel/vdso64/clock_gettime.S index 0add1072ba30..91940ed33a4a 100644 --- a/arch/s390/kernel/vdso64/clock_gettime.S +++ b/arch/s390/kernel/vdso64/clock_gettime.S @@ -22,7 +22,9 @@ __kernel_clock_gettime:  	larl	%r5,_vdso_data  	cghi	%r2,__CLOCK_REALTIME  	je	4f -	cghi	%r2,-2		/* CLOCK_THREAD_CPUTIME_ID for this thread */ +	cghi	%r2,__CLOCK_THREAD_CPUTIME_ID +	je	9f +	cghi	%r2,-2		/* Per-thread CPUCLOCK with PID=0, VIRT=1 */  	je	9f  	cghi	%r2,__CLOCK_MONOTONIC  	jne	12f @@ -35,13 +37,11 @@ __kernel_clock_gettime:  	jnz	0b  	stck	48(%r15)			/* Store TOD clock */  	lgf	%r2,__VDSO_TK_SHIFT(%r5)	/* Timekeeper shift */ -	lg	%r0,__VDSO_XTIME_SEC(%r5)	/* tk->xtime_sec */ -	alg	%r0,__VDSO_WTOM_SEC(%r5)	/*  + wall_to_monotonic.sec */ +	lg	%r0,__VDSO_WTOM_SEC(%r5)  	lg	%r1,48(%r15)  	sg	%r1,__VDSO_XTIME_STAMP(%r5)	/* TOD - cycle_last */  	msgf	%r1,__VDSO_TK_MULT(%r5)		/*  * tk->mult */ -	alg	%r1,__VDSO_XTIME_NSEC(%r5)	/*  + tk->xtime_nsec */ -	alg	%r1,__VDSO_WTOM_NSEC(%r5)	/*  + wall_to_monotonic.nsec */ +	alg	%r1,__VDSO_WTOM_NSEC(%r5)  	srlg	%r1,%r1,0(%r2)			/*  >> tk->shift */  	clg	%r4,__VDSO_UPD_COUNT(%r5)	/* check update counter */  	jne	0b diff --git a/arch/x86/Makefile b/arch/x86/Makefile index 41250fb33985..eda00f9be0cf 100644 --- a/arch/x86/Makefile +++ b/arch/x86/Makefile @@ -31,6 +31,9 @@ ifeq ($(CONFIG_X86_32),y)          KBUILD_CFLAGS += -msoft-float -mregparm=3 -freg-struct-return +        # Don't autogenerate SSE instructions +	KBUILD_CFLAGS += -mno-sse +          # Never want PIC in a 32-bit kernel, prevent breakage with GCC built          # with nonstandard options          KBUILD_CFLAGS += -fno-pic @@ -57,8 +60,11 @@ else          KBUILD_AFLAGS += -m64          KBUILD_CFLAGS += -m64 +        # Don't autogenerate SSE instructions +	KBUILD_CFLAGS += -mno-sse +  	# Use -mpreferred-stack-boundary=3 if supported. -	KBUILD_CFLAGS += $(call cc-option,-mno-sse -mpreferred-stack-boundary=3) +	KBUILD_CFLAGS += $(call cc-option,-mpreferred-stack-boundary=3)          # FIXME - should be integrated in Makefile.cpu (Makefile_32.cpu)          cflags-$(CONFIG_MK8) += $(call cc-option,-march=k8) diff --git a/arch/x86/include/asm/atomic.h b/arch/x86/include/asm/atomic.h index da31c8b8a92d..b17f4f48ecd7 100644 --- a/arch/x86/include/asm/atomic.h +++ b/arch/x86/include/asm/atomic.h @@ -77,7 +77,7 @@ static inline void atomic_sub(int i, atomic_t *v)   */  static inline int atomic_sub_and_test(int i, atomic_t *v)  { -	GEN_BINARY_RMWcc(LOCK_PREFIX "subl", v->counter, i, "%0", "e"); +	GEN_BINARY_RMWcc(LOCK_PREFIX "subl", v->counter, "er", i, "%0", "e");  }  /** @@ -141,7 +141,7 @@ static inline int atomic_inc_and_test(atomic_t *v)   */  static inline int atomic_add_negative(int i, atomic_t *v)  { -	GEN_BINARY_RMWcc(LOCK_PREFIX "addl", v->counter, i, "%0", "s"); +	GEN_BINARY_RMWcc(LOCK_PREFIX "addl", v->counter, "er", i, "%0", "s");  }  /** diff --git a/arch/x86/include/asm/atomic64_64.h b/arch/x86/include/asm/atomic64_64.h index 3f065c985aee..46e9052bbd28 100644 --- a/arch/x86/include/asm/atomic64_64.h +++ b/arch/x86/include/asm/atomic64_64.h @@ -72,7 +72,7 @@ static inline void atomic64_sub(long i, atomic64_t *v)   */  static inline int atomic64_sub_and_test(long i, atomic64_t *v)  { -	GEN_BINARY_RMWcc(LOCK_PREFIX "subq", v->counter, i, "%0", "e"); +	GEN_BINARY_RMWcc(LOCK_PREFIX "subq", v->counter, "er", i, "%0", "e");  }  /** @@ -138,7 +138,7 @@ static inline int atomic64_inc_and_test(atomic64_t *v)   */  static inline int atomic64_add_negative(long i, atomic64_t *v)  { -	GEN_BINARY_RMWcc(LOCK_PREFIX "addq", v->counter, i, "%0", "s"); +	GEN_BINARY_RMWcc(LOCK_PREFIX "addq", v->counter, "er", i, "%0", "s");  }  /** diff --git a/arch/x86/include/asm/bitops.h b/arch/x86/include/asm/bitops.h index 6d76d0935989..9fc1af74dc83 100644 --- a/arch/x86/include/asm/bitops.h +++ b/arch/x86/include/asm/bitops.h @@ -205,7 +205,7 @@ static inline void change_bit(long nr, volatile unsigned long *addr)   */  static inline int test_and_set_bit(long nr, volatile unsigned long *addr)  { -	GEN_BINARY_RMWcc(LOCK_PREFIX "bts", *addr, nr, "%0", "c"); +	GEN_BINARY_RMWcc(LOCK_PREFIX "bts", *addr, "Ir", nr, "%0", "c");  }  /** @@ -251,7 +251,7 @@ static inline int __test_and_set_bit(long nr, volatile unsigned long *addr)   */  static inline int test_and_clear_bit(long nr, volatile unsigned long *addr)  { -	GEN_BINARY_RMWcc(LOCK_PREFIX "btr", *addr, nr, "%0", "c"); +	GEN_BINARY_RMWcc(LOCK_PREFIX "btr", *addr, "Ir", nr, "%0", "c");  }  /** @@ -304,7 +304,7 @@ static inline int __test_and_change_bit(long nr, volatile unsigned long *addr)   */  static inline int test_and_change_bit(long nr, volatile unsigned long *addr)  { -	GEN_BINARY_RMWcc(LOCK_PREFIX "btc", *addr, nr, "%0", "c"); +	GEN_BINARY_RMWcc(LOCK_PREFIX "btc", *addr, "Ir", nr, "%0", "c");  }  static __always_inline int constant_test_bit(long nr, const volatile unsigned long *addr) diff --git a/arch/x86/include/asm/local.h b/arch/x86/include/asm/local.h index 5b23e605e707..4ad6560847b1 100644 --- a/arch/x86/include/asm/local.h +++ b/arch/x86/include/asm/local.h @@ -52,7 +52,7 @@ static inline void local_sub(long i, local_t *l)   */  static inline int local_sub_and_test(long i, local_t *l)  { -	GEN_BINARY_RMWcc(_ASM_SUB, l->a.counter, i, "%0", "e"); +	GEN_BINARY_RMWcc(_ASM_SUB, l->a.counter, "er", i, "%0", "e");  }  /** @@ -92,7 +92,7 @@ static inline int local_inc_and_test(local_t *l)   */  static inline int local_add_negative(long i, local_t *l)  { -	GEN_BINARY_RMWcc(_ASM_ADD, l->a.counter, i, "%0", "s"); +	GEN_BINARY_RMWcc(_ASM_ADD, l->a.counter, "er", i, "%0", "s");  }  /** diff --git a/arch/x86/include/asm/rmwcc.h b/arch/x86/include/asm/rmwcc.h index 1ff990f1de8e..8f7866a5b9a4 100644 --- a/arch/x86/include/asm/rmwcc.h +++ b/arch/x86/include/asm/rmwcc.h @@ -16,8 +16,8 @@ cc_label:								\  #define GEN_UNARY_RMWcc(op, var, arg0, cc) 				\  	__GEN_RMWcc(op " " arg0, var, cc) -#define GEN_BINARY_RMWcc(op, var, val, arg0, cc)			\ -	__GEN_RMWcc(op " %1, " arg0, var, cc, "er" (val)) +#define GEN_BINARY_RMWcc(op, var, vcon, val, arg0, cc)			\ +	__GEN_RMWcc(op " %1, " arg0, var, cc, vcon (val))  #else /* !CC_HAVE_ASM_GOTO */ @@ -33,8 +33,8 @@ do {									\  #define GEN_UNARY_RMWcc(op, var, arg0, cc)				\  	__GEN_RMWcc(op " " arg0, var, cc) -#define GEN_BINARY_RMWcc(op, var, val, arg0, cc)			\ -	__GEN_RMWcc(op " %2, " arg0, var, cc, "er" (val)) +#define GEN_BINARY_RMWcc(op, var, vcon, val, arg0, cc)			\ +	__GEN_RMWcc(op " %2, " arg0, var, cc, vcon (val))  #endif /* CC_HAVE_ASM_GOTO */ diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index da3c599584a3..c752cb43e52f 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c @@ -558,6 +558,17 @@ void native_machine_shutdown(void)  {  	/* Stop the cpus and apics */  #ifdef CONFIG_X86_IO_APIC +	/* +	 * Disabling IO APIC before local APIC is a workaround for +	 * erratum AVR31 in "Intel Atom Processor C2000 Product Family +	 * Specification Update". In this situation, interrupts that target +	 * a Logical Processor whose Local APIC is either in the process of +	 * being hardware disabled or software disabled are neither delivered +	 * nor discarded. When this erratum occurs, the processor may hang. +	 * +	 * Even without the erratum, it still makes sense to quiet IO APIC +	 * before disabling Local APIC. +	 */  	disable_IO_APIC();  #endif diff --git a/arch/x86/platform/efi/early_printk.c b/arch/x86/platform/efi/early_printk.c index 6599a0027b76..81b506d5befd 100644 --- a/arch/x86/platform/efi/early_printk.c +++ b/arch/x86/platform/efi/early_printk.c @@ -142,7 +142,7 @@ early_efi_write(struct console *con, const char *str, unsigned int num)  			efi_y += font->height;  		} -		if (efi_y + font->height >= si->lfb_height) { +		if (efi_y + font->height > si->lfb_height) {  			u32 i;  			efi_y -= font->height; diff --git a/block/blk-cgroup.h b/block/blk-cgroup.h index 1610b22edf09..86154eab9523 100644 --- a/block/blk-cgroup.h +++ b/block/blk-cgroup.h @@ -435,9 +435,9 @@ static inline uint64_t blkg_stat_read(struct blkg_stat *stat)  	uint64_t v;  	do { -		start = u64_stats_fetch_begin(&stat->syncp); +		start = u64_stats_fetch_begin_bh(&stat->syncp);  		v = stat->cnt; -	} while (u64_stats_fetch_retry(&stat->syncp, start)); +	} while (u64_stats_fetch_retry_bh(&stat->syncp, start));  	return v;  } @@ -508,9 +508,9 @@ static inline struct blkg_rwstat blkg_rwstat_read(struct blkg_rwstat *rwstat)  	struct blkg_rwstat tmp;  	do { -		start = u64_stats_fetch_begin(&rwstat->syncp); +		start = u64_stats_fetch_begin_bh(&rwstat->syncp);  		tmp = *rwstat; -	} while (u64_stats_fetch_retry(&rwstat->syncp, start)); +	} while (u64_stats_fetch_retry_bh(&rwstat->syncp, start));  	return tmp;  } diff --git a/block/blk-flush.c b/block/blk-flush.c index 331e627301ea..fb6f3c0ffa49 100644 --- a/block/blk-flush.c +++ b/block/blk-flush.c @@ -502,15 +502,6 @@ void blk_abort_flushes(struct request_queue *q)  	}  } -static void bio_end_flush(struct bio *bio, int err) -{ -	if (err) -		clear_bit(BIO_UPTODATE, &bio->bi_flags); -	if (bio->bi_private) -		complete(bio->bi_private); -	bio_put(bio); -} -  /**   * blkdev_issue_flush - queue a flush   * @bdev:	blockdev to issue flush for @@ -526,7 +517,6 @@ static void bio_end_flush(struct bio *bio, int err)  int blkdev_issue_flush(struct block_device *bdev, gfp_t gfp_mask,  		sector_t *error_sector)  { -	DECLARE_COMPLETION_ONSTACK(wait);  	struct request_queue *q;  	struct bio *bio;  	int ret = 0; @@ -548,13 +538,9 @@ int blkdev_issue_flush(struct block_device *bdev, gfp_t gfp_mask,  		return -ENXIO;  	bio = bio_alloc(gfp_mask, 0); -	bio->bi_end_io = bio_end_flush;  	bio->bi_bdev = bdev; -	bio->bi_private = &wait; -	bio_get(bio); -	submit_bio(WRITE_FLUSH, bio); -	wait_for_completion_io(&wait); +	ret = submit_bio_wait(WRITE_FLUSH, bio);  	/*  	 * The driver must store the error location in ->bi_sector, if @@ -564,9 +550,6 @@ int blkdev_issue_flush(struct block_device *bdev, gfp_t gfp_mask,  	if (error_sector)  		*error_sector = bio->bi_sector; -	if (!bio_flagged(bio, BIO_UPTODATE)) -		ret = -EIO; -  	bio_put(bio);  	return ret;  } diff --git a/block/blk-mq.c b/block/blk-mq.c index cdc629cf075b..c79126e11030 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -202,10 +202,12 @@ static struct request *blk_mq_alloc_request_pinned(struct request_queue *q,  		if (rq) {  			blk_mq_rq_ctx_init(q, ctx, rq, rw);  			break; -		} else if (!(gfp & __GFP_WAIT)) -			break; +		}  		blk_mq_put_ctx(ctx); +		if (!(gfp & __GFP_WAIT)) +			break; +  		__blk_mq_run_hw_queue(hctx);  		blk_mq_wait_for_tags(hctx->tags);  	} while (1); @@ -222,7 +224,8 @@ struct request *blk_mq_alloc_request(struct request_queue *q, int rw,  		return NULL;  	rq = blk_mq_alloc_request_pinned(q, rw, gfp, reserved); -	blk_mq_put_ctx(rq->mq_ctx); +	if (rq) +		blk_mq_put_ctx(rq->mq_ctx);  	return rq;  } @@ -235,7 +238,8 @@ struct request *blk_mq_alloc_reserved_request(struct request_queue *q, int rw,  		return NULL;  	rq = blk_mq_alloc_request_pinned(q, rw, gfp, true); -	blk_mq_put_ctx(rq->mq_ctx); +	if (rq) +		blk_mq_put_ctx(rq->mq_ctx);  	return rq;  }  EXPORT_SYMBOL(blk_mq_alloc_reserved_request); @@ -308,12 +312,12 @@ void blk_mq_complete_request(struct request *rq, int error)  	blk_account_io_completion(rq, bytes); +	blk_account_io_done(rq); +  	if (rq->end_io)  		rq->end_io(rq, error);  	else  		blk_mq_free_request(rq); - -	blk_account_io_done(rq);  }  void __blk_mq_end_io(struct request *rq, int error) diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index db6dfcfa3e2e..ab58556d347c 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c @@ -3625,6 +3625,7 @@ int ata_scsi_add_hosts(struct ata_host *host, struct scsi_host_template *sht)  		shost->max_lun = 1;  		shost->max_channel = 1;  		shost->max_cmd_len = 16; +		shost->no_write_same = 1;  		/* Schedule policy is determined by ->qc_defer()  		 * callback and it needs to see every deferred qc. diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index 432db1b59b00..c4a4c9006288 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c @@ -489,7 +489,7 @@ static int blkif_queue_request(struct request *req)  			if ((ring_req->operation == BLKIF_OP_INDIRECT) &&  			    (i % SEGS_PER_INDIRECT_FRAME == 0)) { -				unsigned long pfn; +				unsigned long uninitialized_var(pfn);  				if (segments)  					kunmap_atomic(segments); @@ -2011,6 +2011,10 @@ static void blkif_release(struct gendisk *disk, fmode_t mode)  	bdev = bdget_disk(disk, 0); +	if (!bdev) { +		WARN(1, "Block device %s yanked out from us!\n", disk->disk_name); +		goto out_mutex; +	}  	if (bdev->bd_openers)  		goto out; @@ -2041,6 +2045,7 @@ static void blkif_release(struct gendisk *disk, fmode_t mode)  out:  	bdput(bdev); +out_mutex:  	mutex_unlock(&blkfront_mutex);  } diff --git a/drivers/char/i8k.c b/drivers/char/i8k.c index 40cc0cf2ded6..e6939e13e338 100644 --- a/drivers/char/i8k.c +++ b/drivers/char/i8k.c @@ -664,6 +664,13 @@ static struct dmi_system_id __initdata i8k_dmi_table[] = {  			DMI_MATCH(DMI_PRODUCT_NAME, "Vostro"),  		},  	}, +	{ +		.ident = "Dell XPS421", +		.matches = { +			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), +			DMI_MATCH(DMI_PRODUCT_NAME, "XPS L421X"), +		}, +	},          { }  }; diff --git a/drivers/cpufreq/at32ap-cpufreq.c b/drivers/cpufreq/at32ap-cpufreq.c index 856ad80418ae..7c03dd84f66a 100644 --- a/drivers/cpufreq/at32ap-cpufreq.c +++ b/drivers/cpufreq/at32ap-cpufreq.c @@ -58,7 +58,7 @@ static int at32_set_target(struct cpufreq_policy *policy, unsigned int index)  	return 0;  } -static int __init at32_cpufreq_driver_init(struct cpufreq_policy *policy) +static int at32_cpufreq_driver_init(struct cpufreq_policy *policy)  {  	unsigned int frequency, rate, min_freq;  	int retval, steps, i; diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c index 2a991e468f78..a55e68f2cfc8 100644 --- a/drivers/cpuidle/cpuidle.c +++ b/drivers/cpuidle/cpuidle.c @@ -400,7 +400,7 @@ EXPORT_SYMBOL_GPL(cpuidle_register_device);   */  void cpuidle_unregister_device(struct cpuidle_device *dev)  { -	if (dev->registered == 0) +	if (!dev || dev->registered == 0)  		return;  	cpuidle_pause_and_lock(); diff --git a/drivers/extcon/extcon-arizona.c b/drivers/extcon/extcon-arizona.c index 3c55ec856e39..a287cece0593 100644 --- a/drivers/extcon/extcon-arizona.c +++ b/drivers/extcon/extcon-arizona.c @@ -1082,7 +1082,7 @@ static void arizona_micd_set_level(struct arizona *arizona, int index,  static int arizona_extcon_probe(struct platform_device *pdev)  {  	struct arizona *arizona = dev_get_drvdata(pdev->dev.parent); -	struct arizona_pdata *pdata; +	struct arizona_pdata *pdata = &arizona->pdata;  	struct arizona_extcon_info *info;  	unsigned int val;  	int jack_irq_fall, jack_irq_rise; @@ -1091,8 +1091,6 @@ static int arizona_extcon_probe(struct platform_device *pdev)  	if (!arizona->dapm || !arizona->dapm->card)  		return -EPROBE_DEFER; -	pdata = dev_get_platdata(arizona->dev); -  	info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);  	if (!info) {  		dev_err(&pdev->dev, "Failed to allocate memory\n"); diff --git a/drivers/extcon/extcon-class.c b/drivers/extcon/extcon-class.c index 15443d3b6be1..76322330cbd7 100644 --- a/drivers/extcon/extcon-class.c +++ b/drivers/extcon/extcon-class.c @@ -792,6 +792,8 @@ void extcon_dev_unregister(struct extcon_dev *edev)  		return;  	} +	device_unregister(&edev->dev); +  	if (edev->mutually_exclusive && edev->max_supported) {  		for (index = 0; edev->mutually_exclusive[index];  				index++) @@ -812,7 +814,6 @@ void extcon_dev_unregister(struct extcon_dev *edev)  	if (switch_class)  		class_compat_remove_link(switch_class, &edev->dev, NULL);  #endif -	device_unregister(&edev->dev);  	put_device(&edev->dev);  }  EXPORT_SYMBOL_GPL(extcon_dev_unregister); diff --git a/drivers/firewire/sbp2.c b/drivers/firewire/sbp2.c index 281029daf98c..b0bb056458a3 100644 --- a/drivers/firewire/sbp2.c +++ b/drivers/firewire/sbp2.c @@ -1623,6 +1623,7 @@ static struct scsi_host_template scsi_driver_template = {  	.cmd_per_lun		= 1,  	.can_queue		= 1,  	.sdev_attrs		= sbp2_scsi_sysfs_attrs, +	.no_write_same		= 1,  };  MODULE_AUTHOR("Kristian Hoegsberg <[email protected]>"); diff --git a/drivers/firmware/efi/efi-pstore.c b/drivers/firmware/efi/efi-pstore.c index 5002d50e3781..743fd426f21b 100644 --- a/drivers/firmware/efi/efi-pstore.c +++ b/drivers/firmware/efi/efi-pstore.c @@ -18,14 +18,12 @@ module_param_named(pstore_disable, efivars_pstore_disable, bool, 0644);  static int efi_pstore_open(struct pstore_info *psi)  { -	efivar_entry_iter_begin();  	psi->data = NULL;  	return 0;  }  static int efi_pstore_close(struct pstore_info *psi)  { -	efivar_entry_iter_end();  	psi->data = NULL;  	return 0;  } @@ -39,6 +37,12 @@ struct pstore_read_data {  	char **buf;  }; +static inline u64 generic_id(unsigned long timestamp, +			     unsigned int part, int count) +{ +	return (timestamp * 100 + part) * 1000 + count; +} +  static int efi_pstore_read_func(struct efivar_entry *entry, void *data)  {  	efi_guid_t vendor = LINUX_EFI_CRASH_GUID; @@ -57,7 +61,7 @@ static int efi_pstore_read_func(struct efivar_entry *entry, void *data)  	if (sscanf(name, "dump-type%u-%u-%d-%lu-%c",  		   cb_data->type, &part, &cnt, &time, &data_type) == 5) { -		*cb_data->id = part; +		*cb_data->id = generic_id(time, part, cnt);  		*cb_data->count = cnt;  		cb_data->timespec->tv_sec = time;  		cb_data->timespec->tv_nsec = 0; @@ -67,7 +71,7 @@ static int efi_pstore_read_func(struct efivar_entry *entry, void *data)  			*cb_data->compressed = false;  	} else if (sscanf(name, "dump-type%u-%u-%d-%lu",  		   cb_data->type, &part, &cnt, &time) == 4) { -		*cb_data->id = part; +		*cb_data->id = generic_id(time, part, cnt);  		*cb_data->count = cnt;  		cb_data->timespec->tv_sec = time;  		cb_data->timespec->tv_nsec = 0; @@ -79,7 +83,7 @@ static int efi_pstore_read_func(struct efivar_entry *entry, void *data)  		 * which doesn't support holding  		 * multiple logs, remains.  		 */ -		*cb_data->id = part; +		*cb_data->id = generic_id(time, part, 0);  		*cb_data->count = 0;  		cb_data->timespec->tv_sec = time;  		cb_data->timespec->tv_nsec = 0; @@ -91,19 +95,125 @@ static int efi_pstore_read_func(struct efivar_entry *entry, void *data)  	__efivar_entry_get(entry, &entry->var.Attributes,  			   &entry->var.DataSize, entry->var.Data);  	size = entry->var.DataSize; +	memcpy(*cb_data->buf, entry->var.Data, +	       (size_t)min_t(unsigned long, EFIVARS_DATA_SIZE_MAX, size)); -	*cb_data->buf = kmemdup(entry->var.Data, size, GFP_KERNEL); -	if (*cb_data->buf == NULL) -		return -ENOMEM;  	return size;  } +/** + * efi_pstore_scan_sysfs_enter + * @entry: scanning entry + * @next: next entry + * @head: list head + */ +static void efi_pstore_scan_sysfs_enter(struct efivar_entry *pos, +					struct efivar_entry *next, +					struct list_head *head) +{ +	pos->scanning = true; +	if (&next->list != head) +		next->scanning = true; +} + +/** + * __efi_pstore_scan_sysfs_exit + * @entry: deleting entry + * @turn_off_scanning: Check if a scanning flag should be turned off + */ +static inline void __efi_pstore_scan_sysfs_exit(struct efivar_entry *entry, +						bool turn_off_scanning) +{ +	if (entry->deleting) { +		list_del(&entry->list); +		efivar_entry_iter_end(); +		efivar_unregister(entry); +		efivar_entry_iter_begin(); +	} else if (turn_off_scanning) +		entry->scanning = false; +} + +/** + * efi_pstore_scan_sysfs_exit + * @pos: scanning entry + * @next: next entry + * @head: list head + * @stop: a flag checking if scanning will stop + */ +static void efi_pstore_scan_sysfs_exit(struct efivar_entry *pos, +				       struct efivar_entry *next, +				       struct list_head *head, bool stop) +{ +	__efi_pstore_scan_sysfs_exit(pos, true); +	if (stop) +		__efi_pstore_scan_sysfs_exit(next, &next->list != head); +} + +/** + * efi_pstore_sysfs_entry_iter + * + * @data: function-specific data to pass to callback + * @pos: entry to begin iterating from + * + * You MUST call efivar_enter_iter_begin() before this function, and + * efivar_entry_iter_end() afterwards. + * + * It is possible to begin iteration from an arbitrary entry within + * the list by passing @pos. @pos is updated on return to point to + * the next entry of the last one passed to efi_pstore_read_func(). + * To begin iterating from the beginning of the list @pos must be %NULL. + */ +static int efi_pstore_sysfs_entry_iter(void *data, struct efivar_entry **pos) +{ +	struct efivar_entry *entry, *n; +	struct list_head *head = &efivar_sysfs_list; +	int size = 0; + +	if (!*pos) { +		list_for_each_entry_safe(entry, n, head, list) { +			efi_pstore_scan_sysfs_enter(entry, n, head); + +			size = efi_pstore_read_func(entry, data); +			efi_pstore_scan_sysfs_exit(entry, n, head, size < 0); +			if (size) +				break; +		} +		*pos = n; +		return size; +	} + +	list_for_each_entry_safe_from((*pos), n, head, list) { +		efi_pstore_scan_sysfs_enter((*pos), n, head); + +		size = efi_pstore_read_func((*pos), data); +		efi_pstore_scan_sysfs_exit((*pos), n, head, size < 0); +		if (size) +			break; +	} +	*pos = n; +	return size; +} + +/** + * efi_pstore_read + * + * This function returns a size of NVRAM entry logged via efi_pstore_write(). + * The meaning and behavior of efi_pstore/pstore are as below. + * + * size > 0: Got data of an entry logged via efi_pstore_write() successfully, + *           and pstore filesystem will continue reading subsequent entries. + * size == 0: Entry was not logged via efi_pstore_write(), + *            and efi_pstore driver will continue reading subsequent entries. + * size < 0: Failed to get data of entry logging via efi_pstore_write(), + *           and pstore will stop reading entry. + */  static ssize_t efi_pstore_read(u64 *id, enum pstore_type_id *type,  			       int *count, struct timespec *timespec,  			       char **buf, bool *compressed,  			       struct pstore_info *psi)  {  	struct pstore_read_data data; +	ssize_t size;  	data.id = id;  	data.type = type; @@ -112,8 +222,17 @@ static ssize_t efi_pstore_read(u64 *id, enum pstore_type_id *type,  	data.compressed = compressed;  	data.buf = buf; -	return __efivar_entry_iter(efi_pstore_read_func, &efivar_sysfs_list, &data, -				   (struct efivar_entry **)&psi->data); +	*data.buf = kzalloc(EFIVARS_DATA_SIZE_MAX, GFP_KERNEL); +	if (!*data.buf) +		return -ENOMEM; + +	efivar_entry_iter_begin(); +	size = efi_pstore_sysfs_entry_iter(&data, +					   (struct efivar_entry **)&psi->data); +	efivar_entry_iter_end(); +	if (size <= 0) +		kfree(*data.buf); +	return size;  }  static int efi_pstore_write(enum pstore_type_id type, @@ -184,9 +303,17 @@ static int efi_pstore_erase_func(struct efivar_entry *entry, void *data)  			return 0;  	} +	if (entry->scanning) { +		/* +		 * Skip deletion because this entry will be deleted +		 * after scanning is completed. +		 */ +		entry->deleting = true; +	} else +		list_del(&entry->list); +  	/* found */  	__efivar_entry_delete(entry); -	list_del(&entry->list);  	return 1;  } @@ -199,14 +326,16 @@ static int efi_pstore_erase(enum pstore_type_id type, u64 id, int count,  	char name[DUMP_NAME_LEN];  	efi_char16_t efi_name[DUMP_NAME_LEN];  	int found, i; +	unsigned int part; -	sprintf(name, "dump-type%u-%u-%d-%lu", type, (unsigned int)id, count, -		time.tv_sec); +	do_div(id, 1000); +	part = do_div(id, 100); +	sprintf(name, "dump-type%u-%u-%d-%lu", type, part, count, time.tv_sec);  	for (i = 0; i < DUMP_NAME_LEN; i++)  		efi_name[i] = name[i]; -	edata.id = id; +	edata.id = part;  	edata.type = type;  	edata.count = count;  	edata.time = time; @@ -214,10 +343,12 @@ static int efi_pstore_erase(enum pstore_type_id type, u64 id, int count,  	efivar_entry_iter_begin();  	found = __efivar_entry_iter(efi_pstore_erase_func, &efivar_sysfs_list, &edata, &entry); -	efivar_entry_iter_end(); -	if (found) +	if (found && !entry->scanning) { +		efivar_entry_iter_end();  		efivar_unregister(entry); +	} else +		efivar_entry_iter_end();  	return 0;  } diff --git a/drivers/firmware/efi/efivars.c b/drivers/firmware/efi/efivars.c index 933eb027d527..3dc248239197 100644 --- a/drivers/firmware/efi/efivars.c +++ b/drivers/firmware/efi/efivars.c @@ -383,12 +383,16 @@ static ssize_t efivar_delete(struct file *filp, struct kobject *kobj,  	else if (__efivar_entry_delete(entry))  		err = -EIO; -	efivar_entry_iter_end(); - -	if (err) +	if (err) { +		efivar_entry_iter_end();  		return err; +	} -	efivar_unregister(entry); +	if (!entry->scanning) { +		efivar_entry_iter_end(); +		efivar_unregister(entry); +	} else +		efivar_entry_iter_end();  	/* It's dead Jim.... */  	return count; diff --git a/drivers/firmware/efi/vars.c b/drivers/firmware/efi/vars.c index 391c67b182d9..b22659cccca4 100644 --- a/drivers/firmware/efi/vars.c +++ b/drivers/firmware/efi/vars.c @@ -683,8 +683,16 @@ struct efivar_entry *efivar_entry_find(efi_char16_t *name, efi_guid_t guid,  	if (!found)  		return NULL; -	if (remove) -		list_del(&entry->list); +	if (remove) { +		if (entry->scanning) { +			/* +			 * The entry will be deleted +			 * after scanning is completed. +			 */ +			entry->deleting = true; +		} else +			list_del(&entry->list); +	}  	return entry;  } diff --git a/drivers/gpu/drm/armada/armada_drm.h b/drivers/gpu/drm/armada/armada_drm.h index eef09ec9a5ff..a72cae03b99b 100644 --- a/drivers/gpu/drm/armada/armada_drm.h +++ b/drivers/gpu/drm/armada/armada_drm.h @@ -103,6 +103,7 @@ void armada_drm_queue_unref_work(struct drm_device *,  extern const struct drm_mode_config_funcs armada_drm_mode_config_funcs;  int armada_fbdev_init(struct drm_device *); +void armada_fbdev_lastclose(struct drm_device *);  void armada_fbdev_fini(struct drm_device *);  int armada_overlay_plane_create(struct drm_device *, unsigned long); diff --git a/drivers/gpu/drm/armada/armada_drv.c b/drivers/gpu/drm/armada/armada_drv.c index 4f2b28354915..62d0ff3efddf 100644 --- a/drivers/gpu/drm/armada/armada_drv.c +++ b/drivers/gpu/drm/armada/armada_drv.c @@ -321,6 +321,11 @@ static struct drm_ioctl_desc armada_ioctls[] = {  		DRM_UNLOCKED),  }; +static void armada_drm_lastclose(struct drm_device *dev) +{ +	armada_fbdev_lastclose(dev); +} +  static const struct file_operations armada_drm_fops = {  	.owner			= THIS_MODULE,  	.llseek			= no_llseek, @@ -337,7 +342,7 @@ static struct drm_driver armada_drm_driver = {  	.open			= NULL,  	.preclose		= NULL,  	.postclose		= NULL, -	.lastclose		= NULL, +	.lastclose		= armada_drm_lastclose,  	.unload			= armada_drm_unload,  	.get_vblank_counter	= drm_vblank_count,  	.enable_vblank		= armada_drm_enable_vblank, diff --git a/drivers/gpu/drm/armada/armada_fbdev.c b/drivers/gpu/drm/armada/armada_fbdev.c index dd5ea77dac96..948cb14c561e 100644 --- a/drivers/gpu/drm/armada/armada_fbdev.c +++ b/drivers/gpu/drm/armada/armada_fbdev.c @@ -105,9 +105,9 @@ static int armada_fb_create(struct drm_fb_helper *fbh,  	drm_fb_helper_fill_fix(info, dfb->fb.pitches[0], dfb->fb.depth);  	drm_fb_helper_fill_var(info, fbh, sizes->fb_width, sizes->fb_height); -	DRM_DEBUG_KMS("allocated %dx%d %dbpp fb: 0x%08x\n", -		dfb->fb.width, dfb->fb.height, -		dfb->fb.bits_per_pixel, obj->phys_addr); +	DRM_DEBUG_KMS("allocated %dx%d %dbpp fb: 0x%08llx\n", +		dfb->fb.width, dfb->fb.height, dfb->fb.bits_per_pixel, +		(unsigned long long)obj->phys_addr);  	return 0; @@ -177,6 +177,16 @@ int armada_fbdev_init(struct drm_device *dev)  	return ret;  } +void armada_fbdev_lastclose(struct drm_device *dev) +{ +	struct armada_private *priv = dev->dev_private; + +	drm_modeset_lock_all(dev); +	if (priv->fbdev) +		drm_fb_helper_restore_fbdev_mode(priv->fbdev); +	drm_modeset_unlock_all(dev); +} +  void armada_fbdev_fini(struct drm_device *dev)  {  	struct armada_private *priv = dev->dev_private; @@ -192,11 +202,11 @@ void armada_fbdev_fini(struct drm_device *dev)  			framebuffer_release(info);  		} +		drm_fb_helper_fini(fbh); +  		if (fbh->fb)  			fbh->fb->funcs->destroy(fbh->fb); -		drm_fb_helper_fini(fbh); -  		priv->fbdev = NULL;  	}  } diff --git a/drivers/gpu/drm/armada/armada_gem.c b/drivers/gpu/drm/armada/armada_gem.c index 9f2356bae7fd..887816f43476 100644 --- a/drivers/gpu/drm/armada/armada_gem.c +++ b/drivers/gpu/drm/armada/armada_gem.c @@ -172,8 +172,9 @@ armada_gem_linear_back(struct drm_device *dev, struct armada_gem_object *obj)  		obj->dev_addr = obj->linear->start;  	} -	DRM_DEBUG_DRIVER("obj %p phys %#x dev %#x\n", -			 obj, obj->phys_addr, obj->dev_addr); +	DRM_DEBUG_DRIVER("obj %p phys %#llx dev %#llx\n", obj, +			 (unsigned long long)obj->phys_addr, +			 (unsigned long long)obj->dev_addr);  	return 0;  } @@ -557,7 +558,6 @@ armada_gem_prime_import(struct drm_device *dev, struct dma_buf *buf)  			 * refcount on the gem object itself.  			 */  			drm_gem_object_reference(obj); -			dma_buf_put(buf);  			return obj;  		}  	} @@ -573,6 +573,7 @@ armada_gem_prime_import(struct drm_device *dev, struct dma_buf *buf)  	}  	dobj->obj.import_attach = attach; +	get_dma_buf(buf);  	/*  	 * Don't call dma_buf_map_attachment() here - it maps the diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c index f53d5246979c..66dd3a001cf1 100644 --- a/drivers/gpu/drm/drm_stub.c +++ b/drivers/gpu/drm/drm_stub.c @@ -566,11 +566,11 @@ err_unload:  	if (dev->driver->unload)  		dev->driver->unload(dev);  err_primary_node: -	drm_put_minor(dev->primary); +	drm_unplug_minor(dev->primary);  err_render_node: -	drm_put_minor(dev->render); +	drm_unplug_minor(dev->render);  err_control_node: -	drm_put_minor(dev->control); +	drm_unplug_minor(dev->control);  err_agp:  	if (dev->driver->bus->agp_destroy)  		dev->driver->bus->agp_destroy(dev); diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 0cab2d045135..5c648425c1e0 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c @@ -83,6 +83,14 @@ void i915_update_dri1_breadcrumb(struct drm_device *dev)  	drm_i915_private_t *dev_priv = dev->dev_private;  	struct drm_i915_master_private *master_priv; +	/* +	 * The dri breadcrumb update races against the drm master disappearing. +	 * Instead of trying to fix this (this is by far not the only ums issue) +	 * just don't do the update in kms mode. +	 */ +	if (drm_core_check_feature(dev, DRIVER_MODESET)) +		return; +  	if (dev->primary->master) {  		master_priv = dev->primary->master->driver_priv;  		if (master_priv->sarea_priv) @@ -1490,16 +1498,9 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)  	spin_lock_init(&dev_priv->uncore.lock);  	spin_lock_init(&dev_priv->mm.object_stat_lock);  	mutex_init(&dev_priv->dpio_lock); -	mutex_init(&dev_priv->rps.hw_lock);  	mutex_init(&dev_priv->modeset_restore_lock); -	mutex_init(&dev_priv->pc8.lock); -	dev_priv->pc8.requirements_met = false; -	dev_priv->pc8.gpu_idle = false; -	dev_priv->pc8.irqs_disabled = false; -	dev_priv->pc8.enabled = false; -	dev_priv->pc8.disable_count = 2; /* requirements_met + gpu_idle */ -	INIT_DELAYED_WORK(&dev_priv->pc8.enable_work, hsw_enable_pc8_work); +	intel_pm_setup(dev);  	intel_display_crc_init(dev); @@ -1603,7 +1604,6 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)  	}  	intel_irq_init(dev); -	intel_pm_init(dev);  	intel_uncore_sanitize(dev);  	/* Try to make sure MCHBAR is enabled before poking at it */ @@ -1848,8 +1848,10 @@ void i915_driver_lastclose(struct drm_device * dev)  void i915_driver_preclose(struct drm_device * dev, struct drm_file *file_priv)  { +	mutex_lock(&dev->struct_mutex);  	i915_gem_context_close(dev, file_priv);  	i915_gem_release(dev, file_priv); +	mutex_unlock(&dev->struct_mutex);  }  void i915_driver_postclose(struct drm_device *dev, struct drm_file *file) diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 2e367a1c6a64..5b7b7e06cb3a 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c @@ -651,6 +651,7 @@ static int __i915_drm_thaw(struct drm_device *dev, bool restore_gtt_mappings)  		intel_modeset_init_hw(dev);  		drm_modeset_lock_all(dev); +		drm_mode_config_reset(dev);  		intel_modeset_setup_hw_state(dev, true);  		drm_modeset_unlock_all(dev); diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index ccdbecca070d..90fcccba17b0 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -1755,8 +1755,13 @@ struct drm_i915_file_private {  #define IS_MOBILE(dev)		(INTEL_INFO(dev)->is_mobile)  #define IS_HSW_EARLY_SDV(dev)	(IS_HASWELL(dev) && \  				 ((dev)->pdev->device & 0xFF00) == 0x0C00) -#define IS_ULT(dev)		(IS_HASWELL(dev) && \ +#define IS_BDW_ULT(dev)		(IS_BROADWELL(dev) && \ +				 (((dev)->pdev->device & 0xf) == 0x2  || \ +				 ((dev)->pdev->device & 0xf) == 0x6 || \ +				 ((dev)->pdev->device & 0xf) == 0xe)) +#define IS_HSW_ULT(dev)		(IS_HASWELL(dev) && \  				 ((dev)->pdev->device & 0xFF00) == 0x0A00) +#define IS_ULT(dev)		(IS_HSW_ULT(dev) || IS_BDW_ULT(dev))  #define IS_HSW_GT3(dev)		(IS_HASWELL(dev) && \  				 ((dev)->pdev->device & 0x00F0) == 0x0020)  #define IS_PRELIMINARY_HW(intel_info) ((intel_info)->is_preliminary) @@ -1901,9 +1906,7 @@ void i915_queue_hangcheck(struct drm_device *dev);  void i915_handle_error(struct drm_device *dev, bool wedged);  extern void intel_irq_init(struct drm_device *dev); -extern void intel_pm_init(struct drm_device *dev);  extern void intel_hpd_init(struct drm_device *dev); -extern void intel_pm_init(struct drm_device *dev);  extern void intel_uncore_sanitize(struct drm_device *dev);  extern void intel_uncore_early_sanitize(struct drm_device *dev); diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c index 72a3df32292f..b0f42b9ca037 100644 --- a/drivers/gpu/drm/i915/i915_gem_context.c +++ b/drivers/gpu/drm/i915/i915_gem_context.c @@ -347,10 +347,8 @@ void i915_gem_context_close(struct drm_device *dev, struct drm_file *file)  {  	struct drm_i915_file_private *file_priv = file->driver_priv; -	mutex_lock(&dev->struct_mutex);  	idr_for_each(&file_priv->context_idr, context_idr_cleanup, NULL);  	idr_destroy(&file_priv->context_idr); -	mutex_unlock(&dev->struct_mutex);  }  static struct i915_hw_context * @@ -423,11 +421,21 @@ static int do_switch(struct i915_hw_context *to)  	if (ret)  		return ret; -	/* Clear this page out of any CPU caches for coherent swap-in/out. Note +	/* +	 * Pin can switch back to the default context if we end up calling into +	 * evict_everything - as a last ditch gtt defrag effort that also +	 * switches to the default context. Hence we need to reload from here. +	 */ +	from = ring->last_context; + +	/* +	 * Clear this page out of any CPU caches for coherent swap-in/out. Note  	 * that thanks to write = false in this call and us not setting any gpu  	 * write domains when putting a context object onto the active list  	 * (when switching away from it), this won't block. -	 * XXX: We need a real interface to do this instead of trickery. */ +	 * +	 * XXX: We need a real interface to do this instead of trickery. +	 */  	ret = i915_gem_object_set_to_gtt_domain(to->obj, false);  	if (ret) {  		i915_gem_object_unpin(to->obj); diff --git a/drivers/gpu/drm/i915/i915_gem_evict.c b/drivers/gpu/drm/i915/i915_gem_evict.c index b7376533633d..8f3adc7d0dc8 100644 --- a/drivers/gpu/drm/i915/i915_gem_evict.c +++ b/drivers/gpu/drm/i915/i915_gem_evict.c @@ -88,6 +88,7 @@ i915_gem_evict_something(struct drm_device *dev, struct i915_address_space *vm,  	} else  		drm_mm_init_scan(&vm->mm, min_size, alignment, cache_level); +search_again:  	/* First see if there is a large enough contiguous idle region... */  	list_for_each_entry(vma, &vm->inactive_list, mm_list) {  		if (mark_free(vma, &unwind_list)) @@ -115,10 +116,17 @@ none:  		list_del_init(&vma->exec_list);  	} -	/* We expect the caller to unpin, evict all and try again, or give up. -	 * So calling i915_gem_evict_vm() is unnecessary. +	/* Can we unpin some objects such as idle hw contents, +	 * or pending flips?  	 */ -	return -ENOSPC; +	ret = nonblocking ? -ENOSPC : i915_gpu_idle(dev); +	if (ret) +		return ret; + +	/* Only idle the GPU and repeat the search once */ +	i915_gem_retire_requests(dev); +	nonblocking = true; +	goto search_again;  found:  	/* drm_mm doesn't allow any other other operations while diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c index 38cb8d44a013..c79dd2b1f70e 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c @@ -337,8 +337,8 @@ static void gen8_ppgtt_cleanup(struct i915_address_space *vm)  		kfree(ppgtt->gen8_pt_dma_addr[i]);  	} -	__free_pages(ppgtt->gen8_pt_pages, ppgtt->num_pt_pages << PAGE_SHIFT); -	__free_pages(ppgtt->pd_pages, ppgtt->num_pd_pages << PAGE_SHIFT); +	__free_pages(ppgtt->gen8_pt_pages, get_order(ppgtt->num_pt_pages << PAGE_SHIFT)); +	__free_pages(ppgtt->pd_pages, get_order(ppgtt->num_pd_pages << PAGE_SHIFT));  }  /** @@ -1241,6 +1241,11 @@ static inline unsigned int gen8_get_total_gtt_size(u16 bdw_gmch_ctl)  	bdw_gmch_ctl &= BDW_GMCH_GGMS_MASK;  	if (bdw_gmch_ctl)  		bdw_gmch_ctl = 1 << bdw_gmch_ctl; +	if (bdw_gmch_ctl > 4) { +		WARN_ON(!i915_preliminary_hw_support); +		return 4<<20; +	} +  	return bdw_gmch_ctl << 20;  } diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 080f6fd4e839..8b8bde7dce53 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -9135,7 +9135,7 @@ intel_pipe_config_compare(struct drm_device *dev,  	if (IS_G4X(dev) || INTEL_INFO(dev)->gen >= 5)  		PIPE_CONF_CHECK_I(pipe_bpp); -	if (!IS_HASWELL(dev)) { +	if (!HAS_DDI(dev)) {  		PIPE_CONF_CHECK_CLOCK_FUZZY(adjusted_mode.crtc_clock);  		PIPE_CONF_CHECK_CLOCK_FUZZY(port_clock);  	} @@ -11036,8 +11036,6 @@ void intel_modeset_setup_hw_state(struct drm_device *dev,  	}  	intel_modeset_check_state(dev); - -	drm_mode_config_reset(dev);  }  void intel_modeset_gem_init(struct drm_device *dev) @@ -11046,7 +11044,10 @@ void intel_modeset_gem_init(struct drm_device *dev)  	intel_setup_overlay(dev); +	drm_modeset_lock_all(dev); +	drm_mode_config_reset(dev);  	intel_modeset_setup_hw_state(dev, false); +	drm_modeset_unlock_all(dev);  }  void intel_modeset_cleanup(struct drm_device *dev) diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index a18e88b3e425..79f91f26e288 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h @@ -821,6 +821,7 @@ void intel_update_sprite_watermarks(struct drm_plane *plane,  				    uint32_t sprite_width, int pixel_size,  				    bool enabled, bool scaled);  void intel_init_pm(struct drm_device *dev); +void intel_pm_setup(struct drm_device *dev);  bool intel_fbc_enabled(struct drm_device *dev);  void intel_update_fbc(struct drm_device *dev);  void intel_gpu_ips_init(struct drm_i915_private *dev_priv); diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c index f161ac02c4f6..e6f782d1c669 100644 --- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c @@ -451,7 +451,9 @@ static u32 intel_panel_get_backlight(struct drm_device *dev,  	spin_lock_irqsave(&dev_priv->backlight.lock, flags); -	if (HAS_PCH_SPLIT(dev)) { +	if (IS_BROADWELL(dev)) { +		val = I915_READ(BLC_PWM_PCH_CTL2) & BACKLIGHT_DUTY_CYCLE_MASK; +	} else if (HAS_PCH_SPLIT(dev)) {  		val = I915_READ(BLC_PWM_CPU_CTL) & BACKLIGHT_DUTY_CYCLE_MASK;  	} else {  		if (IS_VALLEYVIEW(dev)) @@ -479,6 +481,13 @@ static u32 intel_panel_get_backlight(struct drm_device *dev,  	return val;  } +static void intel_bdw_panel_set_backlight(struct drm_device *dev, u32 level) +{ +	struct drm_i915_private *dev_priv = dev->dev_private; +	u32 val = I915_READ(BLC_PWM_PCH_CTL2) & ~BACKLIGHT_DUTY_CYCLE_MASK; +	I915_WRITE(BLC_PWM_PCH_CTL2, val | level); +} +  static void intel_pch_panel_set_backlight(struct drm_device *dev, u32 level)  {  	struct drm_i915_private *dev_priv = dev->dev_private; @@ -496,7 +505,9 @@ static void intel_panel_actually_set_backlight(struct drm_device *dev,  	DRM_DEBUG_DRIVER("set backlight PWM = %d\n", level);  	level = intel_panel_compute_brightness(dev, pipe, level); -	if (HAS_PCH_SPLIT(dev)) +	if (IS_BROADWELL(dev)) +		return intel_bdw_panel_set_backlight(dev, level); +	else if (HAS_PCH_SPLIT(dev))  		return intel_pch_panel_set_backlight(dev, level);  	if (is_backlight_combination_mode(dev)) { @@ -666,7 +677,16 @@ void intel_panel_enable_backlight(struct intel_connector *connector)  		POSTING_READ(reg);  		I915_WRITE(reg, tmp | BLM_PWM_ENABLE); -		if (HAS_PCH_SPLIT(dev) && +		if (IS_BROADWELL(dev)) { +			/* +			 * Broadwell requires PCH override to drive the PCH +			 * backlight pin. The above will configure the CPU +			 * backlight pin, which we don't plan to use. +			 */ +			tmp = I915_READ(BLC_PWM_PCH_CTL1); +			tmp |= BLM_PCH_OVERRIDE_ENABLE | BLM_PCH_PWM_ENABLE; +			I915_WRITE(BLC_PWM_PCH_CTL1, tmp); +		} else if (HAS_PCH_SPLIT(dev) &&  		    !(dev_priv->quirks & QUIRK_NO_PCH_PWM_ENABLE)) {  			tmp = I915_READ(BLC_PWM_PCH_CTL1);  			tmp |= BLM_PCH_PWM_ENABLE; diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 6e0d5e075b15..3657ab43c8fd 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c @@ -5685,6 +5685,7 @@ static void __intel_set_power_well(struct drm_device *dev, bool enable)  {  	struct drm_i915_private *dev_priv = dev->dev_private;  	bool is_enabled, enable_requested; +	unsigned long irqflags;  	uint32_t tmp;  	tmp = I915_READ(HSW_PWR_WELL_DRIVER); @@ -5702,9 +5703,24 @@ static void __intel_set_power_well(struct drm_device *dev, bool enable)  				      HSW_PWR_WELL_STATE_ENABLED), 20))  				DRM_ERROR("Timeout enabling power well\n");  		} + +		if (IS_BROADWELL(dev)) { +			spin_lock_irqsave(&dev_priv->irq_lock, irqflags); +			I915_WRITE(GEN8_DE_PIPE_IMR(PIPE_B), +				   dev_priv->de_irq_mask[PIPE_B]); +			I915_WRITE(GEN8_DE_PIPE_IER(PIPE_B), +				   ~dev_priv->de_irq_mask[PIPE_B] | +				   GEN8_PIPE_VBLANK); +			I915_WRITE(GEN8_DE_PIPE_IMR(PIPE_C), +				   dev_priv->de_irq_mask[PIPE_C]); +			I915_WRITE(GEN8_DE_PIPE_IER(PIPE_C), +				   ~dev_priv->de_irq_mask[PIPE_C] | +				   GEN8_PIPE_VBLANK); +			POSTING_READ(GEN8_DE_PIPE_IER(PIPE_C)); +			spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); +		}  	} else {  		if (enable_requested) { -			unsigned long irqflags;  			enum pipe p;  			I915_WRITE(HSW_PWR_WELL_DRIVER, 0); @@ -6130,10 +6146,19 @@ int vlv_freq_opcode(int ddr_freq, int val)  	return val;  } -void intel_pm_init(struct drm_device *dev) +void intel_pm_setup(struct drm_device *dev)  {  	struct drm_i915_private *dev_priv = dev->dev_private; +	mutex_init(&dev_priv->rps.hw_lock); + +	mutex_init(&dev_priv->pc8.lock); +	dev_priv->pc8.requirements_met = false; +	dev_priv->pc8.gpu_idle = false; +	dev_priv->pc8.irqs_disabled = false; +	dev_priv->pc8.enabled = false; +	dev_priv->pc8.disable_count = 2; /* requirements_met + gpu_idle */ +	INIT_DELAYED_WORK(&dev_priv->pc8.enable_work, hsw_enable_pc8_work);  	INIT_DELAYED_WORK(&dev_priv->rps.delayed_resume_work,  			  intel_gen6_powersave_work);  } diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index b620337e6d67..c2f09d456300 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c @@ -965,6 +965,7 @@ void intel_ring_setup_status_page(struct intel_ring_buffer *ring)  	} else if (IS_GEN6(ring->dev)) {  		mmio = RING_HWS_PGA_GEN6(ring->mmio_base);  	} else { +		/* XXX: gen8 returns to sanity */  		mmio = RING_HWS_PGA(ring->mmio_base);  	} diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c index 0b02078a0b84..25cbe073c388 100644 --- a/drivers/gpu/drm/i915/intel_uncore.c +++ b/drivers/gpu/drm/i915/intel_uncore.c @@ -784,6 +784,7 @@ static int gen6_do_reset(struct drm_device *dev)  int intel_gpu_reset(struct drm_device *dev)  {  	switch (INTEL_INFO(dev)->gen) { +	case 8:  	case 7:  	case 6: return gen6_do_reset(dev);  	case 5: return ironlake_do_reset(dev); diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c index 7a3759f1c41a..98a22e6e27a1 100644 --- a/drivers/gpu/drm/nouveau/nouveau_drm.c +++ b/drivers/gpu/drm/nouveau/nouveau_drm.c @@ -858,6 +858,12 @@ static int nouveau_pmops_runtime_suspend(struct device *dev)  	if (nouveau_runtime_pm == 0)  		return -EINVAL; +	/* are we optimus enabled? */ +	if (nouveau_runtime_pm == -1 && !nouveau_is_optimus() && !nouveau_is_v1_dsm()) { +		DRM_DEBUG_DRIVER("failing to power off - not optimus\n"); +		return -EINVAL; +	} +  	nv_debug_level(SILENT);  	drm_kms_helper_poll_disable(drm_dev);  	vga_switcheroo_set_dynamic_switch(pdev, VGA_SWITCHEROO_OFF); diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index 80a20120e625..b1970596a782 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c @@ -1196,7 +1196,9 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,  	} else if ((rdev->family == CHIP_TAHITI) ||  		   (rdev->family == CHIP_PITCAIRN))  		fb_format |= SI_GRPH_PIPE_CONFIG(SI_ADDR_SURF_P8_32x32_8x16); -	else if (rdev->family == CHIP_VERDE) +	else if ((rdev->family == CHIP_VERDE) || +		 (rdev->family == CHIP_OLAND) || +		 (rdev->family == CHIP_HAINAN)) /* for completeness.  HAINAN has no display hw */  		fb_format |= SI_GRPH_PIPE_CONFIG(SI_ADDR_SURF_P4_8x16);  	switch (radeon_crtc->crtc_id) { diff --git a/drivers/gpu/drm/radeon/cik_sdma.c b/drivers/gpu/drm/radeon/cik_sdma.c index 0300727a4f70..d08b83c6267b 100644 --- a/drivers/gpu/drm/radeon/cik_sdma.c +++ b/drivers/gpu/drm/radeon/cik_sdma.c @@ -458,7 +458,7 @@ int cik_copy_dma(struct radeon_device *rdev,  		radeon_ring_write(ring, 0); /* src/dst endian swap */  		radeon_ring_write(ring, src_offset & 0xffffffff);  		radeon_ring_write(ring, upper_32_bits(src_offset) & 0xffffffff); -		radeon_ring_write(ring, dst_offset & 0xfffffffc); +		radeon_ring_write(ring, dst_offset & 0xffffffff);  		radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xffffffff);  		src_offset += cur_size_in_bytes;  		dst_offset += cur_size_in_bytes; diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c index e354ce94cdd1..c0425bb6223a 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.c +++ b/drivers/gpu/drm/radeon/radeon_asic.c @@ -2021,7 +2021,7 @@ static struct radeon_asic ci_asic = {  		.hdmi_setmode = &evergreen_hdmi_setmode,  	},  	.copy = { -		.blit = NULL, +		.blit = &cik_copy_cpdma,  		.blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,  		.dma = &cik_copy_dma,  		.dma_ring_index = R600_RING_TYPE_DMA_INDEX, @@ -2122,7 +2122,7 @@ static struct radeon_asic kv_asic = {  		.hdmi_setmode = &evergreen_hdmi_setmode,  	},  	.copy = { -		.blit = NULL, +		.blit = &cik_copy_cpdma,  		.blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,  		.dma = &cik_copy_dma,  		.dma_ring_index = R600_RING_TYPE_DMA_INDEX, diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c index 9f5ff28864f6..1958b36ad0e5 100644 --- a/drivers/gpu/drm/radeon/radeon_drv.c +++ b/drivers/gpu/drm/radeon/radeon_drv.c @@ -508,15 +508,6 @@ static const struct file_operations radeon_driver_kms_fops = {  #endif  }; - -static void -radeon_pci_shutdown(struct pci_dev *pdev) -{ -	struct drm_device *dev = pci_get_drvdata(pdev); - -	radeon_driver_unload_kms(dev); -} -  static struct drm_driver kms_driver = {  	.driver_features =  	    DRIVER_USE_AGP | @@ -586,7 +577,6 @@ static struct pci_driver radeon_kms_pci_driver = {  	.probe = radeon_pci_probe,  	.remove = radeon_pci_remove,  	.driver.pm = &radeon_pm_ops, -	.shutdown = radeon_pci_shutdown,  };  static int __init radeon_init(void) diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index dc75bb603ea5..984097b907ef 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c @@ -552,8 +552,7 @@ static ssize_t radeon_hwmon_show_temp_thresh(struct device *dev,  					     struct device_attribute *attr,  					     char *buf)  { -	struct drm_device *ddev = dev_get_drvdata(dev); -	struct radeon_device *rdev = ddev->dev_private; +	struct radeon_device *rdev = dev_get_drvdata(dev);  	int hyst = to_sensor_dev_attr(attr)->index;  	int temp; @@ -580,8 +579,7 @@ static umode_t hwmon_attributes_visible(struct kobject *kobj,  					struct attribute *attr, int index)  {  	struct device *dev = container_of(kobj, struct device, kobj); -	struct drm_device *ddev = dev_get_drvdata(dev); -	struct radeon_device *rdev = ddev->dev_private; +	struct radeon_device *rdev = dev_get_drvdata(dev);  	/* Skip limit attributes if DPM is not enabled */  	if (rdev->pm.pm_method != PM_METHOD_DPM && diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c index 1c560629575a..e7dab069cccf 100644 --- a/drivers/gpu/drm/radeon/rs690.c +++ b/drivers/gpu/drm/radeon/rs690.c @@ -162,6 +162,16 @@ static void rs690_mc_init(struct radeon_device *rdev)  	base = RREG32_MC(R_000100_MCCFG_FB_LOCATION);  	base = G_000100_MC_FB_START(base) << 16;  	rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); +	/* Some boards seem to be configured for 128MB of sideport memory, +	 * but really only have 64MB.  Just skip the sideport and use +	 * UMA memory. +	 */ +	if (rdev->mc.igp_sideport_enabled && +	    (rdev->mc.real_vram_size == (384 * 1024 * 1024))) { +		base += 128 * 1024 * 1024; +		rdev->mc.real_vram_size -= 128 * 1024 * 1024; +		rdev->mc.mc_vram_size = rdev->mc.real_vram_size; +	}  	/* Use K8 direct mapping for fast fb access. */   	rdev->fastfb_working = false; diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c index a51f48e3e917..45d5b5ab6ca9 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c @@ -68,6 +68,9 @@ int vmw_getparam_ioctl(struct drm_device *dev, void *data,  				  SVGA_FIFO_3D_HWVERSION));  		break;  	} +	case DRM_VMW_PARAM_MAX_SURF_MEMORY: +		param->value = dev_priv->memory_size; +		break;  	default:  		DRM_ERROR("Illegal vmwgfx get param request: %d\n",  			  param->param); diff --git a/drivers/hid/hid-sensor-hub.c b/drivers/hid/hid-sensor-hub.c index a184e1921c11..d87f7cb4bee5 100644 --- a/drivers/hid/hid-sensor-hub.c +++ b/drivers/hid/hid-sensor-hub.c @@ -112,13 +112,15 @@ static int sensor_hub_get_physical_device_count(  static void sensor_hub_fill_attr_info(  		struct hid_sensor_hub_attribute_info *info, -		s32 index, s32 report_id, s32 units, s32 unit_expo, s32 size) +		s32 index, s32 report_id, struct hid_field *field)  {  	info->index = index;  	info->report_id = report_id; -	info->units = units; -	info->unit_expo = unit_expo; -	info->size = size/8; +	info->units = field->unit; +	info->unit_expo = field->unit_exponent; +	info->size = (field->report_size * field->report_count)/8; +	info->logical_minimum = field->logical_minimum; +	info->logical_maximum = field->logical_maximum;  }  static struct hid_sensor_hub_callbacks *sensor_hub_get_callback( @@ -325,9 +327,7 @@ int sensor_hub_input_get_attribute_info(struct hid_sensor_hub_device *hsdev,  			if (field->physical == usage_id &&  				field->logical == attr_usage_id) {  				sensor_hub_fill_attr_info(info, i, report->id, -					field->unit, field->unit_exponent, -					field->report_size * -							field->report_count); +							  field);  				ret = 0;  			} else {  				for (j = 0; j < field->maxusage; ++j) { @@ -336,11 +336,7 @@ int sensor_hub_input_get_attribute_info(struct hid_sensor_hub_device *hsdev,  					field->usage[j].collection_index ==  					collection_index) {  						sensor_hub_fill_attr_info(info, -							i, report->id, -							field->unit, -							field->unit_exponent, -							field->report_size * -							field->report_count); +							  i, report->id, field);  						ret = 0;  						break;  					} diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c index cbd4e9abc47e..92d1206482a6 100644 --- a/drivers/idle/intel_idle.c +++ b/drivers/idle/intel_idle.c @@ -329,7 +329,7 @@ static struct cpuidle_state atom_cstates[] __initdata = {  	{  		.enter = NULL }  }; -static struct cpuidle_state avn_cstates[CPUIDLE_STATE_MAX] = { +static struct cpuidle_state avn_cstates[] __initdata = {  	{  		.name = "C1-AVN",  		.desc = "MWAIT 0x00", @@ -340,7 +340,7 @@ static struct cpuidle_state avn_cstates[CPUIDLE_STATE_MAX] = {  	{  		.name = "C6-AVN",  		.desc = "MWAIT 0x51", -		.flags = MWAIT2flg(0x58) | CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED, +		.flags = MWAIT2flg(0x51) | CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED,  		.exit_latency = 15,  		.target_residency = 45,  		.enter = &intel_idle }, diff --git a/drivers/iio/common/hid-sensors/Kconfig b/drivers/iio/common/hid-sensors/Kconfig index 1178121b55b0..39188b72cd3b 100644 --- a/drivers/iio/common/hid-sensors/Kconfig +++ b/drivers/iio/common/hid-sensors/Kconfig @@ -25,13 +25,4 @@ config HID_SENSOR_IIO_TRIGGER  	  If this driver is compiled as a module, it will be named  	  hid-sensor-trigger. -config HID_SENSOR_ENUM_BASE_QUIRKS -	bool "ENUM base quirks for HID Sensor IIO drivers" -	depends on HID_SENSOR_IIO_COMMON -	help -	  Say yes here to build support for sensor hub FW using -	  enumeration, which is using 1 as base instead of 0. -	  Since logical minimum is still set 0 instead of 1, -	  there is no easy way to differentiate. -  endmenu diff --git a/drivers/iio/common/hid-sensors/hid-sensor-trigger.c b/drivers/iio/common/hid-sensors/hid-sensor-trigger.c index bbd6426c9726..7dcf83998e6f 100644 --- a/drivers/iio/common/hid-sensors/hid-sensor-trigger.c +++ b/drivers/iio/common/hid-sensors/hid-sensor-trigger.c @@ -33,24 +33,34 @@ static int hid_sensor_data_rdy_trigger_set_state(struct iio_trigger *trig,  {  	struct hid_sensor_common *st = iio_trigger_get_drvdata(trig);  	int state_val; +	int report_val;  	if (state) {  		if (sensor_hub_device_open(st->hsdev))  			return -EIO; -	} else +		state_val = +		HID_USAGE_SENSOR_PROP_POWER_STATE_D0_FULL_POWER_ENUM; +		report_val = +		HID_USAGE_SENSOR_PROP_REPORTING_STATE_ALL_EVENTS_ENUM; + +	} else {  		sensor_hub_device_close(st->hsdev); +		state_val = +		HID_USAGE_SENSOR_PROP_POWER_STATE_D4_POWER_OFF_ENUM; +		report_val = +		HID_USAGE_SENSOR_PROP_REPORTING_STATE_NO_EVENTS_ENUM; +	} -	state_val = state ? 1 : 0; -	if (IS_ENABLED(CONFIG_HID_SENSOR_ENUM_BASE_QUIRKS)) -		++state_val;  	st->data_ready = state; +	state_val += st->power_state.logical_minimum; +	report_val += st->report_state.logical_minimum;  	sensor_hub_set_feature(st->hsdev, st->power_state.report_id,  					st->power_state.index,  					(s32)state_val);  	sensor_hub_set_feature(st->hsdev, st->report_state.report_id,  					st->report_state.index, -					(s32)state_val); +					(s32)report_val);  	return 0;  } diff --git a/drivers/iio/light/Kconfig b/drivers/iio/light/Kconfig index b0d65df3ede2..a022f27c6690 100644 --- a/drivers/iio/light/Kconfig +++ b/drivers/iio/light/Kconfig @@ -43,6 +43,7 @@ config GP2AP020A00F  	depends on I2C  	select IIO_BUFFER  	select IIO_TRIGGERED_BUFFER +	select IRQ_WORK  	help  	  Say Y here if you have a Sharp GP2AP020A00F proximity/ALS combo-chip  	  hooked to an I2C bus. diff --git a/drivers/input/keyboard/adp5588-keys.c b/drivers/input/keyboard/adp5588-keys.c index dbd2047f1641..3ed23513d881 100644 --- a/drivers/input/keyboard/adp5588-keys.c +++ b/drivers/input/keyboard/adp5588-keys.c @@ -536,7 +536,8 @@ static int adp5588_probe(struct i2c_client *client,  		__set_bit(EV_REP, input->evbit);  	for (i = 0; i < input->keycodemax; i++) -		__set_bit(kpad->keycode[i] & KEY_MAX, input->keybit); +		if (kpad->keycode[i] <= KEY_MAX) +			__set_bit(kpad->keycode[i], input->keybit);  	__clear_bit(KEY_RESERVED, input->keybit);  	if (kpad->gpimapsize) diff --git a/drivers/input/keyboard/adp5589-keys.c b/drivers/input/keyboard/adp5589-keys.c index 67d12b3427c9..60dafd4fa692 100644 --- a/drivers/input/keyboard/adp5589-keys.c +++ b/drivers/input/keyboard/adp5589-keys.c @@ -992,7 +992,8 @@ static int adp5589_probe(struct i2c_client *client,  		__set_bit(EV_REP, input->evbit);  	for (i = 0; i < input->keycodemax; i++) -		__set_bit(kpad->keycode[i] & KEY_MAX, input->keybit); +		if (kpad->keycode[i] <= KEY_MAX) +			__set_bit(kpad->keycode[i], input->keybit);  	__clear_bit(KEY_RESERVED, input->keybit);  	if (kpad->gpimapsize) diff --git a/drivers/input/keyboard/bf54x-keys.c b/drivers/input/keyboard/bf54x-keys.c index fc88fb48d70d..09b91d093087 100644 --- a/drivers/input/keyboard/bf54x-keys.c +++ b/drivers/input/keyboard/bf54x-keys.c @@ -289,7 +289,8 @@ static int bfin_kpad_probe(struct platform_device *pdev)  		__set_bit(EV_REP, input->evbit);  	for (i = 0; i < input->keycodemax; i++) -		__set_bit(bf54x_kpad->keycode[i] & KEY_MAX, input->keybit); +		if (bf54x_kpad->keycode[i] <= KEY_MAX) +			__set_bit(bf54x_kpad->keycode[i], input->keybit);  	__clear_bit(KEY_RESERVED, input->keybit);  	error = input_register_device(input); diff --git a/drivers/input/misc/pcf8574_keypad.c b/drivers/input/misc/pcf8574_keypad.c index e37392976fdd..0deca5a3c87f 100644 --- a/drivers/input/misc/pcf8574_keypad.c +++ b/drivers/input/misc/pcf8574_keypad.c @@ -113,9 +113,12 @@ static int pcf8574_kp_probe(struct i2c_client *client, const struct i2c_device_i  	idev->keycodemax = ARRAY_SIZE(lp->btncode);  	for (i = 0; i < ARRAY_SIZE(pcf8574_kp_btncode); i++) { -		lp->btncode[i] = pcf8574_kp_btncode[i]; -		__set_bit(lp->btncode[i] & KEY_MAX, idev->keybit); +		if (lp->btncode[i] <= KEY_MAX) { +			lp->btncode[i] = pcf8574_kp_btncode[i]; +			__set_bit(lp->btncode[i], idev->keybit); +		}  	} +	__clear_bit(KEY_RESERVED, idev->keybit);  	sprintf(lp->name, DRV_NAME);  	sprintf(lp->phys, "kp_data/input0"); diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c index ca7a26f1dce8..5cf62e315218 100644 --- a/drivers/input/mouse/alps.c +++ b/drivers/input/mouse/alps.c @@ -70,6 +70,25 @@ static const struct alps_nibble_commands alps_v4_nibble_commands[] = {  	{ PSMOUSE_CMD_SETSCALE11,	0x00 }, /* f */  }; +static const struct alps_nibble_commands alps_v6_nibble_commands[] = { +	{ PSMOUSE_CMD_ENABLE,		0x00 }, /* 0 */ +	{ PSMOUSE_CMD_SETRATE,		0x0a }, /* 1 */ +	{ PSMOUSE_CMD_SETRATE,		0x14 }, /* 2 */ +	{ PSMOUSE_CMD_SETRATE,		0x28 }, /* 3 */ +	{ PSMOUSE_CMD_SETRATE,		0x3c }, /* 4 */ +	{ PSMOUSE_CMD_SETRATE,		0x50 }, /* 5 */ +	{ PSMOUSE_CMD_SETRATE,		0x64 }, /* 6 */ +	{ PSMOUSE_CMD_SETRATE,		0xc8 }, /* 7 */ +	{ PSMOUSE_CMD_GETID,		0x00 }, /* 8 */ +	{ PSMOUSE_CMD_GETINFO,		0x00 }, /* 9 */ +	{ PSMOUSE_CMD_SETRES,		0x00 }, /* a */ +	{ PSMOUSE_CMD_SETRES,		0x01 }, /* b */ +	{ PSMOUSE_CMD_SETRES,		0x02 }, /* c */ +	{ PSMOUSE_CMD_SETRES,		0x03 }, /* d */ +	{ PSMOUSE_CMD_SETSCALE21,	0x00 }, /* e */ +	{ PSMOUSE_CMD_SETSCALE11,	0x00 }, /* f */ +}; +  #define ALPS_DUALPOINT		0x02	/* touchpad has trackstick */  #define ALPS_PASS		0x04	/* device has a pass-through port */ @@ -103,6 +122,7 @@ static const struct alps_model_info alps_model_data[] = {  	/* Dell Latitude E5500, E6400, E6500, Precision M4400 */  	{ { 0x62, 0x02, 0x14 }, 0x00, ALPS_PROTO_V2, 0xcf, 0xcf,  		ALPS_PASS | ALPS_DUALPOINT | ALPS_PS2_INTERLEAVED }, +	{ { 0x73, 0x00, 0x14 }, 0x00, ALPS_PROTO_V6, 0xff, 0xff, ALPS_DUALPOINT },		/* Dell XT2 */  	{ { 0x73, 0x02, 0x50 }, 0x00, ALPS_PROTO_V2, 0xcf, 0xcf, ALPS_FOUR_BUTTONS },		/* Dell Vostro 1400 */  	{ { 0x52, 0x01, 0x14 }, 0x00, ALPS_PROTO_V2, 0xff, 0xff,  		ALPS_PASS | ALPS_DUALPOINT | ALPS_PS2_INTERLEAVED },				/* Toshiba Tecra A11-11L */ @@ -645,6 +665,76 @@ static void alps_process_packet_v3(struct psmouse *psmouse)  	alps_process_touchpad_packet_v3(psmouse);  } +static void alps_process_packet_v6(struct psmouse *psmouse) +{ +	struct alps_data *priv = psmouse->private; +	unsigned char *packet = psmouse->packet; +	struct input_dev *dev = psmouse->dev; +	struct input_dev *dev2 = priv->dev2; +	int x, y, z, left, right, middle; + +	/* +	 * We can use Byte5 to distinguish if the packet is from Touchpad +	 * or Trackpoint. +	 * Touchpad:	0 - 0x7E +	 * Trackpoint:	0x7F +	 */ +	if (packet[5] == 0x7F) { +		/* It should be a DualPoint when received Trackpoint packet */ +		if (!(priv->flags & ALPS_DUALPOINT)) +			return; + +		/* Trackpoint packet */ +		x = packet[1] | ((packet[3] & 0x20) << 2); +		y = packet[2] | ((packet[3] & 0x40) << 1); +		z = packet[4]; +		left = packet[3] & 0x01; +		right = packet[3] & 0x02; +		middle = packet[3] & 0x04; + +		/* To prevent the cursor jump when finger lifted */ +		if (x == 0x7F && y == 0x7F && z == 0x7F) +			x = y = z = 0; + +		/* Divide 4 since trackpoint's speed is too fast */ +		input_report_rel(dev2, REL_X, (char)x / 4); +		input_report_rel(dev2, REL_Y, -((char)y / 4)); + +		input_report_key(dev2, BTN_LEFT, left); +		input_report_key(dev2, BTN_RIGHT, right); +		input_report_key(dev2, BTN_MIDDLE, middle); + +		input_sync(dev2); +		return; +	} + +	/* Touchpad packet */ +	x = packet[1] | ((packet[3] & 0x78) << 4); +	y = packet[2] | ((packet[4] & 0x78) << 4); +	z = packet[5]; +	left = packet[3] & 0x01; +	right = packet[3] & 0x02; + +	if (z > 30) +		input_report_key(dev, BTN_TOUCH, 1); +	if (z < 25) +		input_report_key(dev, BTN_TOUCH, 0); + +	if (z > 0) { +		input_report_abs(dev, ABS_X, x); +		input_report_abs(dev, ABS_Y, y); +	} + +	input_report_abs(dev, ABS_PRESSURE, z); +	input_report_key(dev, BTN_TOOL_FINGER, z > 0); + +	/* v6 touchpad does not have middle button */ +	input_report_key(dev, BTN_LEFT, left); +	input_report_key(dev, BTN_RIGHT, right); + +	input_sync(dev); +} +  static void alps_process_packet_v4(struct psmouse *psmouse)  {  	struct alps_data *priv = psmouse->private; @@ -897,7 +987,7 @@ static psmouse_ret_t alps_process_byte(struct psmouse *psmouse)  	}  	/* Bytes 2 - pktsize should have 0 in the highest bit */ -	if (priv->proto_version != ALPS_PROTO_V5 && +	if ((priv->proto_version < ALPS_PROTO_V5) &&  	    psmouse->pktcnt >= 2 && psmouse->pktcnt <= psmouse->pktsize &&  	    (psmouse->packet[psmouse->pktcnt - 1] & 0x80)) {  		psmouse_dbg(psmouse, "refusing packet[%i] = %x\n", @@ -1085,6 +1175,80 @@ static int alps_absolute_mode_v1_v2(struct psmouse *psmouse)  	return ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETPOLL);  } +static int alps_monitor_mode_send_word(struct psmouse *psmouse, u16 word) +{ +	int i, nibble; + +	/* +	 * b0-b11 are valid bits, send sequence is inverse. +	 * e.g. when word = 0x0123, nibble send sequence is 3, 2, 1 +	 */ +	for (i = 0; i <= 8; i += 4) { +		nibble = (word >> i) & 0xf; +		if (alps_command_mode_send_nibble(psmouse, nibble)) +			return -1; +	} + +	return 0; +} + +static int alps_monitor_mode_write_reg(struct psmouse *psmouse, +				       u16 addr, u16 value) +{ +	struct ps2dev *ps2dev = &psmouse->ps2dev; + +	/* 0x0A0 is the command to write the word */ +	if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_ENABLE) || +	    alps_monitor_mode_send_word(psmouse, 0x0A0) || +	    alps_monitor_mode_send_word(psmouse, addr) || +	    alps_monitor_mode_send_word(psmouse, value) || +	    ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE)) +		return -1; + +	return 0; +} + +static int alps_monitor_mode(struct psmouse *psmouse, bool enable) +{ +	struct ps2dev *ps2dev = &psmouse->ps2dev; + +	if (enable) { +		/* EC E9 F5 F5 E7 E6 E7 E9 to enter monitor mode */ +		if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_RESET_WRAP) || +		    ps2_command(ps2dev, NULL, PSMOUSE_CMD_GETINFO) || +		    ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) || +		    ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) || +		    ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE21) || +		    ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) || +		    ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE21) || +		    ps2_command(ps2dev, NULL, PSMOUSE_CMD_GETINFO)) +			return -1; +	} else { +		/* EC to exit monitor mode */ +		if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_RESET_WRAP)) +			return -1; +	} + +	return 0; +} + +static int alps_absolute_mode_v6(struct psmouse *psmouse) +{ +	u16 reg_val = 0x181; +	int ret = -1; + +	/* enter monitor mode, to write the register */ +	if (alps_monitor_mode(psmouse, true)) +		return -1; + +	ret = alps_monitor_mode_write_reg(psmouse, 0x000, reg_val); + +	if (alps_monitor_mode(psmouse, false)) +		ret = -1; + +	return ret; +} +  static int alps_get_status(struct psmouse *psmouse, char *param)  {  	/* Get status: 0xF5 0xF5 0xF5 0xE9 */ @@ -1189,6 +1353,32 @@ static int alps_hw_init_v1_v2(struct psmouse *psmouse)  	return 0;  } +static int alps_hw_init_v6(struct psmouse *psmouse) +{ +	unsigned char param[2] = {0xC8, 0x14}; + +	/* Enter passthrough mode to let trackpoint enter 6byte raw mode */ +	if (alps_passthrough_mode_v2(psmouse, true)) +		return -1; + +	if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) || +	    ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) || +	    ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) || +	    ps2_command(&psmouse->ps2dev, ¶m[0], PSMOUSE_CMD_SETRATE) || +	    ps2_command(&psmouse->ps2dev, ¶m[1], PSMOUSE_CMD_SETRATE)) +		return -1; + +	if (alps_passthrough_mode_v2(psmouse, false)) +		return -1; + +	if (alps_absolute_mode_v6(psmouse)) { +		psmouse_err(psmouse, "Failed to enable absolute mode\n"); +		return -1; +	} + +	return 0; +} +  /*   * Enable or disable passthrough mode to the trackstick.   */ @@ -1553,6 +1743,8 @@ static void alps_set_defaults(struct alps_data *priv)  		priv->hw_init = alps_hw_init_v1_v2;  		priv->process_packet = alps_process_packet_v1_v2;  		priv->set_abs_params = alps_set_abs_params_st; +		priv->x_max = 1023; +		priv->y_max = 767;  		break;  	case ALPS_PROTO_V3:  		priv->hw_init = alps_hw_init_v3; @@ -1584,6 +1776,14 @@ static void alps_set_defaults(struct alps_data *priv)  		priv->x_bits = 23;  		priv->y_bits = 12;  		break; +	case ALPS_PROTO_V6: +		priv->hw_init = alps_hw_init_v6; +		priv->process_packet = alps_process_packet_v6; +		priv->set_abs_params = alps_set_abs_params_st; +		priv->nibble_commands = alps_v6_nibble_commands; +		priv->x_max = 2047; +		priv->y_max = 1535; +		break;  	}  } @@ -1705,8 +1905,8 @@ static void alps_disconnect(struct psmouse *psmouse)  static void alps_set_abs_params_st(struct alps_data *priv,  				   struct input_dev *dev1)  { -	input_set_abs_params(dev1, ABS_X, 0, 1023, 0, 0); -	input_set_abs_params(dev1, ABS_Y, 0, 767, 0, 0); +	input_set_abs_params(dev1, ABS_X, 0, priv->x_max, 0, 0); +	input_set_abs_params(dev1, ABS_Y, 0, priv->y_max, 0, 0);  }  static void alps_set_abs_params_mt(struct alps_data *priv, diff --git a/drivers/input/mouse/alps.h b/drivers/input/mouse/alps.h index eee59853b9ce..704f0f924307 100644 --- a/drivers/input/mouse/alps.h +++ b/drivers/input/mouse/alps.h @@ -17,6 +17,7 @@  #define ALPS_PROTO_V3	3  #define ALPS_PROTO_V4	4  #define ALPS_PROTO_V5	5 +#define ALPS_PROTO_V6	6  /**   * struct alps_model_info - touchpad ID table diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c index 8551dcaf24db..597e9b8fc18d 100644 --- a/drivers/input/mouse/elantech.c +++ b/drivers/input/mouse/elantech.c @@ -1313,6 +1313,7 @@ static int elantech_set_properties(struct elantech_data *etd)  			break;  		case 6:  		case 7: +		case 8:  			etd->hw_version = 4;  			break;  		default: diff --git a/drivers/input/touchscreen/sur40.c b/drivers/input/touchscreen/sur40.c index cfd1b7e8c001..f1cb05148b46 100644 --- a/drivers/input/touchscreen/sur40.c +++ b/drivers/input/touchscreen/sur40.c @@ -251,7 +251,7 @@ static void sur40_poll(struct input_polled_dev *polldev)  	struct sur40_state *sur40 = polldev->private;  	struct input_dev *input = polldev->input;  	int result, bulk_read, need_blobs, packet_blobs, i; -	u32 packet_id; +	u32 uninitialized_var(packet_id);  	struct sur40_header *header = &sur40->bulk_in_buffer->header;  	struct sur40_blob *inblob = &sur40->bulk_in_buffer->blobs[0]; @@ -286,7 +286,7 @@ static void sur40_poll(struct input_polled_dev *polldev)  		if (need_blobs == -1) {  			need_blobs = le16_to_cpu(header->count);  			dev_dbg(sur40->dev, "need %d blobs\n", need_blobs); -			packet_id = header->packet_id; +			packet_id = le32_to_cpu(header->packet_id);  		}  		/* diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c index ae4b6b903629..5f87bed05467 100644 --- a/drivers/input/touchscreen/usbtouchscreen.c +++ b/drivers/input/touchscreen/usbtouchscreen.c @@ -106,6 +106,7 @@ struct usbtouch_device_info {  struct usbtouch_usb {  	unsigned char *data;  	dma_addr_t data_dma; +	int data_size;  	unsigned char *buffer;  	int buf_len;  	struct urb *irq; @@ -1521,7 +1522,7 @@ static int usbtouch_reset_resume(struct usb_interface *intf)  static void usbtouch_free_buffers(struct usb_device *udev,  				  struct usbtouch_usb *usbtouch)  { -	usb_free_coherent(udev, usbtouch->type->rept_size, +	usb_free_coherent(udev, usbtouch->data_size,  			  usbtouch->data, usbtouch->data_dma);  	kfree(usbtouch->buffer);  } @@ -1566,7 +1567,20 @@ static int usbtouch_probe(struct usb_interface *intf,  	if (!type->process_pkt)  		type->process_pkt = usbtouch_process_pkt; -	usbtouch->data = usb_alloc_coherent(udev, type->rept_size, +	usbtouch->data_size = type->rept_size; +	if (type->get_pkt_len) { +		/* +		 * When dealing with variable-length packets we should +		 * not request more than wMaxPacketSize bytes at once +		 * as we do not know if there is more data coming or +		 * we filled exactly wMaxPacketSize bytes and there is +		 * nothing else. +		 */ +		usbtouch->data_size = min(usbtouch->data_size, +					  usb_endpoint_maxp(endpoint)); +	} + +	usbtouch->data = usb_alloc_coherent(udev, usbtouch->data_size,  					    GFP_KERNEL, &usbtouch->data_dma);  	if (!usbtouch->data)  		goto out_free; @@ -1626,12 +1640,12 @@ static int usbtouch_probe(struct usb_interface *intf,  	if (usb_endpoint_type(endpoint) == USB_ENDPOINT_XFER_INT)  		usb_fill_int_urb(usbtouch->irq, udev,  			 usb_rcvintpipe(udev, endpoint->bEndpointAddress), -			 usbtouch->data, type->rept_size, +			 usbtouch->data, usbtouch->data_size,  			 usbtouch_irq, usbtouch, endpoint->bInterval);  	else  		usb_fill_bulk_urb(usbtouch->irq, udev,  			 usb_rcvbulkpipe(udev, endpoint->bEndpointAddress), -			 usbtouch->data, type->rept_size, +			 usbtouch->data, usbtouch->data_size,  			 usbtouch_irq, usbtouch);  	usbtouch->irq->dev = udev; diff --git a/drivers/md/md.c b/drivers/md/md.c index e60cebf3f519..21f4d7ff0da2 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -776,16 +776,10 @@ void md_super_wait(struct mddev *mddev)  	finish_wait(&mddev->sb_wait, &wq);  } -static void bi_complete(struct bio *bio, int error) -{ -	complete((struct completion*)bio->bi_private); -} -  int sync_page_io(struct md_rdev *rdev, sector_t sector, int size,  		 struct page *page, int rw, bool metadata_op)  {  	struct bio *bio = bio_alloc_mddev(GFP_NOIO, 1, rdev->mddev); -	struct completion event;  	int ret;  	rw |= REQ_SYNC; @@ -801,11 +795,7 @@ int sync_page_io(struct md_rdev *rdev, sector_t sector, int size,  	else  		bio->bi_sector = sector + rdev->data_offset;  	bio_add_page(bio, page, size, 0); -	init_completion(&event); -	bio->bi_private = &event; -	bio->bi_end_io = bi_complete; -	submit_bio(rw, bio); -	wait_for_completion(&event); +	submit_bio_wait(rw, bio);  	ret = test_bit(BIO_UPTODATE, &bio->bi_flags);  	bio_put(bio); diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig index 62a60caa5d1f..dd671582c9a1 100644 --- a/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig @@ -32,7 +32,7 @@ config MFD_AS3722  	select MFD_CORE  	select REGMAP_I2C  	select REGMAP_IRQ -	depends on I2C && OF +	depends on I2C=y && OF  	help  	  The ams AS3722 is a compact system PMU suitable for mobile phones,  	  tablets etc. It has 4 DC/DC step-down regulators, 3 DC/DC step-down diff --git a/drivers/mfd/lpc_ich.c b/drivers/mfd/lpc_ich.c index da1c6566d93d..37edf9e989b0 100644 --- a/drivers/mfd/lpc_ich.c +++ b/drivers/mfd/lpc_ich.c @@ -506,7 +506,7 @@ static struct lpc_ich_info lpc_chipset_info[] = {  		.iTCO_version = 2,  	},  	[LPC_WPT_LP] = { -		.name = "Lynx Point_LP", +		.name = "Wildcat Point_LP",  		.iTCO_version = 2,  	},  }; diff --git a/drivers/mfd/ti-ssp.c b/drivers/mfd/ti-ssp.c index 71e3e0c5bf73..a5424579679c 100644 --- a/drivers/mfd/ti-ssp.c +++ b/drivers/mfd/ti-ssp.c @@ -32,6 +32,7 @@  #include <linux/platform_device.h>  #include <linux/delay.h>  #include <linux/io.h> +#include <linux/sched.h>  #include <linux/mfd/core.h>  #include <linux/mfd/ti_ssp.h> @@ -409,7 +410,6 @@ static int ti_ssp_probe(struct platform_device *pdev)  		cells[id].id		= id;  		cells[id].name		= data->dev_name;  		cells[id].platform_data	= data->pdata; -		cells[id].data_size	= data->pdata_size;  	}  	error = mfd_add_devices(dev, 0, cells, 2, NULL, 0, NULL); diff --git a/drivers/misc/enclosure.c b/drivers/misc/enclosure.c index 0e8df41aaf14..2cf2bbc0b927 100644 --- a/drivers/misc/enclosure.c +++ b/drivers/misc/enclosure.c @@ -198,6 +198,13 @@ static void enclosure_remove_links(struct enclosure_component *cdev)  {  	char name[ENCLOSURE_NAME_SIZE]; +	/* +	 * In odd circumstances, like multipath devices, something else may +	 * already have removed the links, so check for this condition first. +	 */ +	if (!cdev->dev->kobj.sd) +		return; +  	enclosure_link_name(cdev, name);  	sysfs_remove_link(&cdev->dev->kobj, name);  	sysfs_remove_link(&cdev->cdev.kobj, "device"); diff --git a/drivers/misc/mei/hw-me-regs.h b/drivers/misc/mei/hw-me-regs.h index 6c0fde55270d..66f411a6e8ea 100644 --- a/drivers/misc/mei/hw-me-regs.h +++ b/drivers/misc/mei/hw-me-regs.h @@ -109,9 +109,12 @@  #define MEI_DEV_ID_PPT_2      0x1CBA  /* Panther Point */  #define MEI_DEV_ID_PPT_3      0x1DBA  /* Panther Point */ -#define MEI_DEV_ID_LPT        0x8C3A  /* Lynx Point */ +#define MEI_DEV_ID_LPT_H      0x8C3A  /* Lynx Point H */  #define MEI_DEV_ID_LPT_W      0x8D3A  /* Lynx Point - Wellsburg */  #define MEI_DEV_ID_LPT_LP     0x9C3A  /* Lynx Point LP */ +#define MEI_DEV_ID_LPT_HR     0x8CBA  /* Lynx Point H Refresh */ + +#define MEI_DEV_ID_WPT_LP     0x9CBA  /* Wildcat Point LP */  /*   * MEI HW Section   */ diff --git a/drivers/misc/mei/pci-me.c b/drivers/misc/mei/pci-me.c index b96205aece0c..2cab3c0a6805 100644 --- a/drivers/misc/mei/pci-me.c +++ b/drivers/misc/mei/pci-me.c @@ -76,9 +76,11 @@ static DEFINE_PCI_DEVICE_TABLE(mei_me_pci_tbl) = {  	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_PPT_1)},  	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_PPT_2)},  	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_PPT_3)}, -	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_LPT)}, +	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_LPT_H)},  	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_LPT_W)},  	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_LPT_LP)}, +	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_LPT_HR)}, +	{PCI_DEVICE(PCI_VENDOR_ID_INTEL, MEI_DEV_ID_WPT_LP)},  	/* required last entry */  	{0, } diff --git a/drivers/misc/mic/card/mic_virtio.c b/drivers/misc/mic/card/mic_virtio.c index 8aa42e738acc..653799b96bfa 100644 --- a/drivers/misc/mic/card/mic_virtio.c +++ b/drivers/misc/mic/card/mic_virtio.c @@ -154,14 +154,14 @@ static void mic_reset_inform_host(struct virtio_device *vdev)  {  	struct mic_vdev *mvdev = to_micvdev(vdev);  	struct mic_device_ctrl __iomem *dc = mvdev->dc; -	int retry = 100, i; +	int retry;  	iowrite8(0, &dc->host_ack);  	iowrite8(1, &dc->vdev_reset);  	mic_send_intr(mvdev->mdev, mvdev->c2h_vdev_db);  	/* Wait till host completes all card accesses and acks the reset */ -	for (i = retry; i--;) { +	for (retry = 100; retry--;) {  		if (ioread8(&dc->host_ack))  			break;  		msleep(100); @@ -187,11 +187,12 @@ static void mic_reset(struct virtio_device *vdev)  /*   * The virtio_ring code calls this API when it wants to notify the Host.   */ -static void mic_notify(struct virtqueue *vq) +static bool mic_notify(struct virtqueue *vq)  {  	struct mic_vdev *mvdev = vq->priv;  	mic_send_intr(mvdev->mdev, mvdev->c2h_vdev_db); +	return true;  }  static void mic_del_vq(struct virtqueue *vq, int n) @@ -247,17 +248,17 @@ static struct virtqueue *mic_find_vq(struct virtio_device *vdev,  	/* First assign the vring's allocated in host memory */  	vqconfig = mic_vq_config(mvdev->desc) + index;  	memcpy_fromio(&config, vqconfig, sizeof(config)); -	_vr_size = vring_size(config.num, MIC_VIRTIO_RING_ALIGN); +	_vr_size = vring_size(le16_to_cpu(config.num), MIC_VIRTIO_RING_ALIGN);  	vr_size = PAGE_ALIGN(_vr_size + sizeof(struct _mic_vring_info)); -	va = mic_card_map(mvdev->mdev, config.address, vr_size); +	va = mic_card_map(mvdev->mdev, le64_to_cpu(config.address), vr_size);  	if (!va)  		return ERR_PTR(-ENOMEM);  	mvdev->vr[index] = va;  	memset_io(va, 0x0, _vr_size); -	vq = vring_new_virtqueue(index, -				config.num, MIC_VIRTIO_RING_ALIGN, vdev, -				false, -				va, mic_notify, callback, name); +	vq = vring_new_virtqueue(index, le16_to_cpu(config.num), +				 MIC_VIRTIO_RING_ALIGN, vdev, false, +				 (void __force *)va, mic_notify, callback, +				 name);  	if (!vq) {  		err = -ENOMEM;  		goto unmap; @@ -272,7 +273,8 @@ static struct virtqueue *mic_find_vq(struct virtio_device *vdev,  	/* Allocate and reassign used ring now */  	mvdev->used_size[index] = PAGE_ALIGN(sizeof(__u16) * 3 + -			sizeof(struct vring_used_elem) * config.num); +					     sizeof(struct vring_used_elem) * +					     le16_to_cpu(config.num));  	used = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO,  					get_order(mvdev->used_size[index]));  	if (!used) { @@ -309,7 +311,7 @@ static int mic_find_vqs(struct virtio_device *vdev, unsigned nvqs,  {  	struct mic_vdev *mvdev = to_micvdev(vdev);  	struct mic_device_ctrl __iomem *dc = mvdev->dc; -	int i, err, retry = 100; +	int i, err, retry;  	/* We must have this many virtqueues. */  	if (nvqs > ioread8(&mvdev->desc->num_vq)) @@ -331,7 +333,7 @@ static int mic_find_vqs(struct virtio_device *vdev, unsigned nvqs,  	 * rings have been re-assigned.  	 */  	mic_send_intr(mvdev->mdev, mvdev->c2h_vdev_db); -	for (i = retry; i--;) { +	for (retry = 100; retry--;) {  		if (!ioread8(&dc->used_address_updated))  			break;  		msleep(100); @@ -519,8 +521,8 @@ static void mic_scan_devices(struct mic_driver *mdrv, bool remove)  	struct device *dev;  	int ret; -	for (i = mic_aligned_size(struct mic_bootparam); -		i < MIC_DP_SIZE; i += mic_total_desc_size(d)) { +	for (i = sizeof(struct mic_bootparam); i < MIC_DP_SIZE; +		i += mic_total_desc_size(d)) {  		d = mdrv->dp + i;  		dc = (void __iomem *)d + mic_aligned_desc_size(d);  		/* @@ -539,7 +541,8 @@ static void mic_scan_devices(struct mic_driver *mdrv, bool remove)  			continue;  		/* device already exists */ -		dev = device_find_child(mdrv->dev, d, mic_match_desc); +		dev = device_find_child(mdrv->dev, (void __force *)d, +					mic_match_desc);  		if (dev) {  			if (remove)  				iowrite8(MIC_VIRTIO_PARAM_DEV_REMOVE, diff --git a/drivers/misc/mic/card/mic_virtio.h b/drivers/misc/mic/card/mic_virtio.h index 2c5c22c93ba8..d0407ba53bb7 100644 --- a/drivers/misc/mic/card/mic_virtio.h +++ b/drivers/misc/mic/card/mic_virtio.h @@ -42,8 +42,8 @@  static inline unsigned mic_desc_size(struct mic_device_desc __iomem *desc)  { -	return mic_aligned_size(*desc) -		+ ioread8(&desc->num_vq) * mic_aligned_size(struct mic_vqconfig) +	return sizeof(*desc) +		+ ioread8(&desc->num_vq) * sizeof(struct mic_vqconfig)  		+ ioread8(&desc->feature_len) * 2  		+ ioread8(&desc->config_len);  } @@ -67,8 +67,7 @@ mic_vq_configspace(struct mic_device_desc __iomem *desc)  }  static inline unsigned mic_total_desc_size(struct mic_device_desc __iomem *desc)  { -	return mic_aligned_desc_size(desc) + -		mic_aligned_size(struct mic_device_ctrl); +	return mic_aligned_desc_size(desc) + sizeof(struct mic_device_ctrl);  }  int mic_devices_init(struct mic_driver *mdrv); diff --git a/drivers/misc/mic/host/mic_boot.c b/drivers/misc/mic/host/mic_boot.c index 7558d9186438..b75c6b5cc20f 100644 --- a/drivers/misc/mic/host/mic_boot.c +++ b/drivers/misc/mic/host/mic_boot.c @@ -62,7 +62,7 @@ void mic_bootparam_init(struct mic_device *mdev)  {  	struct mic_bootparam *bootparam = mdev->dp; -	bootparam->magic = MIC_MAGIC; +	bootparam->magic = cpu_to_le32(MIC_MAGIC);  	bootparam->c2h_shutdown_db = mdev->shutdown_db;  	bootparam->h2c_shutdown_db = -1;  	bootparam->h2c_config_db = -1; diff --git a/drivers/misc/mic/host/mic_virtio.c b/drivers/misc/mic/host/mic_virtio.c index 5b8494bd1e00..e04bb4fe6823 100644 --- a/drivers/misc/mic/host/mic_virtio.c +++ b/drivers/misc/mic/host/mic_virtio.c @@ -41,7 +41,7 @@ static int mic_virtio_copy_to_user(struct mic_vdev *mvdev,  	 * We are copying from IO below an should ideally use something  	 * like copy_to_user_fromio(..) if it existed.  	 */ -	if (copy_to_user(ubuf, dbuf, len)) { +	if (copy_to_user(ubuf, (void __force *)dbuf, len)) {  		err = -EFAULT;  		dev_err(mic_dev(mvdev), "%s %d err %d\n",  			__func__, __LINE__, err); @@ -66,7 +66,7 @@ static int mic_virtio_copy_from_user(struct mic_vdev *mvdev,  	 * We are copying to IO below and should ideally use something  	 * like copy_from_user_toio(..) if it existed.  	 */ -	if (copy_from_user(dbuf, ubuf, len)) { +	if (copy_from_user((void __force *)dbuf, ubuf, len)) {  		err = -EFAULT;  		dev_err(mic_dev(mvdev), "%s %d err %d\n",  			__func__, __LINE__, err); @@ -293,7 +293,7 @@ static void mic_virtio_init_post(struct mic_vdev *mvdev)  			continue;  		}  		mvdev->mvr[i].vrh.vring.used = -			mvdev->mdev->aper.va + +			(void __force *)mvdev->mdev->aper.va +  			le64_to_cpu(vqconfig[i].used_address);  	} @@ -378,7 +378,7 @@ int mic_virtio_config_change(struct mic_vdev *mvdev,  			void __user *argp)  {  	DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wake); -	int ret = 0, retry = 100, i; +	int ret = 0, retry, i;  	struct mic_bootparam *bootparam = mvdev->mdev->dp;  	s8 db = bootparam->h2c_config_db; @@ -401,7 +401,7 @@ int mic_virtio_config_change(struct mic_vdev *mvdev,  	mvdev->dc->config_change = MIC_VIRTIO_PARAM_CONFIG_CHANGED;  	mvdev->mdev->ops->send_intr(mvdev->mdev, db); -	for (i = retry; i--;) { +	for (retry = 100; retry--;) {  		ret = wait_event_timeout(wake,  			mvdev->dc->guest_ack, msecs_to_jiffies(100));  		if (ret) @@ -467,7 +467,7 @@ static int mic_copy_dp_entry(struct mic_vdev *mvdev,  	}  	/* Find the first free device page entry */ -	for (i = mic_aligned_size(struct mic_bootparam); +	for (i = sizeof(struct mic_bootparam);  		i < MIC_DP_SIZE - mic_total_desc_size(dd_config);  		i += mic_total_desc_size(devp)) {  		devp = mdev->dp + i; @@ -525,6 +525,7 @@ int mic_virtio_add_device(struct mic_vdev *mvdev,  	char irqname[10];  	struct mic_bootparam *bootparam = mdev->dp;  	u16 num; +	dma_addr_t vr_addr;  	mutex_lock(&mdev->mic_mutex); @@ -559,17 +560,16 @@ int mic_virtio_add_device(struct mic_vdev *mvdev,  		}  		vr->len = vr_size;  		vr->info = vr->va + vring_size(num, MIC_VIRTIO_RING_ALIGN); -		vr->info->magic = MIC_MAGIC + mvdev->virtio_id + i; -		vqconfig[i].address = mic_map_single(mdev, -			vr->va, vr_size); -		if (mic_map_error(vqconfig[i].address)) { +		vr->info->magic = cpu_to_le32(MIC_MAGIC + mvdev->virtio_id + i); +		vr_addr = mic_map_single(mdev, vr->va, vr_size); +		if (mic_map_error(vr_addr)) {  			free_pages((unsigned long)vr->va, get_order(vr_size));  			ret = -ENOMEM;  			dev_err(mic_dev(mvdev), "%s %d err %d\n",  				__func__, __LINE__, ret);  			goto err;  		} -		vqconfig[i].address = cpu_to_le64(vqconfig[i].address); +		vqconfig[i].address = cpu_to_le64(vr_addr);  		vring_init(&vr->vr, num, vr->va, MIC_VIRTIO_RING_ALIGN);  		ret = vringh_init_kern(&mvr->vrh, @@ -639,7 +639,7 @@ void mic_virtio_del_device(struct mic_vdev *mvdev)  	struct mic_vdev *tmp_mvdev;  	struct mic_device *mdev = mvdev->mdev;  	DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wake); -	int i, ret, retry = 100; +	int i, ret, retry;  	struct mic_vqconfig *vqconfig;  	struct mic_bootparam *bootparam = mdev->dp;  	s8 db; @@ -652,16 +652,16 @@ void mic_virtio_del_device(struct mic_vdev *mvdev)  		"Requesting hot remove id %d\n", mvdev->virtio_id);  	mvdev->dc->config_change = MIC_VIRTIO_PARAM_DEV_REMOVE;  	mdev->ops->send_intr(mdev, db); -	for (i = retry; i--;) { +	for (retry = 100; retry--;) {  		ret = wait_event_timeout(wake,  			mvdev->dc->guest_ack, msecs_to_jiffies(100));  		if (ret)  			break;  	}  	dev_dbg(mdev->sdev->parent, -		"Device id %d config_change %d guest_ack %d\n", +		"Device id %d config_change %d guest_ack %d retry %d\n",  		mvdev->virtio_id, mvdev->dc->config_change, -		mvdev->dc->guest_ack); +		mvdev->dc->guest_ack, retry);  	mvdev->dc->config_change = 0;  	mvdev->dc->guest_ack = 0;  skip_hot_remove: diff --git a/drivers/misc/mic/host/mic_x100.c b/drivers/misc/mic/host/mic_x100.c index 81e9541b784c..0dfa8a81436e 100644 --- a/drivers/misc/mic/host/mic_x100.c +++ b/drivers/misc/mic/host/mic_x100.c @@ -397,8 +397,8 @@ mic_x100_load_ramdisk(struct mic_device *mdev)  	 * so copy over the ramdisk @ 128M.  	 */  	memcpy_toio(mdev->aper.va + (mdev->bootaddr << 1), fw->data, fw->size); -	iowrite32(cpu_to_le32(mdev->bootaddr << 1), &bp->hdr.ramdisk_image); -	iowrite32(cpu_to_le32(fw->size), &bp->hdr.ramdisk_size); +	iowrite32(mdev->bootaddr << 1, &bp->hdr.ramdisk_image); +	iowrite32(fw->size, &bp->hdr.ramdisk_size);  	release_firmware(fw);  error:  	return rc; diff --git a/drivers/pinctrl/pinctrl-abx500.c b/drivers/pinctrl/pinctrl-abx500.c index 4780959e11d4..5183e7bb8de3 100644 --- a/drivers/pinctrl/pinctrl-abx500.c +++ b/drivers/pinctrl/pinctrl-abx500.c @@ -418,7 +418,7 @@ static int abx500_set_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip,  			ret = abx500_gpio_set_bits(chip,  					AB8500_GPIO_ALTFUN_REG,  					af.alt_bit1, -					!!(af.alta_val && BIT(0))); +					!!(af.alta_val & BIT(0)));  			if (ret < 0)  				goto out; @@ -439,7 +439,7 @@ static int abx500_set_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip,  			goto out;  		ret = abx500_gpio_set_bits(chip, AB8500_GPIO_ALTFUN_REG, -				af.alt_bit1, !!(af.altb_val && BIT(0))); +				af.alt_bit1, !!(af.altb_val & BIT(0)));  		if (ret < 0)  			goto out; @@ -462,7 +462,7 @@ static int abx500_set_mode(struct pinctrl_dev *pctldev, struct gpio_chip *chip,  			goto out;  		ret = abx500_gpio_set_bits(chip, AB8500_GPIO_ALTFUN_REG, -				af.alt_bit2, !!(af.altc_val && BIT(1))); +				af.alt_bit2, !!(af.altc_val & BIT(1)));  		break;  	default: diff --git a/drivers/pinctrl/pinctrl-abx500.h b/drivers/pinctrl/pinctrl-abx500.h index eeca8f973999..82293806e842 100644 --- a/drivers/pinctrl/pinctrl-abx500.h +++ b/drivers/pinctrl/pinctrl-abx500.h @@ -1,4 +1,4 @@ -#ifndef PINCTRL_PINCTRL_ABx5O0_H +#ifndef PINCTRL_PINCTRL_ABx500_H  #define PINCTRL_PINCTRL_ABx500_H  /* Package definitions */ diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c index e939c28cbf1f..46dddc159286 100644 --- a/drivers/pinctrl/pinctrl-rockchip.c +++ b/drivers/pinctrl/pinctrl-rockchip.c @@ -504,6 +504,7 @@ static int rockchip_set_pull(struct rockchip_pin_bank *bank,  			data |= (3 << bit);  			break;  		default: +			spin_unlock_irqrestore(&bank->slock, flags);  			dev_err(info->dev, "unsupported pull setting %d\n",  				pull);  			return -EINVAL; @@ -1453,8 +1454,8 @@ static int rockchip_pinctrl_probe(struct platform_device *pdev)  	if (ctrl->type == RK3188) {  		res = platform_get_resource(pdev, IORESOURCE_MEM, 1);  		info->reg_pull = devm_ioremap_resource(&pdev->dev, res); -		if (IS_ERR(info->reg_base)) -			return PTR_ERR(info->reg_base); +		if (IS_ERR(info->reg_pull)) +			return PTR_ERR(info->reg_pull);  	}  	ret = rockchip_gpiolib_register(pdev, info); diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7740.c b/drivers/pinctrl/sh-pfc/pfc-r8a7740.c index 009174d07767..bc5eb453a45c 100644 --- a/drivers/pinctrl/sh-pfc/pfc-r8a7740.c +++ b/drivers/pinctrl/sh-pfc/pfc-r8a7740.c @@ -3720,7 +3720,7 @@ static void __iomem *r8a7740_pinmux_portcr(struct sh_pfc *pfc, unsigned int pin)  		const struct r8a7740_portcr_group *group =  			&r8a7740_portcr_offsets[i]; -		if (i <= group->end_pin) +		if (pin <= group->end_pin)  			return pfc->window->virt + group->offset + pin;  	} diff --git a/drivers/pinctrl/sh-pfc/pfc-sh7372.c b/drivers/pinctrl/sh-pfc/pfc-sh7372.c index 70b522d34821..cc097b693820 100644 --- a/drivers/pinctrl/sh-pfc/pfc-sh7372.c +++ b/drivers/pinctrl/sh-pfc/pfc-sh7372.c @@ -2584,7 +2584,7 @@ static void __iomem *sh7372_pinmux_portcr(struct sh_pfc *pfc, unsigned int pin)  		const struct sh7372_portcr_group *group =  			&sh7372_portcr_offsets[i]; -		if (i <= group->end_pin) +		if (pin <= group->end_pin)  			return pfc->window->virt + group->offset + pin;  	} diff --git a/drivers/pnp/driver.c b/drivers/pnp/driver.c index 6936e0acedcd..f748cc8cbb03 100644 --- a/drivers/pnp/driver.c +++ b/drivers/pnp/driver.c @@ -197,6 +197,11 @@ static int pnp_bus_freeze(struct device *dev)  	return __pnp_bus_suspend(dev, PMSG_FREEZE);  } +static int pnp_bus_poweroff(struct device *dev) +{ +	return __pnp_bus_suspend(dev, PMSG_HIBERNATE); +} +  static int pnp_bus_resume(struct device *dev)  {  	struct pnp_dev *pnp_dev = to_pnp_dev(dev); @@ -234,9 +239,14 @@ static int pnp_bus_resume(struct device *dev)  }  static const struct dev_pm_ops pnp_bus_dev_pm_ops = { +	/* Suspend callbacks */  	.suspend = pnp_bus_suspend, -	.freeze = pnp_bus_freeze,  	.resume = pnp_bus_resume, +	/* Hibernate callbacks */ +	.freeze = pnp_bus_freeze, +	.thaw = pnp_bus_resume, +	.poweroff = pnp_bus_poweroff, +	.restore = pnp_bus_resume,  };  struct bus_type pnp_bus_type = { diff --git a/drivers/powercap/powercap_sys.c b/drivers/powercap/powercap_sys.c index 8d0fe431dbdd..84419af16f77 100644 --- a/drivers/powercap/powercap_sys.c +++ b/drivers/powercap/powercap_sys.c @@ -377,9 +377,14 @@ static void create_power_zone_common_attributes(  	if (power_zone->ops->get_max_energy_range_uj)  		power_zone->zone_dev_attrs[count++] =  					&dev_attr_max_energy_range_uj.attr; -	if (power_zone->ops->get_energy_uj) +	if (power_zone->ops->get_energy_uj) { +		if (power_zone->ops->reset_energy_uj) +			dev_attr_energy_uj.attr.mode = S_IWUSR | S_IRUGO; +		else +			dev_attr_energy_uj.attr.mode = S_IRUGO;  		power_zone->zone_dev_attrs[count++] =  					&dev_attr_energy_uj.attr; +	}  	if (power_zone->ops->get_power_uw)  		power_zone->zone_dev_attrs[count++] =  					&dev_attr_power_uw.attr; diff --git a/drivers/s390/block/dasd_genhd.c b/drivers/s390/block/dasd_genhd.c index f64921756ad6..f224d59c4b6b 100644 --- a/drivers/s390/block/dasd_genhd.c +++ b/drivers/s390/block/dasd_genhd.c @@ -87,7 +87,6 @@ void dasd_gendisk_free(struct dasd_block *block)  {  	if (block->gdp) {  		del_gendisk(block->gdp); -		block->gdp->queue = NULL;  		block->gdp->private_data = NULL;  		put_disk(block->gdp);  		block->gdp = NULL; diff --git a/drivers/s390/char/sclp_early.c b/drivers/s390/char/sclp_early.c index f7aa080e9b28..1465e9563101 100644 --- a/drivers/s390/char/sclp_early.c +++ b/drivers/s390/char/sclp_early.c @@ -35,7 +35,6 @@ struct read_info_sccb {  	u8	_reserved5[4096 - 112];	/* 112-4095 */  } __packed __aligned(PAGE_SIZE); -static __initdata struct init_sccb early_event_mask_sccb __aligned(PAGE_SIZE);  static __initdata struct read_info_sccb early_read_info_sccb;  static __initdata char sccb_early[PAGE_SIZE] __aligned(PAGE_SIZE);  static unsigned long sclp_hsa_size; @@ -113,7 +112,7 @@ static void __init sclp_facilities_detect(void)  bool __init sclp_has_linemode(void)  { -	struct init_sccb *sccb = &early_event_mask_sccb; +	struct init_sccb *sccb = (void *) &sccb_early;  	if (sccb->header.response_code != 0x20)  		return 0; @@ -126,7 +125,7 @@ bool __init sclp_has_linemode(void)  bool __init sclp_has_vt220(void)  { -	struct init_sccb *sccb = &early_event_mask_sccb; +	struct init_sccb *sccb = (void *) &sccb_early;  	if (sccb->header.response_code != 0x20)  		return 0; diff --git a/drivers/scsi/3w-9xxx.c b/drivers/scsi/3w-9xxx.c index 5e1e12c0cf42..0a7325361d29 100644 --- a/drivers/scsi/3w-9xxx.c +++ b/drivers/scsi/3w-9xxx.c @@ -2025,7 +2025,8 @@ static struct scsi_host_template driver_template = {  	.cmd_per_lun		= TW_MAX_CMDS_PER_LUN,  	.use_clustering		= ENABLE_CLUSTERING,  	.shost_attrs		= twa_host_attrs, -	.emulated		= 1 +	.emulated		= 1, +	.no_write_same		= 1,  };  /* This function will probe and initialize a card */ diff --git a/drivers/scsi/3w-sas.c b/drivers/scsi/3w-sas.c index c845bdbeb6c0..4de346017e9f 100644 --- a/drivers/scsi/3w-sas.c +++ b/drivers/scsi/3w-sas.c @@ -1600,7 +1600,8 @@ static struct scsi_host_template driver_template = {  	.cmd_per_lun		= TW_MAX_CMDS_PER_LUN,  	.use_clustering		= ENABLE_CLUSTERING,  	.shost_attrs		= twl_host_attrs, -	.emulated		= 1 +	.emulated		= 1, +	.no_write_same		= 1,  };  /* This function will probe and initialize a card */ diff --git a/drivers/scsi/3w-xxxx.c b/drivers/scsi/3w-xxxx.c index b9276d10b25c..752624e6bc00 100644 --- a/drivers/scsi/3w-xxxx.c +++ b/drivers/scsi/3w-xxxx.c @@ -2279,7 +2279,8 @@ static struct scsi_host_template driver_template = {  	.cmd_per_lun		= TW_MAX_CMDS_PER_LUN,	  	.use_clustering		= ENABLE_CLUSTERING,  	.shost_attrs		= tw_host_attrs, -	.emulated		= 1 +	.emulated		= 1, +	.no_write_same		= 1,  };  /* This function will probe and initialize a card */ diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c index f0d432c139d0..4921ed19a027 100644 --- a/drivers/scsi/aacraid/linit.c +++ b/drivers/scsi/aacraid/linit.c @@ -1081,6 +1081,7 @@ static struct scsi_host_template aac_driver_template = {  #endif  	.use_clustering			= ENABLE_CLUSTERING,  	.emulated			= 1, +	.no_write_same			= 1,  };  static void __aac_shutdown(struct aac_dev * aac) diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c index 97fd450aff09..4f6a30b8e5f9 100644 --- a/drivers/scsi/arcmsr/arcmsr_hba.c +++ b/drivers/scsi/arcmsr/arcmsr_hba.c @@ -137,6 +137,7 @@ static struct scsi_host_template arcmsr_scsi_host_template = {  	.cmd_per_lun		= ARCMSR_MAX_CMD_PERLUN,  	.use_clustering		= ENABLE_CLUSTERING,  	.shost_attrs		= arcmsr_host_attrs, +	.no_write_same		= 1,  };  static struct pci_device_id arcmsr_device_id_table[] = {  	{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1110)}, diff --git a/drivers/scsi/bfa/bfa_fcs.h b/drivers/scsi/bfa/bfa_fcs.h index 94d5d0102f7d..42bcb970445a 100644 --- a/drivers/scsi/bfa/bfa_fcs.h +++ b/drivers/scsi/bfa/bfa_fcs.h @@ -296,6 +296,7 @@ wwn_t bfa_fcs_lport_get_rport(struct bfa_fcs_lport_s *port, wwn_t wwn,  struct bfa_fcs_lport_s *bfa_fcs_lookup_port(struct bfa_fcs_s *fcs,  					    u16 vf_id, wwn_t lpwwn); +void bfa_fcs_lport_set_symname(struct bfa_fcs_lport_s *port, char *symname);  void bfa_fcs_lport_get_info(struct bfa_fcs_lport_s *port,  			    struct bfa_lport_info_s *port_info);  void bfa_fcs_lport_get_attr(struct bfa_fcs_lport_s *port, diff --git a/drivers/scsi/bfa/bfa_fcs_lport.c b/drivers/scsi/bfa/bfa_fcs_lport.c index 2f61a5af3658..f5e4e61a0fd7 100644 --- a/drivers/scsi/bfa/bfa_fcs_lport.c +++ b/drivers/scsi/bfa/bfa_fcs_lport.c @@ -1097,6 +1097,17 @@ bfa_fcs_lport_init(struct bfa_fcs_lport_s *lport,  	bfa_sm_send_event(lport, BFA_FCS_PORT_SM_CREATE);  } +void +bfa_fcs_lport_set_symname(struct bfa_fcs_lport_s *port, +				char *symname) +{ +	strcpy(port->port_cfg.sym_name.symname, symname); + +	if (bfa_sm_cmp_state(port, bfa_fcs_lport_sm_online)) +		bfa_fcs_lport_ns_util_send_rspn_id( +			BFA_FCS_GET_NS_FROM_PORT(port), NULL); +} +  /*   *  fcs_lport_api   */ @@ -5140,9 +5151,6 @@ bfa_fcs_lport_ns_util_send_rspn_id(void *cbarg, struct bfa_fcxp_s *fcxp_alloced)  	u8 *psymbl = &symbl[0];  	int len; -	if (!bfa_sm_cmp_state(port, bfa_fcs_lport_sm_online)) -		return; -  	/* Avoid sending RSPN in the following states. */  	if (bfa_sm_cmp_state(ns, bfa_fcs_lport_ns_sm_offline) ||  	    bfa_sm_cmp_state(ns, bfa_fcs_lport_ns_sm_plogi_sending) || diff --git a/drivers/scsi/bfa/bfad_attr.c b/drivers/scsi/bfa/bfad_attr.c index e9a681d31223..40be670a1cbc 100644 --- a/drivers/scsi/bfa/bfad_attr.c +++ b/drivers/scsi/bfa/bfad_attr.c @@ -593,11 +593,8 @@ bfad_im_vport_set_symbolic_name(struct fc_vport *fc_vport)  		return;  	spin_lock_irqsave(&bfad->bfad_lock, flags); -	if (strlen(sym_name) > 0) { -		strcpy(fcs_vport->lport.port_cfg.sym_name.symname, sym_name); -		bfa_fcs_lport_ns_util_send_rspn_id( -			BFA_FCS_GET_NS_FROM_PORT((&fcs_vport->lport)), NULL); -	} +	if (strlen(sym_name) > 0) +		bfa_fcs_lport_set_symname(&fcs_vport->lport, sym_name);  	spin_unlock_irqrestore(&bfad->bfad_lock, flags);  } diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c index ee4fa40a50b1..ce5ef0190bad 100644 --- a/drivers/scsi/gdth.c +++ b/drivers/scsi/gdth.c @@ -4684,6 +4684,7 @@ static struct scsi_host_template gdth_template = {          .cmd_per_lun            = GDTH_MAXC_P_L,          .unchecked_isa_dma      = 1,          .use_clustering         = ENABLE_CLUSTERING, +	.no_write_same		= 1,  };  #ifdef CONFIG_ISA diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c index f334859024c0..f2c5005f312a 100644 --- a/drivers/scsi/hosts.c +++ b/drivers/scsi/hosts.c @@ -395,6 +395,7 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize)  	shost->use_clustering = sht->use_clustering;  	shost->ordered_tag = sht->ordered_tag;  	shost->eh_deadline = shost_eh_deadline * HZ; +	shost->no_write_same = sht->no_write_same;  	if (sht->supported_mode == MODE_UNKNOWN)  		/* means we didn't set it ... default to INITIATOR */ diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c index 22f6432eb475..20a5e6ecf945 100644 --- a/drivers/scsi/hpsa.c +++ b/drivers/scsi/hpsa.c @@ -561,6 +561,7 @@ static struct scsi_host_template hpsa_driver_template = {  	.sdev_attrs = hpsa_sdev_attrs,  	.shost_attrs = hpsa_shost_attrs,  	.max_sectors = 8192, +	.no_write_same = 1,  }; @@ -1288,7 +1289,7 @@ static void complete_scsi_command(struct CommandList *cp)  					"has check condition: aborted command: "  					"ASC: 0x%x, ASCQ: 0x%x\n",  					cp, asc, ascq); -				cmd->result = DID_SOFT_ERROR << 16; +				cmd->result |= DID_SOFT_ERROR << 16;  				break;  			}  			/* Must be some other type of check condition */ @@ -4925,7 +4926,7 @@ reinit_after_soft_reset:  	hpsa_hba_inquiry(h);  	hpsa_register_scsi(h);	/* hook ourselves into SCSI subsystem */  	start_controller_lockup_detector(h); -	return 1; +	return 0;  clean4:  	hpsa_free_sg_chain_blocks(h); diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c index 36ac1c34ce97..573f4128b6b6 100644 --- a/drivers/scsi/ipr.c +++ b/drivers/scsi/ipr.c @@ -6305,7 +6305,8 @@ static struct scsi_host_template driver_template = {  	.use_clustering = ENABLE_CLUSTERING,  	.shost_attrs = ipr_ioa_attrs,  	.sdev_attrs = ipr_dev_attrs, -	.proc_name = IPR_NAME +	.proc_name = IPR_NAME, +	.no_write_same = 1,  };  /** diff --git a/drivers/scsi/ips.c b/drivers/scsi/ips.c index 8d5ea8a1e5a6..52a216f21ae5 100644 --- a/drivers/scsi/ips.c +++ b/drivers/scsi/ips.c @@ -374,6 +374,7 @@ static struct scsi_host_template ips_driver_template = {  	.sg_tablesize		= IPS_MAX_SG,  	.cmd_per_lun		= 3,  	.use_clustering		= ENABLE_CLUSTERING, +	.no_write_same		= 1,  }; diff --git a/drivers/scsi/libsas/sas_ata.c b/drivers/scsi/libsas/sas_ata.c index 161c98efade9..d2895836f9fa 100644 --- a/drivers/scsi/libsas/sas_ata.c +++ b/drivers/scsi/libsas/sas_ata.c @@ -211,7 +211,7 @@ static unsigned int sas_ata_qc_issue(struct ata_queued_cmd *qc)  		qc->tf.nsect = 0;  	} -	ata_tf_to_fis(&qc->tf, 1, 0, (u8*)&task->ata_task.fis); +	ata_tf_to_fis(&qc->tf, qc->dev->link->pmp, 1, (u8 *)&task->ata_task.fis);  	task->uldd_task = qc;  	if (ata_is_atapi(qc->tf.protocol)) {  		memcpy(task->ata_task.atapi_packet, qc->cdb, qc->dev->cdb_len); diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c index 90c95a3385d1..816db12ef5d5 100644 --- a/drivers/scsi/megaraid.c +++ b/drivers/scsi/megaraid.c @@ -4244,6 +4244,7 @@ static struct scsi_host_template megaraid_template = {  	.eh_device_reset_handler	= megaraid_reset,  	.eh_bus_reset_handler		= megaraid_reset,  	.eh_host_reset_handler		= megaraid_reset, +	.no_write_same			= 1,  };  static int diff --git a/drivers/scsi/megaraid/megaraid_mbox.c b/drivers/scsi/megaraid/megaraid_mbox.c index d1a4b82836ea..e2237a97cb9d 100644 --- a/drivers/scsi/megaraid/megaraid_mbox.c +++ b/drivers/scsi/megaraid/megaraid_mbox.c @@ -367,6 +367,7 @@ static struct scsi_host_template megaraid_template_g = {  	.eh_host_reset_handler		= megaraid_reset_handler,  	.change_queue_depth		= megaraid_change_queue_depth,  	.use_clustering			= ENABLE_CLUSTERING, +	.no_write_same			= 1,  	.sdev_attrs			= megaraid_sdev_attrs,  	.shost_attrs			= megaraid_shost_attrs,  }; diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c index 0a743a5d1647..c99812bf2a73 100644 --- a/drivers/scsi/megaraid/megaraid_sas_base.c +++ b/drivers/scsi/megaraid/megaraid_sas_base.c @@ -2148,6 +2148,7 @@ static struct scsi_host_template megasas_template = {  	.bios_param = megasas_bios_param,  	.use_clustering = ENABLE_CLUSTERING,  	.change_queue_depth = megasas_change_queue_depth, +	.no_write_same = 1,  };  /** diff --git a/drivers/scsi/pm8001/pm8001_hwi.c b/drivers/scsi/pm8001/pm8001_hwi.c index f16ece91b94a..0a1296a87d66 100644 --- a/drivers/scsi/pm8001/pm8001_hwi.c +++ b/drivers/scsi/pm8001/pm8001_hwi.c @@ -3403,6 +3403,7 @@ hw_event_sas_phy_up(struct pm8001_hba_info *pm8001_ha, void *piomb)  	unsigned long flags;  	u8 deviceType = pPayload->sas_identify.dev_type;  	port->port_state =  portstate; +	phy->phy_state = PHY_STATE_LINK_UP_SPC;  	PM8001_MSG_DBG(pm8001_ha,  		pm8001_printk("HW_EVENT_SAS_PHY_UP port id = %d, phy id = %d\n",  		port_id, phy_id)); @@ -3483,6 +3484,7 @@ hw_event_sata_phy_up(struct pm8001_hba_info *pm8001_ha, void *piomb)  		pm8001_printk("HW_EVENT_SATA_PHY_UP port id = %d,"  		" phy id = %d\n", port_id, phy_id));  	port->port_state =  portstate; +	phy->phy_state = PHY_STATE_LINK_UP_SPC;  	port->port_attached = 1;  	pm8001_get_lrate_mode(phy, link_rate);  	phy->phy_type |= PORT_TYPE_SATA; diff --git a/drivers/scsi/pm8001/pm8001_hwi.h b/drivers/scsi/pm8001/pm8001_hwi.h index 6d91e2446542..e4867e690c84 100644 --- a/drivers/scsi/pm8001/pm8001_hwi.h +++ b/drivers/scsi/pm8001/pm8001_hwi.h @@ -131,6 +131,10 @@  #define LINKRATE_30			(0x02 << 8)  #define LINKRATE_60			(0x04 << 8) +/* for phy state */ + +#define PHY_STATE_LINK_UP_SPC		0x1 +  /* for new SPC controllers MEMBASE III is shared between BIOS and DATA */  #define GSM_SM_BASE			0x4F0000  struct mpi_msg_hdr{ diff --git a/drivers/scsi/pm8001/pm8001_init.c b/drivers/scsi/pm8001/pm8001_init.c index 34f5f5ffef05..73a120d81b4d 100644 --- a/drivers/scsi/pm8001/pm8001_init.c +++ b/drivers/scsi/pm8001/pm8001_init.c @@ -175,20 +175,16 @@ static void pm8001_free(struct pm8001_hba_info *pm8001_ha)  static void pm8001_tasklet(unsigned long opaque)  {  	struct pm8001_hba_info *pm8001_ha; -	u32 vec; -	pm8001_ha = (struct pm8001_hba_info *)opaque; +	struct isr_param *irq_vector; + +	irq_vector = (struct isr_param *)opaque; +	pm8001_ha = irq_vector->drv_inst;  	if (unlikely(!pm8001_ha))  		BUG_ON(1); -	vec = pm8001_ha->int_vector; -	PM8001_CHIP_DISP->isr(pm8001_ha, vec); +	PM8001_CHIP_DISP->isr(pm8001_ha, irq_vector->irq_id);  }  #endif -static struct  pm8001_hba_info *outq_to_hba(u8 *outq) -{ -	return container_of((outq - *outq), struct pm8001_hba_info, outq[0]); -} -  /**   * pm8001_interrupt_handler_msix - main MSIX interrupt handler.   * It obtains the vector number and calls the equivalent bottom @@ -198,18 +194,20 @@ static struct  pm8001_hba_info *outq_to_hba(u8 *outq)   */  static irqreturn_t pm8001_interrupt_handler_msix(int irq, void *opaque)  { -	struct pm8001_hba_info *pm8001_ha = outq_to_hba(opaque); -	u8 outq = *(u8 *)opaque; +	struct isr_param *irq_vector; +	struct pm8001_hba_info *pm8001_ha;  	irqreturn_t ret = IRQ_HANDLED; +	irq_vector = (struct isr_param *)opaque; +	pm8001_ha = irq_vector->drv_inst; +  	if (unlikely(!pm8001_ha))  		return IRQ_NONE;  	if (!PM8001_CHIP_DISP->is_our_interupt(pm8001_ha))  		return IRQ_NONE; -	pm8001_ha->int_vector = outq;  #ifdef PM8001_USE_TASKLET -	tasklet_schedule(&pm8001_ha->tasklet); +	tasklet_schedule(&pm8001_ha->tasklet[irq_vector->irq_id]);  #else -	ret = PM8001_CHIP_DISP->isr(pm8001_ha, outq); +	ret = PM8001_CHIP_DISP->isr(pm8001_ha, irq_vector->irq_id);  #endif  	return ret;  } @@ -230,9 +228,8 @@ static irqreturn_t pm8001_interrupt_handler_intx(int irq, void *dev_id)  	if (!PM8001_CHIP_DISP->is_our_interupt(pm8001_ha))  		return IRQ_NONE; -	pm8001_ha->int_vector = 0;  #ifdef PM8001_USE_TASKLET -	tasklet_schedule(&pm8001_ha->tasklet); +	tasklet_schedule(&pm8001_ha->tasklet[0]);  #else  	ret = PM8001_CHIP_DISP->isr(pm8001_ha, 0);  #endif @@ -457,7 +454,7 @@ static struct pm8001_hba_info *pm8001_pci_alloc(struct pci_dev *pdev,  {  	struct pm8001_hba_info *pm8001_ha;  	struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost); - +	int j;  	pm8001_ha = sha->lldd_ha;  	if (!pm8001_ha) @@ -480,12 +477,14 @@ static struct pm8001_hba_info *pm8001_pci_alloc(struct pci_dev *pdev,  		pm8001_ha->iomb_size = IOMB_SIZE_SPC;  #ifdef PM8001_USE_TASKLET -	/** -	* default tasklet for non msi-x interrupt handler/first msi-x -	* interrupt handler -	**/ -	tasklet_init(&pm8001_ha->tasklet, pm8001_tasklet, -			(unsigned long)pm8001_ha); +	/* Tasklet for non msi-x interrupt handler */ +	if ((!pdev->msix_cap) || (pm8001_ha->chip_id == chip_8001)) +		tasklet_init(&pm8001_ha->tasklet[0], pm8001_tasklet, +			(unsigned long)&(pm8001_ha->irq_vector[0])); +	else +		for (j = 0; j < PM8001_MAX_MSIX_VEC; j++) +			tasklet_init(&pm8001_ha->tasklet[j], pm8001_tasklet, +				(unsigned long)&(pm8001_ha->irq_vector[j]));  #endif  	pm8001_ioremap(pm8001_ha);  	if (!pm8001_alloc(pm8001_ha, ent)) @@ -733,19 +732,20 @@ static u32 pm8001_setup_msix(struct pm8001_hba_info *pm8001_ha)  			"pci_enable_msix request ret:%d no of intr %d\n",  					rc, pm8001_ha->number_of_intr)); -		for (i = 0; i < number_of_intr; i++) -			pm8001_ha->outq[i] = i;  		for (i = 0; i < number_of_intr; i++) {  			snprintf(intr_drvname[i], sizeof(intr_drvname[0]),  					DRV_NAME"%d", i); +			pm8001_ha->irq_vector[i].irq_id = i; +			pm8001_ha->irq_vector[i].drv_inst = pm8001_ha; +  			if (request_irq(pm8001_ha->msix_entries[i].vector,  				pm8001_interrupt_handler_msix, flag, -				intr_drvname[i], &pm8001_ha->outq[i])) { +				intr_drvname[i], &(pm8001_ha->irq_vector[i]))) {  				for (j = 0; j < i; j++)  					free_irq(  					pm8001_ha->msix_entries[j].vector, -					&pm8001_ha->outq[j]); +					&(pm8001_ha->irq_vector[i]));  				pci_disable_msix(pm8001_ha->pdev);  				break;  			} @@ -907,7 +907,7 @@ static void pm8001_pci_remove(struct pci_dev *pdev)  {  	struct sas_ha_struct *sha = pci_get_drvdata(pdev);  	struct pm8001_hba_info *pm8001_ha; -	int i; +	int i, j;  	pm8001_ha = sha->lldd_ha;  	sas_unregister_ha(sha);  	sas_remove_host(pm8001_ha->shost); @@ -921,13 +921,18 @@ static void pm8001_pci_remove(struct pci_dev *pdev)  		synchronize_irq(pm8001_ha->msix_entries[i].vector);  	for (i = 0; i < pm8001_ha->number_of_intr; i++)  		free_irq(pm8001_ha->msix_entries[i].vector, -				&pm8001_ha->outq[i]); +				&(pm8001_ha->irq_vector[i]));  	pci_disable_msix(pdev);  #else  	free_irq(pm8001_ha->irq, sha);  #endif  #ifdef PM8001_USE_TASKLET -	tasklet_kill(&pm8001_ha->tasklet); +	/* For non-msix and msix interrupts */ +	if ((!pdev->msix_cap) || (pm8001_ha->chip_id == chip_8001)) +		tasklet_kill(&pm8001_ha->tasklet[0]); +	else +		for (j = 0; j < PM8001_MAX_MSIX_VEC; j++) +			tasklet_kill(&pm8001_ha->tasklet[j]);  #endif  	pm8001_free(pm8001_ha);  	kfree(sha->sas_phy); @@ -948,7 +953,7 @@ static int pm8001_pci_suspend(struct pci_dev *pdev, pm_message_t state)  {  	struct sas_ha_struct *sha = pci_get_drvdata(pdev);  	struct pm8001_hba_info *pm8001_ha; -	int i; +	int  i, j;  	u32 device_state;  	pm8001_ha = sha->lldd_ha;  	flush_workqueue(pm8001_wq); @@ -964,13 +969,18 @@ static int pm8001_pci_suspend(struct pci_dev *pdev, pm_message_t state)  		synchronize_irq(pm8001_ha->msix_entries[i].vector);  	for (i = 0; i < pm8001_ha->number_of_intr; i++)  		free_irq(pm8001_ha->msix_entries[i].vector, -				&pm8001_ha->outq[i]); +				&(pm8001_ha->irq_vector[i]));  	pci_disable_msix(pdev);  #else  	free_irq(pm8001_ha->irq, sha);  #endif  #ifdef PM8001_USE_TASKLET -	tasklet_kill(&pm8001_ha->tasklet); +	/* For non-msix and msix interrupts */ +	if ((!pdev->msix_cap) || (pm8001_ha->chip_id == chip_8001)) +		tasklet_kill(&pm8001_ha->tasklet[0]); +	else +		for (j = 0; j < PM8001_MAX_MSIX_VEC; j++) +			tasklet_kill(&pm8001_ha->tasklet[j]);  #endif  	device_state = pci_choose_state(pdev, state);  	pm8001_printk("pdev=0x%p, slot=%s, entering " @@ -993,7 +1003,7 @@ static int pm8001_pci_resume(struct pci_dev *pdev)  	struct sas_ha_struct *sha = pci_get_drvdata(pdev);  	struct pm8001_hba_info *pm8001_ha;  	int rc; -	u8 i = 0; +	u8 i = 0, j;  	u32 device_state;  	pm8001_ha = sha->lldd_ha;  	device_state = pdev->current_state; @@ -1033,10 +1043,14 @@ static int pm8001_pci_resume(struct pci_dev *pdev)  	if (rc)  		goto err_out_disable;  #ifdef PM8001_USE_TASKLET -	/* default tasklet for non msi-x interrupt handler/first msi-x -	* interrupt handler */ -	tasklet_init(&pm8001_ha->tasklet, pm8001_tasklet, -			(unsigned long)pm8001_ha); +	/*  Tasklet for non msi-x interrupt handler */ +	if ((!pdev->msix_cap) || (pm8001_ha->chip_id == chip_8001)) +		tasklet_init(&pm8001_ha->tasklet[0], pm8001_tasklet, +			(unsigned long)&(pm8001_ha->irq_vector[0])); +	else +		for (j = 0; j < PM8001_MAX_MSIX_VEC; j++) +			tasklet_init(&pm8001_ha->tasklet[j], pm8001_tasklet, +				(unsigned long)&(pm8001_ha->irq_vector[j]));  #endif  	PM8001_CHIP_DISP->interrupt_enable(pm8001_ha, 0);  	if (pm8001_ha->chip_id != chip_8001) { @@ -1169,6 +1183,7 @@ module_exit(pm8001_exit);  MODULE_AUTHOR("Jack Wang <[email protected]>");  MODULE_AUTHOR("Anand Kumar Santhanam <[email protected]>");  MODULE_AUTHOR("Sangeetha Gnanasekaran <[email protected]>"); +MODULE_AUTHOR("Nikith Ganigarakoppal <[email protected]>");  MODULE_DESCRIPTION(  		"PMC-Sierra PM8001/8081/8088/8089/8074/8076/8077 "  		"SAS/SATA controller driver"); diff --git a/drivers/scsi/pm8001/pm8001_sas.c b/drivers/scsi/pm8001/pm8001_sas.c index f4eb18e51631..f50ac44b950e 100644 --- a/drivers/scsi/pm8001/pm8001_sas.c +++ b/drivers/scsi/pm8001/pm8001_sas.c @@ -1098,15 +1098,17 @@ int pm8001_lu_reset(struct domain_device *dev, u8 *lun)  	struct pm8001_tmf_task tmf_task;  	struct pm8001_device *pm8001_dev = dev->lldd_dev;  	struct pm8001_hba_info *pm8001_ha = pm8001_find_ha_by_dev(dev); +	DECLARE_COMPLETION_ONSTACK(completion_setstate);  	if (dev_is_sata(dev)) {  		struct sas_phy *phy = sas_get_local_phy(dev);  		rc = pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev ,  			dev, 1, 0);  		rc = sas_phy_reset(phy, 1);  		sas_put_local_phy(phy); +		pm8001_dev->setds_completion = &completion_setstate;  		rc = PM8001_CHIP_DISP->set_dev_state_req(pm8001_ha,  			pm8001_dev, 0x01); -		msleep(2000); +		wait_for_completion(&completion_setstate);  	} else {  		tmf_task.tmf = TMF_LU_RESET;  		rc = pm8001_issue_ssp_tmf(dev, lun, &tmf_task); diff --git a/drivers/scsi/pm8001/pm8001_sas.h b/drivers/scsi/pm8001/pm8001_sas.h index 6037d477a183..6c5fd5ee22d3 100644 --- a/drivers/scsi/pm8001/pm8001_sas.h +++ b/drivers/scsi/pm8001/pm8001_sas.h @@ -466,6 +466,10 @@ struct pm8001_hba_memspace {  	u64			membase;  	u32			memsize;  }; +struct isr_param { +	struct pm8001_hba_info *drv_inst; +	u32 irq_id; +};  struct pm8001_hba_info {  	char			name[PM8001_NAME_LENGTH];  	struct list_head	list; @@ -519,14 +523,13 @@ struct pm8001_hba_info {  	int			number_of_intr;/*will be used in remove()*/  #endif  #ifdef PM8001_USE_TASKLET -	struct tasklet_struct	tasklet; +	struct tasklet_struct	tasklet[PM8001_MAX_MSIX_VEC];  #endif  	u32			logging_level;  	u32			fw_status;  	u32			smp_exp_mode; -	u32			int_vector;  	const struct firmware 	*fw_image; -	u8			outq[PM8001_MAX_MSIX_VEC]; +	struct isr_param irq_vector[PM8001_MAX_MSIX_VEC];  };  struct pm8001_work { diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c index 8987b1706216..c950dc5c9943 100644 --- a/drivers/scsi/pm8001/pm80xx_hwi.c +++ b/drivers/scsi/pm8001/pm80xx_hwi.c @@ -2894,6 +2894,7 @@ hw_event_sas_phy_up(struct pm8001_hba_info *pm8001_ha, void *piomb)  	unsigned long flags;  	u8 deviceType = pPayload->sas_identify.dev_type;  	port->port_state = portstate; +	phy->phy_state = PHY_STATE_LINK_UP_SPCV;  	PM8001_MSG_DBG(pm8001_ha, pm8001_printk(  		"portid:%d; phyid:%d; linkrate:%d; "  		"portstate:%x; devicetype:%x\n", @@ -2978,6 +2979,7 @@ hw_event_sata_phy_up(struct pm8001_hba_info *pm8001_ha, void *piomb)  				port_id, phy_id, link_rate, portstate));  	port->port_state = portstate; +	phy->phy_state = PHY_STATE_LINK_UP_SPCV;  	port->port_attached = 1;  	pm8001_get_lrate_mode(phy, link_rate);  	phy->phy_type |= PORT_TYPE_SATA; diff --git a/drivers/scsi/pm8001/pm80xx_hwi.h b/drivers/scsi/pm8001/pm80xx_hwi.h index c86816bea424..9970a385795d 100644 --- a/drivers/scsi/pm8001/pm80xx_hwi.h +++ b/drivers/scsi/pm8001/pm80xx_hwi.h @@ -215,6 +215,8 @@  #define SAS_DOPNRJT_RTRY_TMO            128  #define SAS_COPNRJT_RTRY_TMO            128 +/* for phy state */ +#define PHY_STATE_LINK_UP_SPCV		0x2  /*    Making ORR bigger than IT NEXUS LOSS which is 2000000us = 2 second.    Assuming a bigger value 3 second, 3000000/128 = 23437.5 where 128 diff --git a/drivers/scsi/pmcraid.c b/drivers/scsi/pmcraid.c index 892ea6161376..be8ce54f99b2 100644 --- a/drivers/scsi/pmcraid.c +++ b/drivers/scsi/pmcraid.c @@ -4325,6 +4325,7 @@ static struct scsi_host_template pmcraid_host_template = {  	.this_id = -1,  	.sg_tablesize = PMCRAID_MAX_IOADLS,  	.max_sectors = PMCRAID_IOA_MAX_SECTORS, +	.no_write_same = 1,  	.cmd_per_lun = PMCRAID_MAX_CMD_PER_LUN,  	.use_clustering = ENABLE_CLUSTERING,  	.shost_attrs = pmcraid_host_attrs, diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index e6c4bff04339..69725f7c32c1 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -2659,6 +2659,12 @@ static void sd_read_write_same(struct scsi_disk *sdkp, unsigned char *buffer)  {  	struct scsi_device *sdev = sdkp->device; +	if (sdev->host->no_write_same) { +		sdev->no_write_same = 1; + +		return; +	} +  	if (scsi_report_opcode(sdev, buffer, SD_BUF_SIZE, INQUIRY) < 0) {  		/* too large values might cause issues with arcmsr */  		int vpd_buf_len = 64; diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c index 1a28f5632797..17d740427240 100644 --- a/drivers/scsi/storvsc_drv.c +++ b/drivers/scsi/storvsc_drv.c @@ -1697,6 +1697,7 @@ static struct scsi_host_template scsi_driver = {  	.use_clustering =	DISABLE_CLUSTERING,  	/* Make sure we dont get a sg segment crosses a page boundary */  	.dma_boundary =		PAGE_SIZE-1, +	.no_write_same =	1,  };  enum { diff --git a/drivers/staging/tidspbridge/rmgr/drv_interface.c b/drivers/staging/tidspbridge/rmgr/drv_interface.c index 1aa4a3fd0f1b..56e355b3e7fa 100644 --- a/drivers/staging/tidspbridge/rmgr/drv_interface.c +++ b/drivers/staging/tidspbridge/rmgr/drv_interface.c @@ -258,7 +258,8 @@ err:  /* This function maps kernel space memory to user space memory. */  static int bridge_mmap(struct file *filp, struct vm_area_struct *vma)  { -	u32 status; +	struct omap_dsp_platform_data *pdata = +					omap_dspbridge_dev->dev.platform_data;  	/* VM_IO | VM_DONTEXPAND | VM_DONTDUMP are set by remap_pfn_range() */  	vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); @@ -268,13 +269,9 @@ static int bridge_mmap(struct file *filp, struct vm_area_struct *vma)  		vma->vm_start, vma->vm_end, vma->vm_page_prot,  		vma->vm_flags); -	status = remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, -				 vma->vm_end - vma->vm_start, -				 vma->vm_page_prot); -	if (status != 0) -		status = -EAGAIN; - -	return status; +	return vm_iomap_memory(vma, +			       pdata->phys_mempool_base, +			       pdata->phys_mempool_size);  }  static const struct file_operations bridge_fops = { diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c index 0f74945af624..268b62768f2b 100644 --- a/drivers/tty/n_tty.c +++ b/drivers/tty/n_tty.c @@ -810,7 +810,8 @@ static void process_echoes(struct tty_struct *tty)  	struct n_tty_data *ldata = tty->disc_data;  	size_t echoed; -	if (!L_ECHO(tty) || ldata->echo_commit == ldata->echo_tail) +	if ((!L_ECHO(tty) && !L_ECHONL(tty)) || +	    ldata->echo_commit == ldata->echo_tail)  		return;  	mutex_lock(&ldata->output_lock); @@ -825,7 +826,8 @@ static void flush_echoes(struct tty_struct *tty)  {  	struct n_tty_data *ldata = tty->disc_data; -	if (!L_ECHO(tty) || ldata->echo_commit == ldata->echo_head) +	if ((!L_ECHO(tty) && !L_ECHONL(tty)) || +	    ldata->echo_commit == ldata->echo_head)  		return;  	mutex_lock(&ldata->output_lock); diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 3e7560f004f8..e8404319ca68 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c @@ -1515,6 +1515,8 @@ static int acm_reset_resume(struct usb_interface *intf)  static const struct usb_device_id acm_ids[] = {  	/* quirky and broken devices */ +	{ USB_DEVICE(0x17ef, 0x7000), /* Lenovo USB modem */ +	.driver_info = NO_UNION_NORMAL, },/* has no union descriptor */  	{ USB_DEVICE(0x0870, 0x0001), /* Metricom GS Modem */  	.driver_info = NO_UNION_NORMAL, /* has no union descriptor */  	}, diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index a7c04e24ca48..bd9dc3504b51 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -4832,8 +4832,9 @@ static void hub_events(void)  					hub->ports[i - 1]->child;  				dev_dbg(hub_dev, "warm reset port %d\n", i); -				if (!udev || !(portstatus & -						USB_PORT_STAT_CONNECTION)) { +				if (!udev || +				    !(portstatus & USB_PORT_STAT_CONNECTION) || +				    udev->state == USB_STATE_NOTATTACHED) {  					status = hub_port_reset(hub, i,  							NULL, HUB_BH_RESET_TIME,  							true); diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c index 95f7649c71a7..21a352079bc2 100644 --- a/drivers/usb/dwc3/ep0.c +++ b/drivers/usb/dwc3/ep0.c @@ -459,6 +459,8 @@ static int dwc3_ep0_handle_feature(struct dwc3 *dwc,  			dep = dwc3_wIndex_to_dep(dwc, wIndex);  			if (!dep)  				return -EINVAL; +			if (set == 0 && (dep->flags & DWC3_EP_WEDGE)) +				break;  			ret = __dwc3_gadget_ep_set_halt(dep, set);  			if (ret)  				return -EINVAL; diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 5452c0fce360..02e44fcaf205 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -1200,9 +1200,6 @@ int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value)  		else  			dep->flags |= DWC3_EP_STALL;  	} else { -		if (dep->flags & DWC3_EP_WEDGE) -			return 0; -  		ret = dwc3_send_gadget_ep_cmd(dwc, dep->number,  			DWC3_DEPCMD_CLEARSTALL, ¶ms);  		if (ret) @@ -1210,7 +1207,7 @@ int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value)  					value ? "set" : "clear",  					dep->name);  		else -			dep->flags &= ~DWC3_EP_STALL; +			dep->flags &= ~(DWC3_EP_STALL | DWC3_EP_WEDGE);  	}  	return ret; diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index a91e6422f930..f66d96ad1f51 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig @@ -682,6 +682,7 @@ config USB_CONFIGFS_PHONET  config USB_CONFIGFS_MASS_STORAGE  	boolean "Mass storage"  	depends on USB_CONFIGFS +	depends on BLOCK  	select USB_F_MASS_STORAGE  	help  	  The Mass Storage Gadget acts as a USB Mass Storage disk drive. diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index 3e7ae707f691..2018ba1a2172 100644 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c @@ -593,6 +593,7 @@ static void reset_config(struct usb_composite_dev *cdev)  		bitmap_zero(f->endpoints, 32);  	}  	cdev->config = NULL; +	cdev->delayed_status = 0;  }  static int set_config(struct usb_composite_dev *cdev, diff --git a/drivers/usb/gadget/f_fs.c b/drivers/usb/gadget/f_fs.c index 774e8b89cdb5..241fc873ffa4 100644 --- a/drivers/usb/gadget/f_fs.c +++ b/drivers/usb/gadget/f_fs.c @@ -1304,7 +1304,7 @@ static struct ffs_data *ffs_data_new(void)  {  	struct ffs_data *ffs = kzalloc(sizeof *ffs, GFP_KERNEL);  	if (unlikely(!ffs)) -		return 0; +		return NULL;  	ENTER(); diff --git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c index a03ba2c83589..b96393908860 100644 --- a/drivers/usb/gadget/f_mass_storage.c +++ b/drivers/usb/gadget/f_mass_storage.c @@ -523,7 +523,7 @@ static int fsg_setup(struct usb_function *f,  		 */  		DBG(fsg, "bulk reset request\n");  		raise_exception(fsg->common, FSG_STATE_RESET); -		return DELAYED_STATUS; +		return USB_GADGET_DELAYED_STATUS;  	case US_BULK_GET_MAX_LUN:  		if (ctrl->bRequestType != @@ -602,13 +602,14 @@ static bool start_out_transfer(struct fsg_common *common, struct fsg_buffhd *bh)  	return true;  } -static int sleep_thread(struct fsg_common *common) +static int sleep_thread(struct fsg_common *common, bool can_freeze)  {  	int	rc = 0;  	/* Wait until a signal arrives or we are woken up */  	for (;;) { -		try_to_freeze(); +		if (can_freeze) +			try_to_freeze();  		set_current_state(TASK_INTERRUPTIBLE);  		if (signal_pending(current)) {  			rc = -EINTR; @@ -682,7 +683,7 @@ static int do_read(struct fsg_common *common)  		/* Wait for the next buffer to become available */  		bh = common->next_buffhd_to_fill;  		while (bh->state != BUF_STATE_EMPTY) { -			rc = sleep_thread(common); +			rc = sleep_thread(common, false);  			if (rc)  				return rc;  		} @@ -937,7 +938,7 @@ static int do_write(struct fsg_common *common)  		}  		/* Wait for something to happen */ -		rc = sleep_thread(common); +		rc = sleep_thread(common, false);  		if (rc)  			return rc;  	} @@ -1504,7 +1505,7 @@ static int throw_away_data(struct fsg_common *common)  		}  		/* Otherwise wait for something to happen */ -		rc = sleep_thread(common); +		rc = sleep_thread(common, true);  		if (rc)  			return rc;  	} @@ -1625,7 +1626,7 @@ static int send_status(struct fsg_common *common)  	/* Wait for the next buffer to become available */  	bh = common->next_buffhd_to_fill;  	while (bh->state != BUF_STATE_EMPTY) { -		rc = sleep_thread(common); +		rc = sleep_thread(common, true);  		if (rc)  			return rc;  	} @@ -1828,7 +1829,7 @@ static int do_scsi_command(struct fsg_common *common)  	bh = common->next_buffhd_to_fill;  	common->next_buffhd_to_drain = bh;  	while (bh->state != BUF_STATE_EMPTY) { -		rc = sleep_thread(common); +		rc = sleep_thread(common, true);  		if (rc)  			return rc;  	} @@ -2174,7 +2175,7 @@ static int get_next_command(struct fsg_common *common)  	/* Wait for the next buffer to become available */  	bh = common->next_buffhd_to_fill;  	while (bh->state != BUF_STATE_EMPTY) { -		rc = sleep_thread(common); +		rc = sleep_thread(common, true);  		if (rc)  			return rc;  	} @@ -2193,7 +2194,7 @@ static int get_next_command(struct fsg_common *common)  	/* Wait for the CBW to arrive */  	while (bh->state != BUF_STATE_FULL) { -		rc = sleep_thread(common); +		rc = sleep_thread(common, true);  		if (rc)  			return rc;  	} @@ -2379,7 +2380,7 @@ static void handle_exception(struct fsg_common *common)  			}  			if (num_active == 0)  				break; -			if (sleep_thread(common)) +			if (sleep_thread(common, true))  				return;  		} @@ -2516,7 +2517,7 @@ static int fsg_main_thread(void *common_)  		}  		if (!common->running) { -			sleep_thread(common); +			sleep_thread(common, true);  			continue;  		} @@ -3111,7 +3112,7 @@ static int fsg_bind(struct usb_configuration *c, struct usb_function *f)  					  fsg->common->can_stall);  		if (ret)  			return ret; -		fsg_common_set_inquiry_string(fsg->common, 0, 0); +		fsg_common_set_inquiry_string(fsg->common, NULL, NULL);  		ret = fsg_common_run_thread(fsg->common);  		if (ret)  			return ret; diff --git a/drivers/usb/gadget/pxa25x_udc.c b/drivers/usb/gadget/pxa25x_udc.c index 0ac6064aa3b8..409a3c45a36a 100644 --- a/drivers/usb/gadget/pxa25x_udc.c +++ b/drivers/usb/gadget/pxa25x_udc.c @@ -54,6 +54,7 @@   */  #ifdef CONFIG_ARCH_PXA  #include <mach/pxa25x-udc.h> +#include <mach/hardware.h>  #endif  #ifdef CONFIG_ARCH_LUBBOCK diff --git a/drivers/usb/gadget/s3c-hsotg.c b/drivers/usb/gadget/s3c-hsotg.c index 9875d9c0823f..e20bc109fdd7 100644 --- a/drivers/usb/gadget/s3c-hsotg.c +++ b/drivers/usb/gadget/s3c-hsotg.c @@ -1180,6 +1180,7 @@ static int s3c_hsotg_process_req_feature(struct s3c_hsotg *hsotg,  }  static void s3c_hsotg_enqueue_setup(struct s3c_hsotg *hsotg); +static void s3c_hsotg_disconnect(struct s3c_hsotg *hsotg);  /**   * s3c_hsotg_process_control - process a control request @@ -1221,6 +1222,7 @@ static void s3c_hsotg_process_control(struct s3c_hsotg *hsotg,  	if ((ctrl->bRequestType & USB_TYPE_MASK) == USB_TYPE_STANDARD) {  		switch (ctrl->bRequest) {  		case USB_REQ_SET_ADDRESS: +			s3c_hsotg_disconnect(hsotg);  			dcfg = readl(hsotg->regs + DCFG);  			dcfg &= ~DCFG_DevAddr_MASK;  			dcfg |= ctrl->wValue << DCFG_DevAddr_SHIFT; @@ -1245,7 +1247,9 @@ static void s3c_hsotg_process_control(struct s3c_hsotg *hsotg,  	/* as a fallback, try delivering it to the driver to deal with */  	if (ret == 0 && hsotg->driver) { +		spin_unlock(&hsotg->lock);  		ret = hsotg->driver->setup(&hsotg->gadget, ctrl); +		spin_lock(&hsotg->lock);  		if (ret < 0)  			dev_dbg(hsotg->dev, "driver->setup() ret %d\n", ret);  	} @@ -1308,10 +1312,12 @@ static void s3c_hsotg_complete_setup(struct usb_ep *ep,  		return;  	} +	spin_lock(&hsotg->lock);  	if (req->actual == 0)  		s3c_hsotg_enqueue_setup(hsotg);  	else  		s3c_hsotg_process_control(hsotg, req->buf); +	spin_unlock(&hsotg->lock);  }  /** @@ -2533,7 +2539,6 @@ irq_retry:  		writel(GINTSTS_USBSusp, hsotg->regs + GINTSTS);  		call_gadget(hsotg, suspend); -		s3c_hsotg_disconnect(hsotg);  	}  	if (gintsts & GINTSTS_WkUpInt) { diff --git a/drivers/usb/gadget/storage_common.h b/drivers/usb/gadget/storage_common.h index c74c2fdbd56e..70c891469f57 100644 --- a/drivers/usb/gadget/storage_common.h +++ b/drivers/usb/gadget/storage_common.h @@ -119,10 +119,6 @@ static inline bool fsg_lun_is_open(struct fsg_lun *curlun)  	return curlun->filp != NULL;  } -/* Big enough to hold our biggest descriptor */ -#define EP0_BUFSIZE	256 -#define DELAYED_STATUS	(EP0_BUFSIZE + 999)	/* An impossibly large value */ -  /* Default size of buffer length. */  #define FSG_BUFLEN	((u32)16384) diff --git a/drivers/usb/gadget/tcm_usb_gadget.c b/drivers/usb/gadget/tcm_usb_gadget.c index 6c3d7950d2a9..0f8aad78b54f 100644 --- a/drivers/usb/gadget/tcm_usb_gadget.c +++ b/drivers/usb/gadget/tcm_usb_gadget.c @@ -370,7 +370,7 @@ err:  	return -ENOMEM;  } -void bot_cleanup_old_alt(struct f_uas *fu) +static void bot_cleanup_old_alt(struct f_uas *fu)  {  	if (!(fu->flags & USBG_ENABLED))  		return; diff --git a/drivers/usb/gadget/zero.c b/drivers/usb/gadget/zero.c index 0dd07ae1555d..f49b0b61ecc8 100644 --- a/drivers/usb/gadget/zero.c +++ b/drivers/usb/gadget/zero.c @@ -91,17 +91,17 @@ static struct usb_zero_options gzero_options = {   * functional coverage for the "USBCV" test harness from USB-IF.   * It's always set if OTG mode is enabled.   */ -unsigned autoresume = DEFAULT_AUTORESUME; +static unsigned autoresume = DEFAULT_AUTORESUME;  module_param(autoresume, uint, S_IRUGO);  MODULE_PARM_DESC(autoresume, "zero, or seconds before remote wakeup");  /* Maximum Autoresume time */ -unsigned max_autoresume; +static unsigned max_autoresume;  module_param(max_autoresume, uint, S_IRUGO);  MODULE_PARM_DESC(max_autoresume, "maximum seconds before remote wakeup");  /* Interval between two remote wakeups */ -unsigned autoresume_interval_ms; +static unsigned autoresume_interval_ms;  module_param(autoresume_interval_ms, uint, S_IRUGO);  MODULE_PARM_DESC(autoresume_interval_ms,  		"milliseconds to increase successive wakeup delays"); diff --git a/drivers/usb/host/ohci-pxa27x.c b/drivers/usb/host/ohci-pxa27x.c index e89ac4d4b87e..9b7435f0dcd6 100644 --- a/drivers/usb/host/ohci-pxa27x.c +++ b/drivers/usb/host/ohci-pxa27x.c @@ -21,6 +21,7 @@  #include <linux/clk.h>  #include <linux/device.h> +#include <linux/dma-mapping.h>  #include <linux/io.h>  #include <linux/kernel.h>  #include <linux/module.h> diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 1e2f3f495843..53c2e296467f 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c @@ -2973,8 +2973,58 @@ static int prepare_ring(struct xhci_hcd *xhci, struct xhci_ring *ep_ring,  	}  	while (1) { -		if (room_on_ring(xhci, ep_ring, num_trbs)) -			break; +		if (room_on_ring(xhci, ep_ring, num_trbs)) { +			union xhci_trb *trb = ep_ring->enqueue; +			unsigned int usable = ep_ring->enq_seg->trbs + +					TRBS_PER_SEGMENT - 1 - trb; +			u32 nop_cmd; + +			/* +			 * Section 4.11.7.1 TD Fragments states that a link +			 * TRB must only occur at the boundary between +			 * data bursts (eg 512 bytes for 480M). +			 * While it is possible to split a large fragment +			 * we don't know the size yet. +			 * Simplest solution is to fill the trb before the +			 * LINK with nop commands. +			 */ +			if (num_trbs == 1 || num_trbs <= usable || usable == 0) +				break; + +			if (ep_ring->type != TYPE_BULK) +				/* +				 * While isoc transfers might have a buffer that +				 * crosses a 64k boundary it is unlikely. +				 * Since we can't add NOPs without generating +				 * gaps in the traffic just hope it never +				 * happens at the end of the ring. +				 * This could be fixed by writing a LINK TRB +				 * instead of the first NOP - however the +				 * TRB_TYPE_LINK_LE32() calls would all need +				 * changing to check the ring length. +				 */ +				break; + +			if (num_trbs >= TRBS_PER_SEGMENT) { +				xhci_err(xhci, "Too many fragments %d, max %d\n", +						num_trbs, TRBS_PER_SEGMENT - 1); +				return -ENOMEM; +			} + +			nop_cmd = cpu_to_le32(TRB_TYPE(TRB_TR_NOOP) | +					ep_ring->cycle_state); +			ep_ring->num_trbs_free -= usable; +			do { +				trb->generic.field[0] = 0; +				trb->generic.field[1] = 0; +				trb->generic.field[2] = 0; +				trb->generic.field[3] = nop_cmd; +				trb++; +			} while (--usable); +			ep_ring->enqueue = trb; +			if (room_on_ring(xhci, ep_ring, num_trbs)) +				break; +		}  		if (ep_ring == xhci->cmd_ring) {  			xhci_err(xhci, "Do not support expand command ring\n"); diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index 0a43329569d1..4d4499b80449 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c @@ -1809,7 +1809,6 @@ static void musb_free(struct musb *musb)  			disable_irq_wake(musb->nIrq);  		free_irq(musb->nIrq, musb);  	} -	cancel_work_sync(&musb->irq_work);  	musb_host_free(musb);  } @@ -1896,6 +1895,9 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)  	musb_platform_disable(musb);  	musb_generic_disable(musb); +	/* Init IRQ workqueue before request_irq */ +	INIT_WORK(&musb->irq_work, musb_irq_work); +  	/* setup musb parts of the core (especially endpoints) */  	status = musb_core_init(plat->config->multipoint  			? MUSB_CONTROLLER_MHDRC @@ -1905,9 +1907,6 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)  	setup_timer(&musb->otg_timer, musb_otg_timer_func, (unsigned long) musb); -	/* Init IRQ workqueue before request_irq */ -	INIT_WORK(&musb->irq_work, musb_irq_work); -  	/* attach to the IRQ */  	if (request_irq(nIrq, musb->isr, 0, dev_name(dev), musb)) {  		dev_err(dev, "request_irq %d failed!\n", nIrq); @@ -1981,6 +1980,7 @@ fail4:  	musb_host_cleanup(musb);  fail3: +	cancel_work_sync(&musb->irq_work);  	if (musb->dma_controller)  		dma_controller_destroy(musb->dma_controller);  fail2_5: @@ -2043,6 +2043,7 @@ static int musb_remove(struct platform_device *pdev)  	if (musb->dma_controller)  		dma_controller_destroy(musb->dma_controller); +	cancel_work_sync(&musb->irq_work);  	musb_free(musb);  	device_init_wakeup(dev, 0);  	return 0; diff --git a/drivers/usb/musb/musb_cppi41.c b/drivers/usb/musb/musb_cppi41.c index ff9d6de2b746..a12bd30401e0 100644 --- a/drivers/usb/musb/musb_cppi41.c +++ b/drivers/usb/musb/musb_cppi41.c @@ -38,6 +38,7 @@ struct cppi41_dma_channel {  	u32 prog_len;  	u32 transferred;  	u32 packet_sz; +	struct list_head tx_check;  };  #define MUSB_DMA_NUM_CHANNELS 15 @@ -47,6 +48,8 @@ struct cppi41_dma_controller {  	struct cppi41_dma_channel rx_channel[MUSB_DMA_NUM_CHANNELS];  	struct cppi41_dma_channel tx_channel[MUSB_DMA_NUM_CHANNELS];  	struct musb *musb; +	struct hrtimer early_tx; +	struct list_head early_tx_list;  	u32 rx_mode;  	u32 tx_mode;  	u32 auto_req; @@ -96,31 +99,27 @@ static void update_rx_toggle(struct cppi41_dma_channel *cppi41_channel)  	cppi41_channel->usb_toggle = toggle;  } -static void cppi41_dma_callback(void *private_data) +static bool musb_is_tx_fifo_empty(struct musb_hw_ep *hw_ep)  { -	struct dma_channel *channel = private_data; -	struct cppi41_dma_channel *cppi41_channel = channel->private_data; -	struct musb_hw_ep *hw_ep = cppi41_channel->hw_ep; -	struct musb *musb = hw_ep->musb; -	unsigned long flags; -	struct dma_tx_state txstate; -	u32 transferred; +	u8		epnum = hw_ep->epnum; +	struct musb	*musb = hw_ep->musb; +	void __iomem	*epio = musb->endpoints[epnum].regs; +	u16		csr; -	spin_lock_irqsave(&musb->lock, flags); +	csr = musb_readw(epio, MUSB_TXCSR); +	if (csr & MUSB_TXCSR_TXPKTRDY) +		return false; +	return true; +} -	dmaengine_tx_status(cppi41_channel->dc, cppi41_channel->cookie, -			&txstate); -	transferred = cppi41_channel->prog_len - txstate.residue; -	cppi41_channel->transferred += transferred; +static void cppi41_dma_callback(void *private_data); -	dev_dbg(musb->controller, "DMA transfer done on hw_ep=%d bytes=%d/%d\n", -		hw_ep->epnum, cppi41_channel->transferred, -		cppi41_channel->total_len); +static void cppi41_trans_done(struct cppi41_dma_channel *cppi41_channel) +{ +	struct musb_hw_ep *hw_ep = cppi41_channel->hw_ep; +	struct musb *musb = hw_ep->musb; -	update_rx_toggle(cppi41_channel); - -	if (cppi41_channel->transferred == cppi41_channel->total_len || -			transferred < cppi41_channel->packet_sz) { +	if (!cppi41_channel->prog_len) {  		/* done, complete */  		cppi41_channel->channel.actual_len = @@ -150,13 +149,11 @@ static void cppi41_dma_callback(void *private_data)  				remain_bytes,  				direction,  				DMA_PREP_INTERRUPT | DMA_CTRL_ACK); -		if (WARN_ON(!dma_desc)) { -			spin_unlock_irqrestore(&musb->lock, flags); +		if (WARN_ON(!dma_desc))  			return; -		}  		dma_desc->callback = cppi41_dma_callback; -		dma_desc->callback_param = channel; +		dma_desc->callback_param = &cppi41_channel->channel;  		cppi41_channel->cookie = dma_desc->tx_submit(dma_desc);  		dma_async_issue_pending(dc); @@ -166,6 +163,117 @@ static void cppi41_dma_callback(void *private_data)  			musb_writew(epio, MUSB_RXCSR, csr);  		}  	} +} + +static enum hrtimer_restart cppi41_recheck_tx_req(struct hrtimer *timer) +{ +	struct cppi41_dma_controller *controller; +	struct cppi41_dma_channel *cppi41_channel, *n; +	struct musb *musb; +	unsigned long flags; +	enum hrtimer_restart ret = HRTIMER_NORESTART; + +	controller = container_of(timer, struct cppi41_dma_controller, +			early_tx); +	musb = controller->musb; + +	spin_lock_irqsave(&musb->lock, flags); +	list_for_each_entry_safe(cppi41_channel, n, &controller->early_tx_list, +			tx_check) { +		bool empty; +		struct musb_hw_ep *hw_ep = cppi41_channel->hw_ep; + +		empty = musb_is_tx_fifo_empty(hw_ep); +		if (empty) { +			list_del_init(&cppi41_channel->tx_check); +			cppi41_trans_done(cppi41_channel); +		} +	} + +	if (!list_empty(&controller->early_tx_list)) { +		ret = HRTIMER_RESTART; +		hrtimer_forward_now(&controller->early_tx, +				ktime_set(0, 150 * NSEC_PER_USEC)); +	} + +	spin_unlock_irqrestore(&musb->lock, flags); +	return ret; +} + +static void cppi41_dma_callback(void *private_data) +{ +	struct dma_channel *channel = private_data; +	struct cppi41_dma_channel *cppi41_channel = channel->private_data; +	struct musb_hw_ep *hw_ep = cppi41_channel->hw_ep; +	struct musb *musb = hw_ep->musb; +	unsigned long flags; +	struct dma_tx_state txstate; +	u32 transferred; +	bool empty; + +	spin_lock_irqsave(&musb->lock, flags); + +	dmaengine_tx_status(cppi41_channel->dc, cppi41_channel->cookie, +			&txstate); +	transferred = cppi41_channel->prog_len - txstate.residue; +	cppi41_channel->transferred += transferred; + +	dev_dbg(musb->controller, "DMA transfer done on hw_ep=%d bytes=%d/%d\n", +		hw_ep->epnum, cppi41_channel->transferred, +		cppi41_channel->total_len); + +	update_rx_toggle(cppi41_channel); + +	if (cppi41_channel->transferred == cppi41_channel->total_len || +			transferred < cppi41_channel->packet_sz) +		cppi41_channel->prog_len = 0; + +	empty = musb_is_tx_fifo_empty(hw_ep); +	if (empty) { +		cppi41_trans_done(cppi41_channel); +	} else { +		struct cppi41_dma_controller *controller; +		/* +		 * On AM335x it has been observed that the TX interrupt fires +		 * too early that means the TXFIFO is not yet empty but the DMA +		 * engine says that it is done with the transfer. We don't +		 * receive a FIFO empty interrupt so the only thing we can do is +		 * to poll for the bit. On HS it usually takes 2us, on FS around +		 * 110us - 150us depending on the transfer size. +		 * We spin on HS (no longer than than 25us and setup a timer on +		 * FS to check for the bit and complete the transfer. +		 */ +		controller = cppi41_channel->controller; + +		if (musb->g.speed == USB_SPEED_HIGH) { +			unsigned wait = 25; + +			do { +				empty = musb_is_tx_fifo_empty(hw_ep); +				if (empty) +					break; +				wait--; +				if (!wait) +					break; +				udelay(1); +			} while (1); + +			empty = musb_is_tx_fifo_empty(hw_ep); +			if (empty) { +				cppi41_trans_done(cppi41_channel); +				goto out; +			} +		} +		list_add_tail(&cppi41_channel->tx_check, +				&controller->early_tx_list); +		if (!hrtimer_active(&controller->early_tx)) { +			hrtimer_start_range_ns(&controller->early_tx, +				ktime_set(0, 140 * NSEC_PER_USEC), +				40 * NSEC_PER_USEC, +				HRTIMER_MODE_REL); +		} +	} +out:  	spin_unlock_irqrestore(&musb->lock, flags);  } @@ -364,6 +472,8 @@ static int cppi41_is_compatible(struct dma_channel *channel, u16 maxpacket,  		WARN_ON(1);  		return 1;  	} +	if (cppi41_channel->hw_ep->ep_in.type != USB_ENDPOINT_XFER_BULK) +		return 0;  	if (cppi41_channel->is_tx)  		return 1;  	/* AM335x Advisory 1.0.13. No workaround for device RX mode */ @@ -388,6 +498,7 @@ static int cppi41_dma_channel_abort(struct dma_channel *channel)  	if (cppi41_channel->channel.status == MUSB_DMA_STATUS_FREE)  		return 0; +	list_del_init(&cppi41_channel->tx_check);  	if (is_tx) {  		csr = musb_readw(epio, MUSB_TXCSR);  		csr &= ~MUSB_TXCSR_DMAENAB; @@ -495,6 +606,7 @@ static int cppi41_dma_controller_start(struct cppi41_dma_controller *controller)  		cppi41_channel->controller = controller;  		cppi41_channel->port_num = port;  		cppi41_channel->is_tx = is_tx; +		INIT_LIST_HEAD(&cppi41_channel->tx_check);  		musb_dma = &cppi41_channel->channel;  		musb_dma->private_data = cppi41_channel; @@ -520,6 +632,7 @@ void dma_controller_destroy(struct dma_controller *c)  	struct cppi41_dma_controller *controller = container_of(c,  			struct cppi41_dma_controller, controller); +	hrtimer_cancel(&controller->early_tx);  	cppi41_dma_controller_stop(controller);  	kfree(controller);  } @@ -539,6 +652,9 @@ struct dma_controller *dma_controller_create(struct musb *musb,  	if (!controller)  		goto kzalloc_fail; +	hrtimer_init(&controller->early_tx, CLOCK_MONOTONIC, HRTIMER_MODE_REL); +	controller->early_tx.function = cppi41_recheck_tx_req; +	INIT_LIST_HEAD(&controller->early_tx_list);  	controller->musb = musb;  	controller->controller.channel_alloc = cppi41_dma_channel_allocate; diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index d2d3a173b315..32fb057c03f5 100644 --- a/drivers/usb/musb/musb_gadget.c +++ b/drivers/usb/musb/musb_gadget.c @@ -1796,7 +1796,11 @@ int musb_gadget_setup(struct musb *musb)  	/* this "gadget" abstracts/virtualizes the controller */  	musb->g.name = musb_driver_name; +#if IS_ENABLED(CONFIG_USB_MUSB_DUAL_ROLE)  	musb->g.is_otg = 1; +#elif IS_ENABLED(CONFIG_USB_MUSB_GADGET) +	musb->g.is_otg = 0; +#endif  	musb_g_init_endpoints(musb); diff --git a/drivers/usb/phy/phy-am335x.c b/drivers/usb/phy/phy-am335x.c index 6370e50649d7..0e3c60cb669a 100644 --- a/drivers/usb/phy/phy-am335x.c +++ b/drivers/usb/phy/phy-am335x.c @@ -52,8 +52,7 @@ static int am335x_phy_probe(struct platform_device *pdev)  		return am_phy->id;  	} -	ret = usb_phy_gen_create_phy(dev, &am_phy->usb_phy_gen, -			USB_PHY_TYPE_USB2, 0, false); +	ret = usb_phy_gen_create_phy(dev, &am_phy->usb_phy_gen, NULL);  	if (ret)  		return ret; @@ -66,8 +65,6 @@ static int am335x_phy_probe(struct platform_device *pdev)  	platform_set_drvdata(pdev, am_phy);  	return 0; - -	return ret;  }  static int am335x_phy_remove(struct platform_device *pdev) diff --git a/drivers/usb/phy/phy-generic.c b/drivers/usb/phy/phy-generic.c index fce3a9e9bb5d..aa6d37b3378a 100644 --- a/drivers/usb/phy/phy-generic.c +++ b/drivers/usb/phy/phy-generic.c @@ -48,8 +48,9 @@ void usb_nop_xceiv_register(void)  	if (pd)  		return;  	pd = platform_device_register_simple("usb_phy_gen_xceiv", -1, NULL, 0); -	if (!pd) { +	if (IS_ERR(pd)) {  		pr_err("Unable to register generic usb transceiver\n"); +		pd = NULL;  		return;  	}  } @@ -150,10 +151,40 @@ static int nop_set_host(struct usb_otg *otg, struct usb_bus *host)  }  int usb_phy_gen_create_phy(struct device *dev, struct usb_phy_gen_xceiv *nop, -		enum usb_phy_type type, u32 clk_rate, bool needs_vcc) +		struct usb_phy_gen_xceiv_platform_data *pdata)  { +	enum usb_phy_type type = USB_PHY_TYPE_USB2;  	int err; +	u32 clk_rate = 0; +	bool needs_vcc = false; + +	nop->reset_active_low = true;	/* default behaviour */ + +	if (dev->of_node) { +		struct device_node *node = dev->of_node; +		enum of_gpio_flags flags = 0; + +		if (of_property_read_u32(node, "clock-frequency", &clk_rate)) +			clk_rate = 0; + +		needs_vcc = of_property_read_bool(node, "vcc-supply"); +		nop->gpio_reset = of_get_named_gpio_flags(node, "reset-gpios", +								0, &flags); +		if (nop->gpio_reset == -EPROBE_DEFER) +			return -EPROBE_DEFER; + +		nop->reset_active_low = flags & OF_GPIO_ACTIVE_LOW; + +	} else if (pdata) { +		type = pdata->type; +		clk_rate = pdata->clk_rate; +		needs_vcc = pdata->needs_vcc; +		nop->gpio_reset = pdata->gpio_reset; +	} else { +		nop->gpio_reset = -1; +	} +  	nop->phy.otg = devm_kzalloc(dev, sizeof(*nop->phy.otg),  			GFP_KERNEL);  	if (!nop->phy.otg) @@ -218,43 +249,14 @@ EXPORT_SYMBOL_GPL(usb_phy_gen_create_phy);  static int usb_phy_gen_xceiv_probe(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev; -	struct usb_phy_gen_xceiv_platform_data *pdata = -			dev_get_platdata(&pdev->dev);  	struct usb_phy_gen_xceiv	*nop; -	enum usb_phy_type	type = USB_PHY_TYPE_USB2;  	int err; -	u32 clk_rate = 0; -	bool needs_vcc = false;  	nop = devm_kzalloc(dev, sizeof(*nop), GFP_KERNEL);  	if (!nop)  		return -ENOMEM; -	nop->reset_active_low = true;	/* default behaviour */ - -	if (dev->of_node) { -		struct device_node *node = dev->of_node; -		enum of_gpio_flags flags; - -		if (of_property_read_u32(node, "clock-frequency", &clk_rate)) -			clk_rate = 0; - -		needs_vcc = of_property_read_bool(node, "vcc-supply"); -		nop->gpio_reset = of_get_named_gpio_flags(node, "reset-gpios", -								0, &flags); -		if (nop->gpio_reset == -EPROBE_DEFER) -			return -EPROBE_DEFER; - -		nop->reset_active_low = flags & OF_GPIO_ACTIVE_LOW; - -	} else if (pdata) { -		type = pdata->type; -		clk_rate = pdata->clk_rate; -		needs_vcc = pdata->needs_vcc; -		nop->gpio_reset = pdata->gpio_reset; -	} - -	err = usb_phy_gen_create_phy(dev, nop, type, clk_rate, needs_vcc); +	err = usb_phy_gen_create_phy(dev, nop, dev_get_platdata(&pdev->dev));  	if (err)  		return err; @@ -271,8 +273,6 @@ static int usb_phy_gen_xceiv_probe(struct platform_device *pdev)  	platform_set_drvdata(pdev, nop);  	return 0; - -	return err;  }  static int usb_phy_gen_xceiv_remove(struct platform_device *pdev) diff --git a/drivers/usb/phy/phy-generic.h b/drivers/usb/phy/phy-generic.h index d2a220d81734..38a81f307b82 100644 --- a/drivers/usb/phy/phy-generic.h +++ b/drivers/usb/phy/phy-generic.h @@ -1,6 +1,8 @@  #ifndef _PHY_GENERIC_H_  #define _PHY_GENERIC_H_ +#include <linux/usb/usb_phy_gen_xceiv.h> +  struct usb_phy_gen_xceiv {  	struct usb_phy phy;  	struct device *dev; @@ -14,6 +16,6 @@ int usb_gen_phy_init(struct usb_phy *phy);  void usb_gen_phy_shutdown(struct usb_phy *phy);  int usb_phy_gen_create_phy(struct device *dev, struct usb_phy_gen_xceiv *nop, -		enum usb_phy_type type, u32 clk_rate, bool needs_vcc); +		struct usb_phy_gen_xceiv_platform_data *pdata);  #endif diff --git a/drivers/usb/phy/phy-mxs-usb.c b/drivers/usb/phy/phy-mxs-usb.c index fdd33b44dbd3..545844b7e796 100644 --- a/drivers/usb/phy/phy-mxs-usb.c +++ b/drivers/usb/phy/phy-mxs-usb.c @@ -164,7 +164,7 @@ static int mxs_phy_probe(struct platform_device *pdev)  	mxs_phy->clk = clk; -	platform_set_drvdata(pdev, &mxs_phy->phy); +	platform_set_drvdata(pdev, mxs_phy);  	ret = usb_add_phy_dev(&mxs_phy->phy);  	if (ret) diff --git a/drivers/usb/phy/phy-rcar-gen2-usb.c b/drivers/usb/phy/phy-rcar-gen2-usb.c index a99a6953f11c..db3ab34cddb4 100644 --- a/drivers/usb/phy/phy-rcar-gen2-usb.c +++ b/drivers/usb/phy/phy-rcar-gen2-usb.c @@ -107,10 +107,10 @@ static void __rcar_gen2_usb_phy_init(struct rcar_gen2_usb_phy_priv *priv)  	clk_prepare_enable(priv->clk);  	/* Set USB channels in the USBHS UGCTRL2 register */ -	val = ioread32(priv->base); +	val = ioread32(priv->base + USBHS_UGCTRL2_REG);  	val &= ~(USBHS_UGCTRL2_USB0_HS | USBHS_UGCTRL2_USB2_SS);  	val |= priv->ugctrl2; -	iowrite32(val, priv->base); +	iowrite32(val, priv->base + USBHS_UGCTRL2_REG);  }  /* Shutdown USB channels */ diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index 9ced8937a8f3..fb0d537435eb 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c @@ -2123,6 +2123,20 @@ static void ftdi_set_termios(struct tty_struct *tty,  		termios->c_cflag |= CRTSCTS;  	} +	/* +	 * All FTDI UART chips are limited to CS7/8. We won't pretend to +	 * support CS5/6 and revert the CSIZE setting instead. +	 */ +	if ((C_CSIZE(tty) != CS8) && (C_CSIZE(tty) != CS7)) { +		dev_warn(ddev, "requested CSIZE setting not supported\n"); + +		termios->c_cflag &= ~CSIZE; +		if (old_termios) +			termios->c_cflag |= old_termios->c_cflag & CSIZE; +		else +			termios->c_cflag |= CS8; +	} +  	cflag = termios->c_cflag;  	if (!old_termios) @@ -2159,19 +2173,16 @@ no_skip:  	} else {  		urb_value |= FTDI_SIO_SET_DATA_PARITY_NONE;  	} -	if (cflag & CSIZE) { -		switch (cflag & CSIZE) { -		case CS7: -			urb_value |= 7; -			dev_dbg(ddev, "Setting CS7\n"); -			break; -		case CS8: -			urb_value |= 8; -			dev_dbg(ddev, "Setting CS8\n"); -			break; -		default: -			dev_err(ddev, "CSIZE was set but not CS7-CS8\n"); -		} +	switch (cflag & CSIZE) { +	case CS7: +		urb_value |= 7; +		dev_dbg(ddev, "Setting CS7\n"); +		break; +	default: +	case CS8: +		urb_value |= 8; +		dev_dbg(ddev, "Setting CS8\n"); +		break;  	}  	/* This is needed by the break command since it uses the same command diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c index 2b01ec8651c2..b63ce023f96f 100644 --- a/drivers/usb/serial/generic.c +++ b/drivers/usb/serial/generic.c @@ -173,16 +173,8 @@ retry:  		clear_bit_unlock(USB_SERIAL_WRITE_BUSY, &port->flags);  		return result;  	} -	/* -	 * Try sending off another urb, unless called from completion handler -	 * (in which case there will be no free urb or no data). -	 */ -	if (mem_flags != GFP_ATOMIC) -		goto retry; -	clear_bit_unlock(USB_SERIAL_WRITE_BUSY, &port->flags); - -	return 0; +	goto retry;	/* try sending off another urb */  }  EXPORT_SYMBOL_GPL(usb_serial_generic_write_start); @@ -208,7 +200,7 @@ int usb_serial_generic_write(struct tty_struct *tty,  		return 0;  	count = kfifo_in_locked(&port->write_fifo, buf, count, &port->lock); -	result = usb_serial_generic_write_start(port, GFP_KERNEL); +	result = usb_serial_generic_write_start(port, GFP_ATOMIC);  	if (result)  		return result; diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c index e5bdd987b9e8..a69da83604c0 100644 --- a/drivers/usb/serial/mos7840.c +++ b/drivers/usb/serial/mos7840.c @@ -1813,25 +1813,25 @@ static void mos7840_change_port_settings(struct tty_struct *tty,  	iflag = tty->termios.c_iflag;  	/* Change the number of bits */ -	if (cflag & CSIZE) { -		switch (cflag & CSIZE) { -		case CS5: -			lData = LCR_BITS_5; -			break; +	switch (cflag & CSIZE) { +	case CS5: +		lData = LCR_BITS_5; +		break; -		case CS6: -			lData = LCR_BITS_6; -			break; +	case CS6: +		lData = LCR_BITS_6; +		break; -		case CS7: -			lData = LCR_BITS_7; -			break; -		default: -		case CS8: -			lData = LCR_BITS_8; -			break; -		} +	case CS7: +		lData = LCR_BITS_7; +		break; + +	default: +	case CS8: +		lData = LCR_BITS_8; +		break;  	} +  	/* Change the Parity bit */  	if (cflag & PARENB) {  		if (cflag & PARODD) { diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index c3d94853b4ab..496b7e39d5be 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c @@ -85,6 +85,7 @@ static void option_instat_callback(struct urb *urb);  #define HUAWEI_PRODUCT_K4505			0x1464  #define HUAWEI_PRODUCT_K3765			0x1465  #define HUAWEI_PRODUCT_K4605			0x14C6 +#define HUAWEI_PRODUCT_E173S6			0x1C07  #define QUANTA_VENDOR_ID			0x0408  #define QUANTA_PRODUCT_Q101			0xEA02 @@ -572,6 +573,8 @@ static const struct usb_device_id option_ids[] = {  	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x1c23, USB_CLASS_COMM, 0x02, 0xff) },  	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E173, 0xff, 0xff, 0xff),  		.driver_info = (kernel_ulong_t) &net_intf1_blacklist }, +	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E173S6, 0xff, 0xff, 0xff), +		.driver_info = (kernel_ulong_t) &net_intf1_blacklist },  	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1750, 0xff, 0xff, 0xff),  		.driver_info = (kernel_ulong_t) &net_intf2_blacklist },  	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x1441, USB_CLASS_COMM, 0x02, 0xff) }, @@ -634,6 +637,10 @@ static const struct usb_device_id option_ids[] = {  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x6D) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x6E) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x6F) }, +	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x72) }, +	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x73) }, +	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x74) }, +	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x75) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x78) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x79) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x7A) }, @@ -688,6 +695,10 @@ static const struct usb_device_id option_ids[] = {  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x6D) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x6E) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x6F) }, +	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x72) }, +	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x73) }, +	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x74) }, +	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x75) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x78) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x79) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x7A) }, @@ -742,6 +753,10 @@ static const struct usb_device_id option_ids[] = {  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x6D) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x6E) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x6F) }, +	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x72) }, +	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x73) }, +	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x74) }, +	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x75) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x78) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x79) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x7A) }, @@ -796,6 +811,10 @@ static const struct usb_device_id option_ids[] = {  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x6D) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x6E) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x6F) }, +	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x72) }, +	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x73) }, +	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x74) }, +	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x75) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x78) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x79) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x7A) }, @@ -850,6 +869,10 @@ static const struct usb_device_id option_ids[] = {  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x6D) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x6E) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x6F) }, +	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x72) }, +	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x73) }, +	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x74) }, +	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x75) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x78) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x79) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x7A) }, @@ -904,6 +927,10 @@ static const struct usb_device_id option_ids[] = {  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x6D) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x6E) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x6F) }, +	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x72) }, +	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x73) }, +	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x74) }, +	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x75) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x78) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x79) },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x7A) }, diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c index 1e6de4cd079d..1e3318dfa1cb 100644 --- a/drivers/usb/serial/pl2303.c +++ b/drivers/usb/serial/pl2303.c @@ -361,23 +361,21 @@ static void pl2303_set_termios(struct tty_struct *tty,  			    0, 0, buf, 7, 100);  	dev_dbg(&port->dev, "0xa1:0x21:0:0  %d - %7ph\n", i, buf); -	if (C_CSIZE(tty)) { -		switch (C_CSIZE(tty)) { -		case CS5: -			buf[6] = 5; -			break; -		case CS6: -			buf[6] = 6; -			break; -		case CS7: -			buf[6] = 7; -			break; -		default: -		case CS8: -			buf[6] = 8; -		} -		dev_dbg(&port->dev, "data bits = %d\n", buf[6]); +	switch (C_CSIZE(tty)) { +	case CS5: +		buf[6] = 5; +		break; +	case CS6: +		buf[6] = 6; +		break; +	case CS7: +		buf[6] = 7; +		break; +	default: +	case CS8: +		buf[6] = 8;  	} +	dev_dbg(&port->dev, "data bits = %d\n", buf[6]);  	/* For reference buf[0]:buf[3] baud rate value */  	pl2303_encode_baudrate(tty, port, &buf[0]); diff --git a/drivers/usb/serial/spcp8x5.c b/drivers/usb/serial/spcp8x5.c index 4abac28b5992..5b793c352267 100644 --- a/drivers/usb/serial/spcp8x5.c +++ b/drivers/usb/serial/spcp8x5.c @@ -348,22 +348,20 @@ static void spcp8x5_set_termios(struct tty_struct *tty,  	}  	/* Set Data Length : 00:5bit, 01:6bit, 10:7bit, 11:8bit */ -	if (cflag & CSIZE) { -		switch (cflag & CSIZE) { -		case CS5: -			buf[1] |= SET_UART_FORMAT_SIZE_5; -			break; -		case CS6: -			buf[1] |= SET_UART_FORMAT_SIZE_6; -			break; -		case CS7: -			buf[1] |= SET_UART_FORMAT_SIZE_7; -			break; -		default: -		case CS8: -			buf[1] |= SET_UART_FORMAT_SIZE_8; -			break; -		} +	switch (cflag & CSIZE) { +	case CS5: +		buf[1] |= SET_UART_FORMAT_SIZE_5; +		break; +	case CS6: +		buf[1] |= SET_UART_FORMAT_SIZE_6; +		break; +	case CS7: +		buf[1] |= SET_UART_FORMAT_SIZE_7; +		break; +	default: +	case CS8: +		buf[1] |= SET_UART_FORMAT_SIZE_8; +		break;  	}  	/* Set Stop bit2 : 0:1bit 1:2bit */ diff --git a/drivers/usb/wusbcore/devconnect.c b/drivers/usb/wusbcore/devconnect.c index e538b72c4e3a..f14e7929ba22 100644 --- a/drivers/usb/wusbcore/devconnect.c +++ b/drivers/usb/wusbcore/devconnect.c @@ -97,18 +97,12 @@ static void wusbhc_devconnect_acked_work(struct work_struct *work);  static void wusb_dev_free(struct wusb_dev *wusb_dev)  { -	if (wusb_dev) { -		kfree(wusb_dev->set_gtk_req); -		usb_free_urb(wusb_dev->set_gtk_urb); -		kfree(wusb_dev); -	} +	kfree(wusb_dev);  }  static struct wusb_dev *wusb_dev_alloc(struct wusbhc *wusbhc)  {  	struct wusb_dev *wusb_dev; -	struct urb *urb; -	struct usb_ctrlrequest *req;  	wusb_dev = kzalloc(sizeof(*wusb_dev), GFP_KERNEL);  	if (wusb_dev == NULL) @@ -118,22 +112,6 @@ static struct wusb_dev *wusb_dev_alloc(struct wusbhc *wusbhc)  	INIT_WORK(&wusb_dev->devconnect_acked_work, wusbhc_devconnect_acked_work); -	urb = usb_alloc_urb(0, GFP_KERNEL); -	if (urb == NULL) -		goto err; -	wusb_dev->set_gtk_urb = urb; - -	req = kmalloc(sizeof(*req), GFP_KERNEL); -	if (req == NULL) -		goto err; -	wusb_dev->set_gtk_req = req; - -	req->bRequestType = USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE; -	req->bRequest = USB_REQ_SET_DESCRIPTOR; -	req->wValue = cpu_to_le16(USB_DT_KEY << 8 | wusbhc->gtk_index); -	req->wIndex = 0; -	req->wLength = cpu_to_le16(wusbhc->gtk.descr.bLength); -  	return wusb_dev;  err:  	wusb_dev_free(wusb_dev); @@ -411,9 +389,6 @@ static void __wusbhc_dev_disconnect(struct wusbhc *wusbhc,  /*   * Refresh the list of keep alives to emit in the MMC   * - * Some devices don't respond to keep alives unless they've been - * authenticated, so skip unauthenticated devices. - *   * We only publish the first four devices that have a coming timeout   * condition. Then when we are done processing those, we go for the   * next ones. We ignore the ones that have timed out already (they'll @@ -448,7 +423,7 @@ static void __wusbhc_keep_alive(struct wusbhc *wusbhc)  		if (wusb_dev == NULL)  			continue; -		if (wusb_dev->usb_dev == NULL || !wusb_dev->usb_dev->authenticated) +		if (wusb_dev->usb_dev == NULL)  			continue;  		if (time_after(jiffies, wusb_dev->entry_ts + tt)) { @@ -524,11 +499,19 @@ static struct wusb_dev *wusbhc_find_dev_by_addr(struct wusbhc *wusbhc, u8 addr)   *   * @wusbhc shall be referenced and unlocked   */ -static void wusbhc_handle_dn_alive(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev) +static void wusbhc_handle_dn_alive(struct wusbhc *wusbhc, u8 srcaddr)  { +	struct wusb_dev *wusb_dev; +  	mutex_lock(&wusbhc->mutex); -	wusb_dev->entry_ts = jiffies; -	__wusbhc_keep_alive(wusbhc); +	wusb_dev = wusbhc_find_dev_by_addr(wusbhc, srcaddr); +	if (wusb_dev == NULL) { +		dev_dbg(wusbhc->dev, "ignoring DN_Alive from unconnected device %02x\n", +			srcaddr); +	} else { +		wusb_dev->entry_ts = jiffies; +		__wusbhc_keep_alive(wusbhc); +	}  	mutex_unlock(&wusbhc->mutex);  } @@ -582,14 +565,22 @@ static void wusbhc_handle_dn_connect(struct wusbhc *wusbhc,   *   * @wusbhc shall be referenced and unlocked   */ -static void wusbhc_handle_dn_disconnect(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev) +static void wusbhc_handle_dn_disconnect(struct wusbhc *wusbhc, u8 srcaddr)  {  	struct device *dev = wusbhc->dev; - -	dev_info(dev, "DN DISCONNECT: device 0x%02x going down\n", wusb_dev->addr); +	struct wusb_dev *wusb_dev;  	mutex_lock(&wusbhc->mutex); -	__wusbhc_dev_disconnect(wusbhc, wusb_port_by_idx(wusbhc, wusb_dev->port_idx)); +	wusb_dev = wusbhc_find_dev_by_addr(wusbhc, srcaddr); +	if (wusb_dev == NULL) { +		dev_dbg(dev, "ignoring DN DISCONNECT from unconnected device %02x\n", +			srcaddr); +	} else { +		dev_info(dev, "DN DISCONNECT: device 0x%02x going down\n", +			wusb_dev->addr); +		__wusbhc_dev_disconnect(wusbhc, wusb_port_by_idx(wusbhc, +			wusb_dev->port_idx)); +	}  	mutex_unlock(&wusbhc->mutex);  } @@ -611,30 +602,21 @@ void wusbhc_handle_dn(struct wusbhc *wusbhc, u8 srcaddr,  		      struct wusb_dn_hdr *dn_hdr, size_t size)  {  	struct device *dev = wusbhc->dev; -	struct wusb_dev *wusb_dev;  	if (size < sizeof(struct wusb_dn_hdr)) {  		dev_err(dev, "DN data shorter than DN header (%d < %d)\n",  			(int)size, (int)sizeof(struct wusb_dn_hdr));  		return;  	} - -	wusb_dev = wusbhc_find_dev_by_addr(wusbhc, srcaddr); -	if (wusb_dev == NULL && dn_hdr->bType != WUSB_DN_CONNECT) { -		dev_dbg(dev, "ignoring DN %d from unconnected device %02x\n", -			dn_hdr->bType, srcaddr); -		return; -	} -  	switch (dn_hdr->bType) {  	case WUSB_DN_CONNECT:  		wusbhc_handle_dn_connect(wusbhc, dn_hdr, size);  		break;  	case WUSB_DN_ALIVE: -		wusbhc_handle_dn_alive(wusbhc, wusb_dev); +		wusbhc_handle_dn_alive(wusbhc, srcaddr);  		break;  	case WUSB_DN_DISCONNECT: -		wusbhc_handle_dn_disconnect(wusbhc, wusb_dev); +		wusbhc_handle_dn_disconnect(wusbhc, srcaddr);  		break;  	case WUSB_DN_MASAVAILCHANGED:  	case WUSB_DN_RWAKE: diff --git a/drivers/usb/wusbcore/security.c b/drivers/usb/wusbcore/security.c index dd88441c8f78..4c40d0dbf53d 100644 --- a/drivers/usb/wusbcore/security.c +++ b/drivers/usb/wusbcore/security.c @@ -29,19 +29,16 @@  #include <linux/export.h>  #include "wusbhc.h" -static void wusbhc_set_gtk_callback(struct urb *urb); -static void wusbhc_gtk_rekey_done_work(struct work_struct *work); +static void wusbhc_gtk_rekey_work(struct work_struct *work);  int wusbhc_sec_create(struct wusbhc *wusbhc)  {  	wusbhc->gtk.descr.bLength = sizeof(wusbhc->gtk.descr) + sizeof(wusbhc->gtk.data);  	wusbhc->gtk.descr.bDescriptorType = USB_DT_KEY;  	wusbhc->gtk.descr.bReserved = 0; +	wusbhc->gtk_index = 0; -	wusbhc->gtk_index = wusb_key_index(0, WUSB_KEY_INDEX_TYPE_GTK, -					   WUSB_KEY_INDEX_ORIGINATOR_HOST); - -	INIT_WORK(&wusbhc->gtk_rekey_done_work, wusbhc_gtk_rekey_done_work); +	INIT_WORK(&wusbhc->gtk_rekey_work, wusbhc_gtk_rekey_work);  	return 0;  } @@ -113,7 +110,7 @@ int wusbhc_sec_start(struct wusbhc *wusbhc)  	wusbhc_generate_gtk(wusbhc);  	result = wusbhc->set_gtk(wusbhc, wusbhc->gtk_tkid, -				 &wusbhc->gtk.descr.bKeyData, key_size); +				&wusbhc->gtk.descr.bKeyData, key_size);  	if (result < 0)  		dev_err(wusbhc->dev, "cannot set GTK for the host: %d\n",  			result); @@ -129,7 +126,7 @@ int wusbhc_sec_start(struct wusbhc *wusbhc)   */  void wusbhc_sec_stop(struct wusbhc *wusbhc)  { -	cancel_work_sync(&wusbhc->gtk_rekey_done_work); +	cancel_work_sync(&wusbhc->gtk_rekey_work);  } @@ -185,12 +182,14 @@ static int wusb_dev_set_encryption(struct usb_device *usb_dev, int value)  static int wusb_dev_set_gtk(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev)  {  	struct usb_device *usb_dev = wusb_dev->usb_dev; +	u8 key_index = wusb_key_index(wusbhc->gtk_index, +		WUSB_KEY_INDEX_TYPE_GTK, WUSB_KEY_INDEX_ORIGINATOR_HOST);  	return usb_control_msg(  		usb_dev, usb_sndctrlpipe(usb_dev, 0),  		USB_REQ_SET_DESCRIPTOR,  		USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE, -		USB_DT_KEY << 8 | wusbhc->gtk_index, 0, +		USB_DT_KEY << 8 | key_index, 0,  		&wusbhc->gtk.descr, wusbhc->gtk.descr.bLength,  		1000);  } @@ -520,24 +519,55 @@ error_kzalloc:   * Once all connected and authenticated devices have received the new   * GTK, switch the host to using it.   */ -static void wusbhc_gtk_rekey_done_work(struct work_struct *work) +static void wusbhc_gtk_rekey_work(struct work_struct *work)  { -	struct wusbhc *wusbhc = container_of(work, struct wusbhc, gtk_rekey_done_work); +	struct wusbhc *wusbhc = container_of(work, +					struct wusbhc, gtk_rekey_work);  	size_t key_size = sizeof(wusbhc->gtk.data); +	int port_idx; +	struct wusb_dev *wusb_dev, *wusb_dev_next; +	LIST_HEAD(rekey_list);  	mutex_lock(&wusbhc->mutex); +	/* generate the new key */ +	wusbhc_generate_gtk(wusbhc); +	/* roll the gtk index. */ +	wusbhc->gtk_index = (wusbhc->gtk_index + 1) % (WUSB_KEY_INDEX_MAX + 1); +	/* +	 * Save all connected devices on a list while holding wusbhc->mutex and +	 * take a reference to each one.  Then submit the set key request to +	 * them after releasing the lock in order to avoid a deadlock. +	 */ +	for (port_idx = 0; port_idx < wusbhc->ports_max; port_idx++) { +		wusb_dev = wusbhc->port[port_idx].wusb_dev; +		if (!wusb_dev || !wusb_dev->usb_dev +			|| !wusb_dev->usb_dev->authenticated) +			continue; -	if (--wusbhc->pending_set_gtks == 0) -		wusbhc->set_gtk(wusbhc, wusbhc->gtk_tkid, &wusbhc->gtk.descr.bKeyData, key_size); - +		wusb_dev_get(wusb_dev); +		list_add_tail(&wusb_dev->rekey_node, &rekey_list); +	}  	mutex_unlock(&wusbhc->mutex); -} -static void wusbhc_set_gtk_callback(struct urb *urb) -{ -	struct wusbhc *wusbhc = urb->context; +	/* Submit the rekey requests without holding wusbhc->mutex. */ +	list_for_each_entry_safe(wusb_dev, wusb_dev_next, &rekey_list, +		rekey_node) { +		list_del_init(&wusb_dev->rekey_node); +		dev_dbg(&wusb_dev->usb_dev->dev, "%s: rekey device at port %d\n", +			__func__, wusb_dev->port_idx); + +		if (wusb_dev_set_gtk(wusbhc, wusb_dev) < 0) { +			dev_err(&wusb_dev->usb_dev->dev, "%s: rekey device at port %d failed\n", +				__func__, wusb_dev->port_idx); +		} +		wusb_dev_put(wusb_dev); +	} -	queue_work(wusbd, &wusbhc->gtk_rekey_done_work); +	/* Switch the host controller to use the new GTK. */ +	mutex_lock(&wusbhc->mutex); +	wusbhc->set_gtk(wusbhc, wusbhc->gtk_tkid, +		&wusbhc->gtk.descr.bKeyData, key_size); +	mutex_unlock(&wusbhc->mutex);  }  /** @@ -553,26 +583,12 @@ static void wusbhc_set_gtk_callback(struct urb *urb)   */  void wusbhc_gtk_rekey(struct wusbhc *wusbhc)  { -	static const size_t key_size = sizeof(wusbhc->gtk.data); -	int p; - -	wusbhc_generate_gtk(wusbhc); - -	for (p = 0; p < wusbhc->ports_max; p++) { -		struct wusb_dev *wusb_dev; - -		wusb_dev = wusbhc->port[p].wusb_dev; -		if (!wusb_dev || !wusb_dev->usb_dev || !wusb_dev->usb_dev->authenticated) -			continue; - -		usb_fill_control_urb(wusb_dev->set_gtk_urb, wusb_dev->usb_dev, -				     usb_sndctrlpipe(wusb_dev->usb_dev, 0), -				     (void *)wusb_dev->set_gtk_req, -				     &wusbhc->gtk.descr, wusbhc->gtk.descr.bLength, -				     wusbhc_set_gtk_callback, wusbhc); -		if (usb_submit_urb(wusb_dev->set_gtk_urb, GFP_KERNEL) == 0) -			wusbhc->pending_set_gtks++; -	} -	if (wusbhc->pending_set_gtks == 0) -		wusbhc->set_gtk(wusbhc, wusbhc->gtk_tkid, &wusbhc->gtk.descr.bKeyData, key_size); +	/* +	 * We need to submit a URB to the downstream WUSB devices in order to +	 * change the group key.  This can't be done while holding the +	 * wusbhc->mutex since that is also taken in the urb_enqueue routine +	 * and will cause a deadlock.  Instead, queue a work item to do +	 * it when the lock is not held +	 */ +	queue_work(wusbd, &wusbhc->gtk_rekey_work);  } diff --git a/drivers/usb/wusbcore/wusbhc.h b/drivers/usb/wusbcore/wusbhc.h index 711b1952b114..6bd3b819a6b5 100644 --- a/drivers/usb/wusbcore/wusbhc.h +++ b/drivers/usb/wusbcore/wusbhc.h @@ -97,6 +97,7 @@ struct wusb_dev {  	struct kref refcnt;  	struct wusbhc *wusbhc;  	struct list_head cack_node;	/* Connect-Ack list */ +	struct list_head rekey_node;	/* GTK rekey list */  	u8 port_idx;  	u8 addr;  	u8 beacon_type:4; @@ -107,8 +108,6 @@ struct wusb_dev {  	struct usb_wireless_cap_descriptor *wusb_cap_descr;  	struct uwb_mas_bm availability;  	struct work_struct devconnect_acked_work; -	struct urb *set_gtk_urb; -	struct usb_ctrlrequest *set_gtk_req;  	struct usb_device *usb_dev;  }; @@ -296,8 +295,7 @@ struct wusbhc {  	} __attribute__((packed)) gtk;  	u8 gtk_index;  	u32 gtk_tkid; -	struct work_struct gtk_rekey_done_work; -	int pending_set_gtks; +	struct work_struct gtk_rekey_work;  	struct usb_encryption_descriptor *ccm1_etd;  }; diff --git a/drivers/video/atmel_lcdfb.c b/drivers/video/atmel_lcdfb.c index 8521051cf946..cd961622f9c1 100644 --- a/drivers/video/atmel_lcdfb.c +++ b/drivers/video/atmel_lcdfb.c @@ -131,6 +131,7 @@ static const struct platform_device_id atmel_lcdfb_devtypes[] = {  		/* terminator */  	}  }; +MODULE_DEVICE_TABLE(platform, atmel_lcdfb_devtypes);  static struct atmel_lcdfb_config *  atmel_lcdfb_get_config(struct platform_device *pdev) diff --git a/drivers/video/kyro/fbdev.c b/drivers/video/kyro/fbdev.c index 50c857477e4f..65041e15fd59 100644 --- a/drivers/video/kyro/fbdev.c +++ b/drivers/video/kyro/fbdev.c @@ -624,15 +624,15 @@ static int kyrofb_ioctl(struct fb_info *info,  			return -EINVAL;  		}  	case KYRO_IOCTL_UVSTRIDE: -		if (copy_to_user(argp, &deviceInfo.ulOverlayUVStride, sizeof(unsigned long))) +		if (copy_to_user(argp, &deviceInfo.ulOverlayUVStride, sizeof(deviceInfo.ulOverlayUVStride)))  			return -EFAULT;  		break;  	case KYRO_IOCTL_STRIDE: -		if (copy_to_user(argp, &deviceInfo.ulOverlayStride, sizeof(unsigned long))) +		if (copy_to_user(argp, &deviceInfo.ulOverlayStride, sizeof(deviceInfo.ulOverlayStride)))  			return -EFAULT;  		break;  	case KYRO_IOCTL_OVERLAY_OFFSET: -		if (copy_to_user(argp, &deviceInfo.ulOverlayOffset, sizeof(unsigned long))) +		if (copy_to_user(argp, &deviceInfo.ulOverlayOffset, sizeof(deviceInfo.ulOverlayOffset)))  			return -EFAULT;  		break;  	} diff --git a/drivers/video/offb.c b/drivers/video/offb.c index 9dbea2223401..7d44d669d5b6 100644 --- a/drivers/video/offb.c +++ b/drivers/video/offb.c @@ -91,6 +91,15 @@ extern boot_infos_t *boot_infos;  #define AVIVO_DC_LUTB_WHITE_OFFSET_GREEN        0x6cd4  #define AVIVO_DC_LUTB_WHITE_OFFSET_RED          0x6cd8 +#define FB_RIGHT_POS(p, bpp)         (fb_be_math(p) ? 0 : (32 - (bpp))) + +static inline u32 offb_cmap_byteswap(struct fb_info *info, u32 value) +{ +	u32 bpp = info->var.bits_per_pixel; + +	return cpu_to_be32(value) >> FB_RIGHT_POS(info, bpp); +} +      /*       *  Set a single color register. The values supplied are already       *  rounded down to the hardware's capabilities (according to the @@ -120,7 +129,7 @@ static int offb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,  			mask <<= info->var.transp.offset;  			value |= mask;  		} -		pal[regno] = value; +		pal[regno] = offb_cmap_byteswap(info, value);  		return 0;  	} @@ -301,7 +310,7 @@ static struct fb_ops offb_ops = {  static void __iomem *offb_map_reg(struct device_node *np, int index,  				  unsigned long offset, unsigned long size)  { -	const u32 *addrp; +	const __be32 *addrp;  	u64 asize, taddr;  	unsigned int flags; @@ -369,7 +378,11 @@ static void offb_init_palette_hacks(struct fb_info *info, struct device_node *dp  		}  		of_node_put(pciparent);  	} else if (dp && of_device_is_compatible(dp, "qemu,std-vga")) { -		const u32 io_of_addr[3] = { 0x01000000, 0x0, 0x0 }; +#ifdef __BIG_ENDIAN +		const __be32 io_of_addr[3] = { 0x01000000, 0x0, 0x0 }; +#else +		const __be32 io_of_addr[3] = { 0x00000001, 0x0, 0x0 }; +#endif  		u64 io_addr = of_translate_address(dp, io_of_addr);  		if (io_addr != OF_BAD_ADDR) {  			par->cmap_adr = ioremap(io_addr + 0x3c8, 2); @@ -535,7 +548,7 @@ static void __init offb_init_nodriver(struct device_node *dp, int no_real_node)  	unsigned int flags, rsize, addr_prop = 0;  	unsigned long max_size = 0;  	u64 rstart, address = OF_BAD_ADDR; -	const u32 *pp, *addrp, *up; +	const __be32 *pp, *addrp, *up;  	u64 asize;  	int foreign_endian = 0; @@ -551,25 +564,25 @@ static void __init offb_init_nodriver(struct device_node *dp, int no_real_node)  	if (pp == NULL)  		pp = of_get_property(dp, "depth", &len);  	if (pp && len == sizeof(u32)) -		depth = *pp; +		depth = be32_to_cpup(pp);  	pp = of_get_property(dp, "linux,bootx-width", &len);  	if (pp == NULL)  		pp = of_get_property(dp, "width", &len);  	if (pp && len == sizeof(u32)) -		width = *pp; +		width = be32_to_cpup(pp);  	pp = of_get_property(dp, "linux,bootx-height", &len);  	if (pp == NULL)  		pp = of_get_property(dp, "height", &len);  	if (pp && len == sizeof(u32)) -		height = *pp; +		height = be32_to_cpup(pp);  	pp = of_get_property(dp, "linux,bootx-linebytes", &len);  	if (pp == NULL)  		pp = of_get_property(dp, "linebytes", &len);  	if (pp && len == sizeof(u32) && (*pp != 0xffffffffu)) -		pitch = *pp; +		pitch = be32_to_cpup(pp);  	else  		pitch = width * ((depth + 7) / 8); diff --git a/drivers/video/omap2/displays-new/panel-sony-acx565akm.c b/drivers/video/omap2/displays-new/panel-sony-acx565akm.c index e6d56f714ae4..d94f35dbd536 100644 --- a/drivers/video/omap2/displays-new/panel-sony-acx565akm.c +++ b/drivers/video/omap2/displays-new/panel-sony-acx565akm.c @@ -526,6 +526,8 @@ static int acx565akm_panel_power_on(struct omap_dss_device *dssdev)  	struct omap_dss_device *in = ddata->in;  	int r; +	mutex_lock(&ddata->mutex); +  	dev_dbg(&ddata->spi->dev, "%s\n", __func__);  	in->ops.sdi->set_timings(in, &ddata->videomode); @@ -614,10 +616,7 @@ static int acx565akm_enable(struct omap_dss_device *dssdev)  	if (omapdss_device_is_enabled(dssdev))  		return 0; -	mutex_lock(&ddata->mutex);  	r = acx565akm_panel_power_on(dssdev); -	mutex_unlock(&ddata->mutex); -  	if (r)  		return r; diff --git a/drivers/video/sh_mobile_meram.c b/drivers/video/sh_mobile_meram.c index e0f098562a74..a297de5cc859 100644 --- a/drivers/video/sh_mobile_meram.c +++ b/drivers/video/sh_mobile_meram.c @@ -569,6 +569,7 @@ EXPORT_SYMBOL_GPL(sh_mobile_meram_cache_update);   * Power management   */ +#if defined(CONFIG_PM_SLEEP) || defined(CONFIG_PM_RUNTIME)  static int sh_mobile_meram_suspend(struct device *dev)  {  	struct platform_device *pdev = to_platform_device(dev); @@ -611,6 +612,7 @@ static int sh_mobile_meram_resume(struct device *dev)  		meram_write_reg(priv->base, common_regs[i], priv->regs[i]);  	return 0;  } +#endif /* CONFIG_PM_SLEEP || CONFIG_PM_RUNTIME */  static UNIVERSAL_DEV_PM_OPS(sh_mobile_meram_dev_pm_ops,  			    sh_mobile_meram_suspend, diff --git a/drivers/video/vt8500lcdfb.c b/drivers/video/vt8500lcdfb.c index b30e5a439d1f..a8f2b280f796 100644 --- a/drivers/video/vt8500lcdfb.c +++ b/drivers/video/vt8500lcdfb.c @@ -293,8 +293,7 @@ static int vt8500lcd_probe(struct platform_device *pdev)  			+ sizeof(u32) * 16, GFP_KERNEL);  	if (!fbi) {  		dev_err(&pdev->dev, "Failed to initialize framebuffer device\n"); -		ret = -ENOMEM; -		goto failed; +		return -ENOMEM;  	}  	strcpy(fbi->fb.fix.id, "VT8500 LCD"); @@ -327,15 +326,13 @@ static int vt8500lcd_probe(struct platform_device *pdev)  	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);  	if (res == NULL) {  		dev_err(&pdev->dev, "no I/O memory resource defined\n"); -		ret = -ENODEV; -		goto failed_fbi; +		return -ENODEV;  	}  	res = request_mem_region(res->start, resource_size(res), "vt8500lcd");  	if (res == NULL) {  		dev_err(&pdev->dev, "failed to request I/O memory\n"); -		ret = -EBUSY; -		goto failed_fbi; +		return -EBUSY;  	}  	fbi->regbase = ioremap(res->start, resource_size(res)); @@ -346,17 +343,19 @@ static int vt8500lcd_probe(struct platform_device *pdev)  	}  	disp_timing = of_get_display_timings(pdev->dev.of_node); -	if (!disp_timing) -		return -EINVAL; +	if (!disp_timing) { +		ret = -EINVAL; +		goto failed_free_io; +	}  	ret = of_get_fb_videomode(pdev->dev.of_node, &of_mode,  							OF_USE_NATIVE_MODE);  	if (ret) -		return ret; +		goto failed_free_io;  	ret = of_property_read_u32(pdev->dev.of_node, "bits-per-pixel", &bpp);  	if (ret) -		return ret; +		goto failed_free_io;  	/* try allocating the framebuffer */  	fb_mem_len = of_mode.xres * of_mode.yres * 2 * (bpp / 8); @@ -364,7 +363,8 @@ static int vt8500lcd_probe(struct platform_device *pdev)  				GFP_KERNEL);  	if (!fb_mem_virt) {  		pr_err("%s: Failed to allocate framebuffer\n", __func__); -		return -ENOMEM; +		ret = -ENOMEM; +		goto failed_free_io;  	}  	fbi->fb.fix.smem_start	= fb_mem_phys; @@ -447,9 +447,6 @@ failed_free_io:  	iounmap(fbi->regbase);  failed_free_res:  	release_mem_region(res->start, resource_size(res)); -failed_fbi: -	kfree(fbi); -failed:  	return ret;  } diff --git a/drivers/watchdog/bcm2835_wdt.c b/drivers/watchdog/bcm2835_wdt.c index a6a2cebb2587..cafa973c43be 100644 --- a/drivers/watchdog/bcm2835_wdt.c +++ b/drivers/watchdog/bcm2835_wdt.c @@ -19,7 +19,6 @@  #include <linux/watchdog.h>  #include <linux/platform_device.h>  #include <linux/of_address.h> -#include <linux/miscdevice.h>  #define PM_RSTC				0x1c  #define PM_WDOG				0x24 diff --git a/drivers/watchdog/ep93xx_wdt.c b/drivers/watchdog/ep93xx_wdt.c index 833e81311848..d1d07f2f69df 100644 --- a/drivers/watchdog/ep93xx_wdt.c +++ b/drivers/watchdog/ep93xx_wdt.c @@ -28,7 +28,6 @@  #include <linux/platform_device.h>  #include <linux/module.h> -#include <linux/miscdevice.h>  #include <linux/watchdog.h>  #include <linux/timer.h>  #include <linux/io.h> diff --git a/drivers/watchdog/ie6xx_wdt.c b/drivers/watchdog/ie6xx_wdt.c index 70a240297c6d..07f88f54e5c0 100644 --- a/drivers/watchdog/ie6xx_wdt.c +++ b/drivers/watchdog/ie6xx_wdt.c @@ -28,7 +28,6 @@  #include <linux/kernel.h>  #include <linux/types.h>  #include <linux/watchdog.h> -#include <linux/miscdevice.h>  #include <linux/seq_file.h>  #include <linux/debugfs.h>  #include <linux/uaccess.h> diff --git a/drivers/watchdog/jz4740_wdt.c b/drivers/watchdog/jz4740_wdt.c index 2de486a7eea1..3aa50cfa335f 100644 --- a/drivers/watchdog/jz4740_wdt.c +++ b/drivers/watchdog/jz4740_wdt.c @@ -17,7 +17,6 @@  #include <linux/moduleparam.h>  #include <linux/types.h>  #include <linux/kernel.h> -#include <linux/miscdevice.h>  #include <linux/watchdog.h>  #include <linux/init.h>  #include <linux/platform_device.h> diff --git a/drivers/watchdog/kempld_wdt.c b/drivers/watchdog/kempld_wdt.c index a1a3638c579c..20dc73844737 100644 --- a/drivers/watchdog/kempld_wdt.c +++ b/drivers/watchdog/kempld_wdt.c @@ -26,7 +26,6 @@  #include <linux/module.h>  #include <linux/moduleparam.h> -#include <linux/miscdevice.h>  #include <linux/uaccess.h>  #include <linux/watchdog.h>  #include <linux/platform_device.h> diff --git a/drivers/watchdog/max63xx_wdt.c b/drivers/watchdog/max63xx_wdt.c index 6d4f3998e1f6..bdb3f4a5b27c 100644 --- a/drivers/watchdog/max63xx_wdt.c +++ b/drivers/watchdog/max63xx_wdt.c @@ -19,7 +19,6 @@  #include <linux/moduleparam.h>  #include <linux/types.h>  #include <linux/kernel.h> -#include <linux/miscdevice.h>  #include <linux/watchdog.h>  #include <linux/init.h>  #include <linux/bitops.h> diff --git a/drivers/watchdog/orion_wdt.c b/drivers/watchdog/orion_wdt.c index 44edca66d564..f7722a424676 100644 --- a/drivers/watchdog/orion_wdt.c +++ b/drivers/watchdog/orion_wdt.c @@ -16,7 +16,6 @@  #include <linux/moduleparam.h>  #include <linux/types.h>  #include <linux/kernel.h> -#include <linux/miscdevice.h>  #include <linux/platform_device.h>  #include <linux/watchdog.h>  #include <linux/init.h> diff --git a/drivers/watchdog/pnx4008_wdt.c b/drivers/watchdog/pnx4008_wdt.c index 1bdcc313e1d9..5bec20f5dc2d 100644 --- a/drivers/watchdog/pnx4008_wdt.c +++ b/drivers/watchdog/pnx4008_wdt.c @@ -23,7 +23,6 @@  #include <linux/moduleparam.h>  #include <linux/types.h>  #include <linux/kernel.h> -#include <linux/miscdevice.h>  #include <linux/watchdog.h>  #include <linux/init.h>  #include <linux/platform_device.h> diff --git a/drivers/watchdog/rt2880_wdt.c b/drivers/watchdog/rt2880_wdt.c index 53d37fea183e..d92c2d5859ce 100644 --- a/drivers/watchdog/rt2880_wdt.c +++ b/drivers/watchdog/rt2880_wdt.c @@ -16,7 +16,6 @@  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/watchdog.h> -#include <linux/miscdevice.h>  #include <linux/moduleparam.h>  #include <linux/platform_device.h> diff --git a/drivers/watchdog/sc1200wdt.c b/drivers/watchdog/sc1200wdt.c index 3b9fff9dcf65..131193a7acdf 100644 --- a/drivers/watchdog/sc1200wdt.c +++ b/drivers/watchdog/sc1200wdt.c @@ -409,8 +409,9 @@ static int __init sc1200wdt_init(void)  #if defined CONFIG_PNP  	/* now that the user has specified an IO port and we haven't detected  	 * any devices, disable pnp support */ +	if (isapnp) +		pnp_unregister_driver(&scl200wdt_pnp_driver);  	isapnp = 0; -	pnp_unregister_driver(&scl200wdt_pnp_driver);  #endif  	if (!request_region(io, io_len, SC1200_MODULE_NAME)) { diff --git a/drivers/watchdog/shwdt.c b/drivers/watchdog/shwdt.c index f9b8e06f3558..af3528f84d65 100644 --- a/drivers/watchdog/shwdt.c +++ b/drivers/watchdog/shwdt.c @@ -26,7 +26,6 @@  #include <linux/init.h>  #include <linux/types.h>  #include <linux/spinlock.h> -#include <linux/miscdevice.h>  #include <linux/watchdog.h>  #include <linux/pm_runtime.h>  #include <linux/fs.h> diff --git a/drivers/watchdog/softdog.c b/drivers/watchdog/softdog.c index ef2638fee4a8..c04a1aa158e2 100644 --- a/drivers/watchdog/softdog.c +++ b/drivers/watchdog/softdog.c @@ -42,7 +42,6 @@  #include <linux/moduleparam.h>  #include <linux/types.h>  #include <linux/timer.h> -#include <linux/miscdevice.h>  #include <linux/watchdog.h>  #include <linux/notifier.h>  #include <linux/reboot.h> diff --git a/drivers/watchdog/stmp3xxx_rtc_wdt.c b/drivers/watchdog/stmp3xxx_rtc_wdt.c index d667f6b51d35..bb64ae3f47da 100644 --- a/drivers/watchdog/stmp3xxx_rtc_wdt.c +++ b/drivers/watchdog/stmp3xxx_rtc_wdt.c @@ -12,7 +12,6 @@  #include <linux/init.h>  #include <linux/kernel.h>  #include <linux/module.h> -#include <linux/miscdevice.h>  #include <linux/watchdog.h>  #include <linux/platform_device.h>  #include <linux/stmp3xxx_rtc_wdt.h> diff --git a/drivers/watchdog/txx9wdt.c b/drivers/watchdog/txx9wdt.c index 0fd0e8ae62a8..6a447e321dd0 100644 --- a/drivers/watchdog/txx9wdt.c +++ b/drivers/watchdog/txx9wdt.c @@ -13,7 +13,6 @@  #include <linux/module.h>  #include <linux/moduleparam.h>  #include <linux/types.h> -#include <linux/miscdevice.h>  #include <linux/watchdog.h>  #include <linux/init.h>  #include <linux/platform_device.h> diff --git a/drivers/watchdog/ux500_wdt.c b/drivers/watchdog/ux500_wdt.c index e029b5768f2c..5aed9d7ad47e 100644 --- a/drivers/watchdog/ux500_wdt.c +++ b/drivers/watchdog/ux500_wdt.c @@ -12,7 +12,6 @@  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/moduleparam.h> -#include <linux/miscdevice.h>  #include <linux/err.h>  #include <linux/uaccess.h>  #include <linux/watchdog.h> @@ -367,8 +367,10 @@ static int aio_setup_ring(struct kioctx *ctx)  	if (nr_pages > AIO_RING_PAGES) {  		ctx->ring_pages = kcalloc(nr_pages, sizeof(struct page *),  					  GFP_KERNEL); -		if (!ctx->ring_pages) +		if (!ctx->ring_pages) { +			put_aio_ring_file(ctx);  			return -ENOMEM; +		}  	}  	ctx->mmap_size = nr_pages * PAGE_SIZE; @@ -645,7 +647,7 @@ static struct kioctx *ioctx_alloc(unsigned nr_events)  	    aio_nr + nr_events < aio_nr) {  		spin_unlock(&aio_nr_lock);  		err = -EAGAIN; -		goto err; +		goto err_ctx;  	}  	aio_nr += ctx->max_reqs;  	spin_unlock(&aio_nr_lock); @@ -662,6 +664,8 @@ static struct kioctx *ioctx_alloc(unsigned nr_events)  err_cleanup:  	aio_nr_sub(ctx->max_reqs); +err_ctx: +	aio_free_ring(ctx);  err:  	free_percpu(ctx->cpu);  	free_percpu(ctx->reqs.pcpu_count); diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index b50764bef141..131d82800b3a 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c @@ -333,7 +333,6 @@ static void btrfsic_release_block_ctx(struct btrfsic_block_data_ctx *block_ctx);  static int btrfsic_read_block(struct btrfsic_state *state,  			      struct btrfsic_block_data_ctx *block_ctx);  static void btrfsic_dump_database(struct btrfsic_state *state); -static void btrfsic_complete_bio_end_io(struct bio *bio, int err);  static int btrfsic_test_for_metadata(struct btrfsic_state *state,  				     char **datav, unsigned int num_pages);  static void btrfsic_process_written_block(struct btrfsic_dev_state *dev_state, @@ -1687,7 +1686,6 @@ static int btrfsic_read_block(struct btrfsic_state *state,  	for (i = 0; i < num_pages;) {  		struct bio *bio;  		unsigned int j; -		DECLARE_COMPLETION_ONSTACK(complete);  		bio = btrfs_io_bio_alloc(GFP_NOFS, num_pages - i);  		if (!bio) { @@ -1698,8 +1696,6 @@ static int btrfsic_read_block(struct btrfsic_state *state,  		}  		bio->bi_bdev = block_ctx->dev->bdev;  		bio->bi_sector = dev_bytenr >> 9; -		bio->bi_end_io = btrfsic_complete_bio_end_io; -		bio->bi_private = &complete;  		for (j = i; j < num_pages; j++) {  			ret = bio_add_page(bio, block_ctx->pagev[j], @@ -1712,12 +1708,7 @@ static int btrfsic_read_block(struct btrfsic_state *state,  			       "btrfsic: error, failed to add a single page!\n");  			return -1;  		} -		submit_bio(READ, bio); - -		/* this will also unplug the queue */ -		wait_for_completion(&complete); - -		if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) { +		if (submit_bio_wait(READ, bio)) {  			printk(KERN_INFO  			       "btrfsic: read error at logical %llu dev %s!\n",  			       block_ctx->start, block_ctx->dev->name); @@ -1740,11 +1731,6 @@ static int btrfsic_read_block(struct btrfsic_state *state,  	return block_ctx->len;  } -static void btrfsic_complete_bio_end_io(struct bio *bio, int err) -{ -	complete((struct completion *)bio->bi_private); -} -  static void btrfsic_dump_database(struct btrfsic_state *state)  {  	struct list_head *elem_all; @@ -3008,14 +2994,12 @@ int btrfsic_submit_bh(int rw, struct buffer_head *bh)  	return submit_bh(rw, bh);  } -void btrfsic_submit_bio(int rw, struct bio *bio) +static void __btrfsic_submit_bio(int rw, struct bio *bio)  {  	struct btrfsic_dev_state *dev_state; -	if (!btrfsic_is_initialized) { -		submit_bio(rw, bio); +	if (!btrfsic_is_initialized)  		return; -	}  	mutex_lock(&btrfsic_mutex);  	/* since btrfsic_submit_bio() is also called before @@ -3106,10 +3090,20 @@ void btrfsic_submit_bio(int rw, struct bio *bio)  	}  leave:  	mutex_unlock(&btrfsic_mutex); +} +void btrfsic_submit_bio(int rw, struct bio *bio) +{ +	__btrfsic_submit_bio(rw, bio);  	submit_bio(rw, bio);  } +int btrfsic_submit_bio_wait(int rw, struct bio *bio) +{ +	__btrfsic_submit_bio(rw, bio); +	return submit_bio_wait(rw, bio); +} +  int btrfsic_mount(struct btrfs_root *root,  		  struct btrfs_fs_devices *fs_devices,  		  int including_extent_data, u32 print_mask) diff --git a/fs/btrfs/check-integrity.h b/fs/btrfs/check-integrity.h index 8b59175cc502..13b8566c97ab 100644 --- a/fs/btrfs/check-integrity.h +++ b/fs/btrfs/check-integrity.h @@ -22,9 +22,11 @@  #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY  int btrfsic_submit_bh(int rw, struct buffer_head *bh);  void btrfsic_submit_bio(int rw, struct bio *bio); +int btrfsic_submit_bio_wait(int rw, struct bio *bio);  #else  #define btrfsic_submit_bh submit_bh  #define btrfsic_submit_bio submit_bio +#define btrfsic_submit_bio_wait submit_bio_wait  #endif  int btrfsic_mount(struct btrfs_root *root, diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 8e457fca0a0b..ff43802a7c88 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -1952,11 +1952,6 @@ static int free_io_failure(struct inode *inode, struct io_failure_record *rec,  	return err;  } -static void repair_io_failure_callback(struct bio *bio, int err) -{ -	complete(bio->bi_private); -} -  /*   * this bypasses the standard btrfs submit functions deliberately, as   * the standard behavior is to write all copies in a raid setup. here we only @@ -1973,7 +1968,6 @@ int repair_io_failure(struct btrfs_fs_info *fs_info, u64 start,  {  	struct bio *bio;  	struct btrfs_device *dev; -	DECLARE_COMPLETION_ONSTACK(compl);  	u64 map_length = 0;  	u64 sector;  	struct btrfs_bio *bbio = NULL; @@ -1990,8 +1984,6 @@ int repair_io_failure(struct btrfs_fs_info *fs_info, u64 start,  	bio = btrfs_io_bio_alloc(GFP_NOFS, 1);  	if (!bio)  		return -EIO; -	bio->bi_private = &compl; -	bio->bi_end_io = repair_io_failure_callback;  	bio->bi_size = 0;  	map_length = length; @@ -2012,10 +2004,8 @@ int repair_io_failure(struct btrfs_fs_info *fs_info, u64 start,  	}  	bio->bi_bdev = dev->bdev;  	bio_add_page(bio, page, length, start - page_offset(page)); -	btrfsic_submit_bio(WRITE_SYNC, bio); -	wait_for_completion(&compl); -	if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) { +	if (btrfsic_submit_bio_wait(WRITE_SYNC, bio)) {  		/* try to remap that extent elsewhere? */  		bio_put(bio);  		btrfs_dev_stat_inc_and_print(dev, BTRFS_DEV_STAT_WRITE_ERRS); diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index 561e2f16ba3e..1fd3f33c330a 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c @@ -208,7 +208,6 @@ static void scrub_recheck_block_checksum(struct btrfs_fs_info *fs_info,  					 int is_metadata, int have_csum,  					 const u8 *csum, u64 generation,  					 u16 csum_size); -static void scrub_complete_bio_end_io(struct bio *bio, int err);  static int scrub_repair_block_from_good_copy(struct scrub_block *sblock_bad,  					     struct scrub_block *sblock_good,  					     int force_write); @@ -1294,7 +1293,6 @@ static void scrub_recheck_block(struct btrfs_fs_info *fs_info,  	for (page_num = 0; page_num < sblock->page_count; page_num++) {  		struct bio *bio;  		struct scrub_page *page = sblock->pagev[page_num]; -		DECLARE_COMPLETION_ONSTACK(complete);  		if (page->dev->bdev == NULL) {  			page->io_error = 1; @@ -1311,18 +1309,11 @@ static void scrub_recheck_block(struct btrfs_fs_info *fs_info,  		}  		bio->bi_bdev = page->dev->bdev;  		bio->bi_sector = page->physical >> 9; -		bio->bi_end_io = scrub_complete_bio_end_io; -		bio->bi_private = &complete;  		bio_add_page(bio, page->page, PAGE_SIZE, 0); -		btrfsic_submit_bio(READ, bio); - -		/* this will also unplug the queue */ -		wait_for_completion(&complete); - -		page->io_error = !test_bit(BIO_UPTODATE, &bio->bi_flags); -		if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) +		if (btrfsic_submit_bio_wait(READ, bio))  			sblock->no_io_error_seen = 0; +  		bio_put(bio);  	} @@ -1391,11 +1382,6 @@ static void scrub_recheck_block_checksum(struct btrfs_fs_info *fs_info,  		sblock->checksum_error = 1;  } -static void scrub_complete_bio_end_io(struct bio *bio, int err) -{ -	complete((struct completion *)bio->bi_private); -} -  static int scrub_repair_block_from_good_copy(struct scrub_block *sblock_bad,  					     struct scrub_block *sblock_good,  					     int force_write) @@ -1430,7 +1416,6 @@ static int scrub_repair_page_from_good_copy(struct scrub_block *sblock_bad,  	    sblock_bad->checksum_error || page_bad->io_error) {  		struct bio *bio;  		int ret; -		DECLARE_COMPLETION_ONSTACK(complete);  		if (!page_bad->dev->bdev) {  			printk_ratelimited(KERN_WARNING @@ -1443,19 +1428,14 @@ static int scrub_repair_page_from_good_copy(struct scrub_block *sblock_bad,  			return -EIO;  		bio->bi_bdev = page_bad->dev->bdev;  		bio->bi_sector = page_bad->physical >> 9; -		bio->bi_end_io = scrub_complete_bio_end_io; -		bio->bi_private = &complete;  		ret = bio_add_page(bio, page_good->page, PAGE_SIZE, 0);  		if (PAGE_SIZE != ret) {  			bio_put(bio);  			return -EIO;  		} -		btrfsic_submit_bio(WRITE, bio); -		/* this will also unplug the queue */ -		wait_for_completion(&complete); -		if (!bio_flagged(bio, BIO_UPTODATE)) { +		if (btrfsic_submit_bio_wait(WRITE, bio)) {  			btrfs_dev_stat_inc_and_print(page_bad->dev,  				BTRFS_DEV_STAT_WRITE_ERRS);  			btrfs_dev_replace_stats_inc( @@ -3375,7 +3355,6 @@ static int write_page_nocow(struct scrub_ctx *sctx,  	struct bio *bio;  	struct btrfs_device *dev;  	int ret; -	DECLARE_COMPLETION_ONSTACK(compl);  	dev = sctx->wr_ctx.tgtdev;  	if (!dev) @@ -3392,8 +3371,6 @@ static int write_page_nocow(struct scrub_ctx *sctx,  		spin_unlock(&sctx->stat_lock);  		return -ENOMEM;  	} -	bio->bi_private = &compl; -	bio->bi_end_io = scrub_complete_bio_end_io;  	bio->bi_size = 0;  	bio->bi_sector = physical_for_dev_replace >> 9;  	bio->bi_bdev = dev->bdev; @@ -3404,10 +3381,8 @@ leave_with_eio:  		btrfs_dev_stat_inc_and_print(dev, BTRFS_DEV_STAT_WRITE_ERRS);  		return -EIO;  	} -	btrfsic_submit_bio(WRITE_SYNC, bio); -	wait_for_completion(&compl); -	if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) +	if (btrfsic_submit_bio_wait(WRITE_SYNC, bio))  		goto leave_with_eio;  	bio_put(bio); diff --git a/fs/eventpoll.c b/fs/eventpoll.c index 79b65c3b9e87..8b5e2584c840 100644 --- a/fs/eventpoll.c +++ b/fs/eventpoll.c @@ -1852,8 +1852,7 @@ SYSCALL_DEFINE4(epoll_ctl, int, epfd, int, op, int, fd,  		goto error_tgt_fput;  	/* Check if EPOLLWAKEUP is allowed */ -	if ((epds.events & EPOLLWAKEUP) && !capable(CAP_BLOCK_SUSPEND)) -		epds.events &= ~EPOLLWAKEUP; +	ep_take_care_of_epollwakeup(&epds);  	/*  	 * We have to check that the file structure underneath the file descriptor diff --git a/fs/hfsplus/wrapper.c b/fs/hfsplus/wrapper.c index b51a6079108d..e9a97a0d4314 100644 --- a/fs/hfsplus/wrapper.c +++ b/fs/hfsplus/wrapper.c @@ -24,13 +24,6 @@ struct hfsplus_wd {  	u16 embed_count;  }; -static void hfsplus_end_io_sync(struct bio *bio, int err) -{ -	if (err) -		clear_bit(BIO_UPTODATE, &bio->bi_flags); -	complete(bio->bi_private); -} -  /*   * hfsplus_submit_bio - Perfrom block I/O   * @sb: super block of volume for I/O @@ -53,7 +46,6 @@ static void hfsplus_end_io_sync(struct bio *bio, int err)  int hfsplus_submit_bio(struct super_block *sb, sector_t sector,  		void *buf, void **data, int rw)  { -	DECLARE_COMPLETION_ONSTACK(wait);  	struct bio *bio;  	int ret = 0;  	u64 io_size; @@ -73,8 +65,6 @@ int hfsplus_submit_bio(struct super_block *sb, sector_t sector,  	bio = bio_alloc(GFP_NOIO, 1);  	bio->bi_sector = sector;  	bio->bi_bdev = sb->s_bdev; -	bio->bi_end_io = hfsplus_end_io_sync; -	bio->bi_private = &wait;  	if (!(rw & WRITE) && data)  		*data = (u8 *)buf + offset; @@ -93,12 +83,7 @@ int hfsplus_submit_bio(struct super_block *sb, sector_t sector,  		buf = (u8 *)buf + len;  	} -	submit_bio(rw, bio); -	wait_for_completion(&wait); - -	if (!bio_flagged(bio, BIO_UPTODATE)) -		ret = -EIO; - +	ret = submit_bio_wait(rw, bio);  out:  	bio_put(bio);  	return ret < 0 ? ret : 0; diff --git a/fs/logfs/dev_bdev.c b/fs/logfs/dev_bdev.c index 550475ca6a0e..0f95f0d0b313 100644 --- a/fs/logfs/dev_bdev.c +++ b/fs/logfs/dev_bdev.c @@ -14,16 +14,10 @@  #define PAGE_OFS(ofs) ((ofs) & (PAGE_SIZE-1)) -static void request_complete(struct bio *bio, int err) -{ -	complete((struct completion *)bio->bi_private); -} -  static int sync_request(struct page *page, struct block_device *bdev, int rw)  {  	struct bio bio;  	struct bio_vec bio_vec; -	struct completion complete;  	bio_init(&bio);  	bio.bi_max_vecs = 1; @@ -35,13 +29,8 @@ static int sync_request(struct page *page, struct block_device *bdev, int rw)  	bio.bi_size = PAGE_SIZE;  	bio.bi_bdev = bdev;  	bio.bi_sector = page->index * (PAGE_SIZE >> 9); -	init_completion(&complete); -	bio.bi_private = &complete; -	bio.bi_end_io = request_complete; -	submit_bio(rw, &bio); -	wait_for_completion(&complete); -	return test_bit(BIO_UPTODATE, &bio.bi_flags) ? 0 : -EIO; +	return submit_bio_wait(rw, &bio);  }  static int bdev_readpage(void *_sb, struct page *page) diff --git a/fs/nfs/blocklayout/blocklayout.h b/fs/nfs/blocklayout/blocklayout.h index 8485978993e8..9838fb020473 100644 --- a/fs/nfs/blocklayout/blocklayout.h +++ b/fs/nfs/blocklayout/blocklayout.h @@ -36,6 +36,7 @@  #include <linux/nfs_fs.h>  #include <linux/sunrpc/rpc_pipe_fs.h> +#include "../nfs4_fs.h"  #include "../pnfs.h"  #include "../netns.h" diff --git a/fs/nfs/blocklayout/extents.c b/fs/nfs/blocklayout/extents.c index 9c3e117c3ed1..4d0161442565 100644 --- a/fs/nfs/blocklayout/extents.c +++ b/fs/nfs/blocklayout/extents.c @@ -44,7 +44,7 @@  static inline sector_t normalize(sector_t s, int base)  {  	sector_t tmp = s; /* Since do_div modifies its argument */ -	return s - do_div(tmp, base); +	return s - sector_div(tmp, base);  }  static inline sector_t normalize_up(sector_t s, int base) diff --git a/fs/nfs/dns_resolve.c b/fs/nfs/dns_resolve.c index fc0f95ec7358..d25f10fb4926 100644 --- a/fs/nfs/dns_resolve.c +++ b/fs/nfs/dns_resolve.c @@ -46,7 +46,9 @@ ssize_t nfs_dns_resolve_name(struct net *net, char *name, size_t namelen,  #include <linux/sunrpc/cache.h>  #include <linux/sunrpc/svcauth.h>  #include <linux/sunrpc/rpc_pipe_fs.h> +#include <linux/nfs_fs.h> +#include "nfs4_fs.h"  #include "dns_resolve.h"  #include "cache_lib.h"  #include "netns.h" diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 18ab2da4eeb6..00ad1c2b217d 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -312,7 +312,7 @@ struct nfs4_label *nfs4_label_alloc(struct nfs_server *server, gfp_t flags)  }  EXPORT_SYMBOL_GPL(nfs4_label_alloc);  #else -void inline nfs_setsecurity(struct inode *inode, struct nfs_fattr *fattr, +void nfs_setsecurity(struct inode *inode, struct nfs_fattr *fattr,  					struct nfs4_label *label)  {  } diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h index bca6a3e3c49c..8b5cc04a8611 100644 --- a/fs/nfs/internal.h +++ b/fs/nfs/internal.h @@ -269,6 +269,21 @@ extern const u32 nfs41_maxgetdevinfo_overhead;  extern struct rpc_procinfo nfs4_procedures[];  #endif +#ifdef CONFIG_NFS_V4_SECURITY_LABEL +extern struct nfs4_label *nfs4_label_alloc(struct nfs_server *server, gfp_t flags); +static inline void nfs4_label_free(struct nfs4_label *label) +{ +	if (label) { +		kfree(label->label); +		kfree(label); +	} +	return; +} +#else +static inline struct nfs4_label *nfs4_label_alloc(struct nfs_server *server, gfp_t flags) { return NULL; } +static inline void nfs4_label_free(void *label) {} +#endif /* CONFIG_NFS_V4_SECURITY_LABEL */ +  /* proc.c */  void nfs_close_context(struct nfs_open_context *ctx, int is_sync);  extern struct nfs_client *nfs_init_client(struct nfs_client *clp, diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h index 3ce79b04522e..5609edc742a0 100644 --- a/fs/nfs/nfs4_fs.h +++ b/fs/nfs/nfs4_fs.h @@ -9,6 +9,14 @@  #ifndef __LINUX_FS_NFS_NFS4_FS_H  #define __LINUX_FS_NFS_NFS4_FS_H +#if defined(CONFIG_NFS_V4_2) +#define NFS4_MAX_MINOR_VERSION 2 +#elif defined(CONFIG_NFS_V4_1) +#define NFS4_MAX_MINOR_VERSION 1 +#else +#define NFS4_MAX_MINOR_VERSION 0 +#endif +  #if IS_ENABLED(CONFIG_NFS_V4)  #define NFS4_MAX_LOOP_ON_RECOVER (10) diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 659990c0109e..15052b81df42 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -2518,9 +2518,8 @@ static void nfs4_close_done(struct rpc_task *task, void *data)  						     calldata->roc_barrier);  			nfs_set_open_stateid(state, &calldata->res.stateid, 0);  			renew_lease(server, calldata->timestamp); -			nfs4_close_clear_stateid_flags(state, -					calldata->arg.fmode);  			break; +		case -NFS4ERR_ADMIN_REVOKED:  		case -NFS4ERR_STALE_STATEID:  		case -NFS4ERR_OLD_STATEID:  		case -NFS4ERR_BAD_STATEID: @@ -2528,9 +2527,13 @@ static void nfs4_close_done(struct rpc_task *task, void *data)  			if (calldata->arg.fmode == 0)  				break;  		default: -			if (nfs4_async_handle_error(task, server, state) == -EAGAIN) +			if (nfs4_async_handle_error(task, server, state) == -EAGAIN) {  				rpc_restart_call_prepare(task); +				goto out_release; +			}  	} +	nfs4_close_clear_stateid_flags(state, calldata->arg.fmode); +out_release:  	nfs_release_seqid(calldata->arg.seqid);  	nfs_refresh_inode(calldata->inode, calldata->res.fattr);  	dprintk("%s: done, ret = %d!\n", __func__, task->tk_status); @@ -4802,7 +4805,7 @@ nfs4_async_handle_error(struct rpc_task *task, const struct nfs_server *server,  			dprintk("%s ERROR %d, Reset session\n", __func__,  				task->tk_status);  			nfs4_schedule_session_recovery(clp->cl_session, task->tk_status); -			goto restart_call; +			goto wait_on_recovery;  #endif /* CONFIG_NFS_V4_1 */  		case -NFS4ERR_DELAY:  			nfs_inc_server_stats(server, NFSIOS_DELAY); @@ -4987,11 +4990,17 @@ static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata)  	trace_nfs4_delegreturn_exit(&data->args, &data->res, task->tk_status);  	switch (task->tk_status) { -	case -NFS4ERR_STALE_STATEID: -	case -NFS4ERR_EXPIRED:  	case 0:  		renew_lease(data->res.server, data->timestamp);  		break; +	case -NFS4ERR_ADMIN_REVOKED: +	case -NFS4ERR_DELEG_REVOKED: +	case -NFS4ERR_BAD_STATEID: +	case -NFS4ERR_OLD_STATEID: +	case -NFS4ERR_STALE_STATEID: +	case -NFS4ERR_EXPIRED: +		task->tk_status = 0; +		break;  	default:  		if (nfs4_async_handle_error(task, data->res.server, NULL) ==  				-EAGAIN) { @@ -7589,7 +7598,14 @@ static void nfs4_layoutreturn_done(struct rpc_task *task, void *calldata)  		return;  	server = NFS_SERVER(lrp->args.inode); -	if (nfs4_async_handle_error(task, server, NULL) == -EAGAIN) { +	switch (task->tk_status) { +	default: +		task->tk_status = 0; +	case 0: +		break; +	case -NFS4ERR_DELAY: +		if (nfs4_async_handle_error(task, server, NULL) != -EAGAIN) +			break;  		rpc_restart_call_prepare(task);  		return;  	} diff --git a/include/crypto/scatterwalk.h b/include/crypto/scatterwalk.h index 64ebede184f1..6a626a507b8c 100644 --- a/include/crypto/scatterwalk.h +++ b/include/crypto/scatterwalk.h @@ -44,7 +44,7 @@ static inline struct scatterlist *scatterwalk_sg_next(struct scatterlist *sg)  	if (sg_is_last(sg))  		return NULL; -	return (++sg)->length ? sg : (void *)sg_page(sg); +	return (++sg)->length ? sg : sg_chain_ptr(sg);  }  static inline void scatterwalk_crypto_chain(struct scatterlist *head, diff --git a/include/linux/efi.h b/include/linux/efi.h index bc5687d0f315..11ce6784a196 100644 --- a/include/linux/efi.h +++ b/include/linux/efi.h @@ -801,6 +801,8 @@ struct efivar_entry {  	struct efi_variable var;  	struct list_head list;  	struct kobject kobj; +	bool scanning; +	bool deleting;  }; @@ -866,6 +868,8 @@ void efivar_run_worker(void);  #if defined(CONFIG_EFI_VARS) || defined(CONFIG_EFI_VARS_MODULE)  int efivars_sysfs_init(void); +#define EFIVARS_DATA_SIZE_MAX 1024 +  #endif /* CONFIG_EFI_VARS */  #endif /* _LINUX_EFI_H */ diff --git a/include/linux/hid-sensor-hub.h b/include/linux/hid-sensor-hub.h index 206a2af6b62b..b914ca3f57ba 100644 --- a/include/linux/hid-sensor-hub.h +++ b/include/linux/hid-sensor-hub.h @@ -42,6 +42,8 @@ struct hid_sensor_hub_attribute_info {  	s32 units;  	s32 unit_expo;  	s32 size; +	s32 logical_minimum; +	s32 logical_maximum;  };  /** diff --git a/include/linux/hid-sensor-ids.h b/include/linux/hid-sensor-ids.h index 4f945d3ed49f..8323775ac21d 100644 --- a/include/linux/hid-sensor-ids.h +++ b/include/linux/hid-sensor-ids.h @@ -117,4 +117,16 @@  #define HID_USAGE_SENSOR_PROP_REPORT_STATE			0x200316  #define HID_USAGE_SENSOR_PROY_POWER_STATE			0x200319 +/* Power state enumerations */ +#define HID_USAGE_SENSOR_PROP_POWER_STATE_UNDEFINED_ENUM		0x00 +#define HID_USAGE_SENSOR_PROP_POWER_STATE_D0_FULL_POWER_ENUM		0x01 +#define HID_USAGE_SENSOR_PROP_POWER_STATE_D1_LOW_POWER_ENUM		0x02 +#define HID_USAGE_SENSOR_PROP_POWER_STATE_D2_STANDBY_WITH_WAKE_ENUM	0x03 +#define HID_USAGE_SENSOR_PROP_POWER_STATE_D3_SLEEP_WITH_WAKE_ENUM	0x04 +#define HID_USAGE_SENSOR_PROP_POWER_STATE_D4_POWER_OFF_ENUM		0x05 + +/* Report State enumerations */ +#define HID_USAGE_SENSOR_PROP_REPORTING_STATE_NO_EVENTS_ENUM		0x00 +#define HID_USAGE_SENSOR_PROP_REPORTING_STATE_ALL_EVENTS_ENUM		0x01 +  #endif diff --git a/include/linux/nfs4.h b/include/linux/nfs4.h index c1637062c1ce..12c2cb947df5 100644 --- a/include/linux/nfs4.h +++ b/include/linux/nfs4.h @@ -413,16 +413,6 @@ enum lock_type4 {  #define NFS4_VERSION 4  #define NFS4_MINOR_VERSION 0 -#if defined(CONFIG_NFS_V4_2) -#define NFS4_MAX_MINOR_VERSION 2 -#else -#if defined(CONFIG_NFS_V4_1) -#define NFS4_MAX_MINOR_VERSION 1 -#else -#define NFS4_MAX_MINOR_VERSION 0 -#endif /* CONFIG_NFS_V4_1 */ -#endif /* CONFIG_NFS_V4_2 */ -  #define NFS4_DEBUG 1  /* Index of predefined Linux client operations */ diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h index 14a48207a304..48997374eaf0 100644 --- a/include/linux/nfs_fs.h +++ b/include/linux/nfs_fs.h @@ -507,24 +507,6 @@ extern int nfs_mountpoint_expiry_timeout;  extern void nfs_release_automount_timer(void);  /* - * linux/fs/nfs/nfs4proc.c - */ -#ifdef CONFIG_NFS_V4_SECURITY_LABEL -extern struct nfs4_label *nfs4_label_alloc(struct nfs_server *server, gfp_t flags); -static inline void nfs4_label_free(struct nfs4_label *label) -{ -	if (label) { -		kfree(label->label); -		kfree(label); -	} -	return; -} -#else -static inline struct nfs4_label *nfs4_label_alloc(struct nfs_server *server, gfp_t flags) { return NULL; } -static inline void nfs4_label_free(void *label) {} -#endif - -/*   * linux/fs/nfs/unlink.c   */  extern void nfs_complete_unlink(struct dentry *dentry, struct inode *); diff --git a/include/linux/usb.h b/include/linux/usb.h index 7454865ad148..512ab162832c 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -1264,6 +1264,8 @@ typedef void (*usb_complete_t)(struct urb *);   * @sg: scatter gather buffer list, the buffer size of each element in   * 	the list (except the last) must be divisible by the endpoint's   * 	max packet size if no_sg_constraint isn't set in 'struct usb_bus' + * 	(FIXME: scatter-gather under xHCI is broken for periodic transfers. + * 	Do not use urb->sg for interrupt endpoints for now, only bulk.)   * @num_mapped_sgs: (internal) number of mapped sg entries   * @num_sgs: number of entries in the sg list   * @transfer_buffer_length: How big is transfer_buffer.  The transfer may diff --git a/include/linux/usb/wusb.h b/include/linux/usb/wusb.h index 0c4d4ca370ec..eeb28329fa3c 100644 --- a/include/linux/usb/wusb.h +++ b/include/linux/usb/wusb.h @@ -271,6 +271,8 @@ static inline u8 wusb_key_index(int index, int type, int originator)  #define WUSB_KEY_INDEX_TYPE_GTK			2  #define WUSB_KEY_INDEX_ORIGINATOR_HOST		0  #define WUSB_KEY_INDEX_ORIGINATOR_DEVICE	1 +/* bits 0-3 used for the key index. */ +#define WUSB_KEY_INDEX_MAX			15  /* A CCM Nonce, defined in WUSB1.0[6.4.1] */  struct aes_ccm_nonce { diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h index 546084964d55..fe3b58e836c8 100644 --- a/include/scsi/scsi_host.h +++ b/include/scsi/scsi_host.h @@ -475,6 +475,9 @@ struct scsi_host_template {  	 */  	unsigned ordered_tag:1; +	/* True if the controller does not support WRITE SAME */ +	unsigned no_write_same:1; +  	/*  	 * Countdown for host blocking with no commands outstanding.  	 */ @@ -677,6 +680,9 @@ struct Scsi_Host {  	/* Don't resume host in EH */  	unsigned eh_noresume:1; +	/* The controller does not support WRITE SAME */ +	unsigned no_write_same:1; +  	/*  	 * Optional work queue to be utilized by the transport  	 */ diff --git a/include/sound/soc-dapm.h b/include/sound/soc-dapm.h index 2037c45adfe6..56ebdfca6273 100644 --- a/include/sound/soc-dapm.h +++ b/include/sound/soc-dapm.h @@ -104,7 +104,8 @@ struct device;  	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \  	.kcontrol_news = wcontrols, .num_kcontrols = 1}  #define SND_SOC_DAPM_MUX(wname, wreg, wshift, winvert, wcontrols) \ -{	.id = snd_soc_dapm_mux, .name = wname, .reg = wreg, \ +{	.id = snd_soc_dapm_mux, .name = wname, \ +	SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \  	.kcontrol_news = wcontrols, .num_kcontrols = 1}  #define SND_SOC_DAPM_VIRT_MUX(wname, wreg, wshift, winvert, wcontrols) \  {	.id = snd_soc_dapm_virt_mux, .name = wname, \ diff --git a/include/uapi/drm/vmwgfx_drm.h b/include/uapi/drm/vmwgfx_drm.h index bcb0912afe7a..f854ca4a1372 100644 --- a/include/uapi/drm/vmwgfx_drm.h +++ b/include/uapi/drm/vmwgfx_drm.h @@ -75,6 +75,7 @@  #define DRM_VMW_PARAM_FIFO_CAPS        4  #define DRM_VMW_PARAM_MAX_FB_SIZE      5  #define DRM_VMW_PARAM_FIFO_HW_VERSION  6 +#define DRM_VMW_PARAM_MAX_SURF_MEMORY  7  /**   * struct drm_vmw_getparam_arg diff --git a/include/uapi/linux/eventpoll.h b/include/uapi/linux/eventpoll.h index 2c267bcbb85c..bc81fb2e1f0e 100644 --- a/include/uapi/linux/eventpoll.h +++ b/include/uapi/linux/eventpoll.h @@ -61,5 +61,16 @@ struct epoll_event {  	__u64 data;  } EPOLL_PACKED; - +#ifdef CONFIG_PM_SLEEP +static inline void ep_take_care_of_epollwakeup(struct epoll_event *epev) +{ +	if ((epev->events & EPOLLWAKEUP) && !capable(CAP_BLOCK_SUSPEND)) +		epev->events &= ~EPOLLWAKEUP; +} +#else +static inline void ep_take_care_of_epollwakeup(struct epoll_event *epev) +{ +	epev->events &= ~EPOLLWAKEUP; +} +#endif  #endif /* _UAPI_LINUX_EVENTPOLL_H */ diff --git a/include/uapi/linux/input.h b/include/uapi/linux/input.h index a3726275876d..ecc88592ecbe 100644 --- a/include/uapi/linux/input.h +++ b/include/uapi/linux/input.h @@ -719,6 +719,8 @@ struct input_keymap_entry {  #define BTN_DPAD_LEFT		0x222  #define BTN_DPAD_RIGHT		0x223 +#define KEY_ALS_TOGGLE		0x230	/* Ambient light sensor */ +  #define BTN_TRIGGER_HAPPY		0x2c0  #define BTN_TRIGGER_HAPPY1		0x2c0  #define BTN_TRIGGER_HAPPY2		0x2c1 @@ -856,6 +858,7 @@ struct input_keymap_entry {  #define SW_FRONT_PROXIMITY	0x0b  /* set = front proximity sensor active */  #define SW_ROTATE_LOCK		0x0c  /* set = rotate locked/disabled */  #define SW_LINEIN_INSERT	0x0d  /* set = inserted */ +#define SW_MUTE_DEVICE		0x0e  /* set = device disabled */  #define SW_MAX			0x0f  #define SW_CNT			(SW_MAX+1) diff --git a/include/uapi/linux/mic_common.h b/include/uapi/linux/mic_common.h index 17e7d95e4f53..6eb40244e019 100644 --- a/include/uapi/linux/mic_common.h +++ b/include/uapi/linux/mic_common.h @@ -23,12 +23,7 @@  #include <linux/virtio_ring.h> -#ifndef __KERNEL__ -#define ALIGN(a, x)	(((a) + (x) - 1) & ~((x) - 1)) -#define __aligned(x)	__attribute__ ((aligned(x))) -#endif - -#define mic_aligned_size(x) ALIGN(sizeof(x), 8) +#define __mic_align(a, x) (((a) + (x) - 1) & ~((x) - 1))  /**   * struct mic_device_desc: Virtio device information shared between the @@ -48,8 +43,8 @@ struct mic_device_desc {  	__u8 feature_len;  	__u8 config_len;  	__u8 status; -	__u64 config[0]; -} __aligned(8); +	__le64 config[0]; +} __attribute__ ((aligned(8)));  /**   * struct mic_device_ctrl: Per virtio device information in the device page @@ -66,7 +61,7 @@ struct mic_device_desc {   * @h2c_vdev_db: The doorbell number to be used by host. Set by guest.   */  struct mic_device_ctrl { -	__u64 vdev; +	__le64 vdev;  	__u8 config_change;  	__u8 vdev_reset;  	__u8 guest_ack; @@ -74,7 +69,7 @@ struct mic_device_ctrl {  	__u8 used_address_updated;  	__s8 c2h_vdev_db;  	__s8 h2c_vdev_db; -} __aligned(8); +} __attribute__ ((aligned(8)));  /**   * struct mic_bootparam: Virtio device independent information in device page @@ -87,13 +82,13 @@ struct mic_device_ctrl {   * @shutdown_card: Set to 1 by the host when a card shutdown is initiated   */  struct mic_bootparam { -	__u32 magic; +	__le32 magic;  	__s8 c2h_shutdown_db;  	__s8 h2c_shutdown_db;  	__s8 h2c_config_db;  	__u8 shutdown_status;  	__u8 shutdown_card; -} __aligned(8); +} __attribute__ ((aligned(8)));  /**   * struct mic_device_page: High level representation of the device page @@ -116,10 +111,10 @@ struct mic_device_page {   * @num: The number of entries in the virtio_ring   */  struct mic_vqconfig { -	__u64 address; -	__u64 used_address; -	__u16 num; -} __aligned(8); +	__le64 address; +	__le64 used_address; +	__le16 num; +} __attribute__ ((aligned(8)));  /*   * The alignment to use between consumer and producer parts of vring. @@ -154,7 +149,7 @@ struct mic_vqconfig {   */  struct _mic_vring_info {  	__u16 avail_idx; -	int magic; +	__le32 magic;  };  /** @@ -173,15 +168,13 @@ struct mic_vring {  	int len;  }; -#define mic_aligned_desc_size(d) ALIGN(mic_desc_size(d), 8) +#define mic_aligned_desc_size(d) __mic_align(mic_desc_size(d), 8)  #ifndef INTEL_MIC_CARD  static inline unsigned mic_desc_size(const struct mic_device_desc *desc)  { -	return mic_aligned_size(*desc) -		+ desc->num_vq * mic_aligned_size(struct mic_vqconfig) -		+ desc->feature_len * 2 -		+ desc->config_len; +	return sizeof(*desc) + desc->num_vq * sizeof(struct mic_vqconfig) +		+ desc->feature_len * 2 + desc->config_len;  }  static inline struct mic_vqconfig * @@ -201,8 +194,7 @@ static inline __u8 *mic_vq_configspace(const struct mic_device_desc *desc)  }  static inline unsigned mic_total_desc_size(struct mic_device_desc *desc)  { -	return mic_aligned_desc_size(desc) + -		mic_aligned_size(struct mic_device_ctrl); +	return mic_aligned_desc_size(desc) + sizeof(struct mic_device_ctrl);  }  #endif diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index f919a2e21bf3..a11800ae96de 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c @@ -2314,6 +2314,9 @@ int event_trace_del_tracer(struct trace_array *tr)  	/* Disable any running events */  	__ftrace_set_clr_event_nolock(tr, NULL, NULL, NULL, 0); +	/* Access to events are within rcu_read_lock_sched() */ +	synchronize_sched(); +  	down_write(&trace_event_sem);  	__trace_remove_event_dirs(tr);  	debugfs_remove_recursive(tr->event_dir); diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c index e4b6d11bdf78..ea90eb5f6f17 100644 --- a/kernel/trace/trace_syscalls.c +++ b/kernel/trace/trace_syscalls.c @@ -431,11 +431,6 @@ static void unreg_event_syscall_enter(struct ftrace_event_file *file,  	if (!tr->sys_refcount_enter)  		unregister_trace_sys_enter(ftrace_syscall_enter, tr);  	mutex_unlock(&syscall_trace_lock); -	/* -	 * Callers expect the event to be completely disabled on -	 * return, so wait for current handlers to finish. -	 */ -	synchronize_sched();  }  static int reg_event_syscall_exit(struct ftrace_event_file *file, @@ -474,11 +469,6 @@ static void unreg_event_syscall_exit(struct ftrace_event_file *file,  	if (!tr->sys_refcount_exit)  		unregister_trace_sys_exit(ftrace_syscall_exit, tr);  	mutex_unlock(&syscall_trace_lock); -	/* -	 * Callers expect the event to be completely disabled on -	 * return, so wait for current handlers to finish. -	 */ -	synchronize_sched();  }  static int __init init_syscall_trace(struct ftrace_event_call *call) diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c index 97912b40c254..42fdfc634e56 100644 --- a/net/sunrpc/auth_gss/auth_gss.c +++ b/net/sunrpc/auth_gss/auth_gss.c @@ -1517,7 +1517,7 @@ out:  static int  gss_refresh_null(struct rpc_task *task)  { -	return -EACCES; +	return 0;  }  static __be32 * diff --git a/scripts/recordmcount.pl b/scripts/recordmcount.pl index d0da66396f62..91280b82da08 100755 --- a/scripts/recordmcount.pl +++ b/scripts/recordmcount.pl @@ -364,7 +364,8 @@ if ($arch eq "x86_64") {  } elsif ($arch eq "blackfin") {      $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s__mcount\$";      $mcount_adjust = -4; -} elsif ($arch eq "tilegx") { +} elsif ($arch eq "tilegx" || $arch eq "tile") { +    # Default to the newer TILE-Gx architecture if only "tile" is given.      $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s__mcount\$";      $type = ".quad";      $alignment = 8; diff --git a/security/integrity/ima/ima.h b/security/integrity/ima/ima.h index 9636e17c9f5d..0356e1d437ca 100644 --- a/security/integrity/ima/ima.h +++ b/security/integrity/ima/ima.h @@ -148,6 +148,7 @@ int ima_alloc_init_template(struct integrity_iint_cache *iint,  			    int xattr_len, struct ima_template_entry **entry);  int ima_store_template(struct ima_template_entry *entry, int violation,  		       struct inode *inode, const unsigned char *filename); +void ima_free_template_entry(struct ima_template_entry *entry);  const char *ima_d_path(struct path *path, char **pathbuf);  /* rbtree tree calls to lookup, insert, delete diff --git a/security/integrity/ima/ima_api.c b/security/integrity/ima/ima_api.c index 80374842fe0b..c38bbce8c6a6 100644 --- a/security/integrity/ima/ima_api.c +++ b/security/integrity/ima/ima_api.c @@ -22,6 +22,19 @@  #include "ima.h"  /* + * ima_free_template_entry - free an existing template entry + */ +void ima_free_template_entry(struct ima_template_entry *entry) +{ +	int i; + +	for (i = 0; i < entry->template_desc->num_fields; i++) +		kfree(entry->template_data[i].data); + +	kfree(entry); +} + +/*   * ima_alloc_init_template - create and initialize a new template entry   */  int ima_alloc_init_template(struct integrity_iint_cache *iint, @@ -37,6 +50,7 @@ int ima_alloc_init_template(struct integrity_iint_cache *iint,  	if (!*entry)  		return -ENOMEM; +	(*entry)->template_desc = template_desc;  	for (i = 0; i < template_desc->num_fields; i++) {  		struct ima_template_field *field = template_desc->fields[i];  		u32 len; @@ -51,10 +65,9 @@ int ima_alloc_init_template(struct integrity_iint_cache *iint,  		(*entry)->template_data_len += sizeof(len);  		(*entry)->template_data_len += len;  	} -	(*entry)->template_desc = template_desc;  	return 0;  out: -	kfree(*entry); +	ima_free_template_entry(*entry);  	*entry = NULL;  	return result;  } @@ -134,7 +147,7 @@ void ima_add_violation(struct file *file, const unsigned char *filename,  	}  	result = ima_store_template(entry, violation, inode, filename);  	if (result < 0) -		kfree(entry); +		ima_free_template_entry(entry);  err_out:  	integrity_audit_msg(AUDIT_INTEGRITY_PCR, inode, filename,  			    op, cause, result, 0); @@ -269,7 +282,7 @@ void ima_store_measurement(struct integrity_iint_cache *iint,  	if (!result || result == -EEXIST)  		iint->flags |= IMA_MEASURED;  	if (result < 0) -		kfree(entry); +		ima_free_template_entry(entry);  }  void ima_audit_measurement(struct integrity_iint_cache *iint, diff --git a/security/integrity/ima/ima_init.c b/security/integrity/ima/ima_init.c index 15f34bd40abe..37122768554a 100644 --- a/security/integrity/ima/ima_init.c +++ b/security/integrity/ima/ima_init.c @@ -63,7 +63,6 @@ static void __init ima_add_boot_aggregate(void)  		result = ima_calc_boot_aggregate(&hash.hdr);  		if (result < 0) {  			audit_cause = "hashing_error"; -			kfree(entry);  			goto err_out;  		}  	} @@ -76,7 +75,7 @@ static void __init ima_add_boot_aggregate(void)  	result = ima_store_template(entry, violation, NULL,  				    boot_aggregate_name);  	if (result < 0) -		kfree(entry); +		ima_free_template_entry(entry);  	return;  err_out:  	integrity_audit_msg(AUDIT_INTEGRITY_PCR, NULL, boot_aggregate_name, op, diff --git a/sound/atmel/abdac.c b/sound/atmel/abdac.c index 872d59e35ee2..721d8fd45685 100644 --- a/sound/atmel/abdac.c +++ b/sound/atmel/abdac.c @@ -357,7 +357,8 @@ static int set_sample_rates(struct atmel_abdac *dac)  		if (new_rate < 0)  			break;  		/* make sure we are below the ABDAC clock */ -		if (new_rate <= clk_get_rate(dac->pclk)) { +		if (index < MAX_NUM_RATES && +		    new_rate <= clk_get_rate(dac->pclk)) {  			dac->rates[index] = new_rate / 256;  			index++;  		} diff --git a/sound/firewire/dice.c b/sound/firewire/dice.c index 57bcd31fcc12..c0aa64941cee 100644 --- a/sound/firewire/dice.c +++ b/sound/firewire/dice.c @@ -1019,7 +1019,7 @@ static void dice_proc_read(struct snd_info_entry *entry,  	if (dice_proc_read_mem(dice, &tx_rx_header, sections[2], 2) < 0)  		return; -	quadlets = min_t(u32, tx_rx_header.size, sizeof(buf.tx)); +	quadlets = min_t(u32, tx_rx_header.size, sizeof(buf.tx) / 4);  	for (stream = 0; stream < tx_rx_header.number; ++stream) {  		if (dice_proc_read_mem(dice, &buf.tx, sections[2] + 2 +  				       stream * tx_rx_header.size, @@ -1045,7 +1045,7 @@ static void dice_proc_read(struct snd_info_entry *entry,  	if (dice_proc_read_mem(dice, &tx_rx_header, sections[4], 2) < 0)  		return; -	quadlets = min_t(u32, tx_rx_header.size, sizeof(buf.rx)); +	quadlets = min_t(u32, tx_rx_header.size, sizeof(buf.rx) / 4);  	for (stream = 0; stream < tx_rx_header.number; ++stream) {  		if (dice_proc_read_mem(dice, &buf.rx, sections[4] + 2 +  				       stream * tx_rx_header.size, diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index c6d230193da6..27aa14007cbd 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c @@ -3876,7 +3876,8 @@ static int azx_probe(struct pci_dev *pci,  	}  	dev++; -	complete_all(&chip->probe_wait); +	if (chip->disabled) +		complete_all(&chip->probe_wait);  	return 0;  out_free: @@ -3953,10 +3954,10 @@ static int azx_probe_continue(struct azx *chip)  	if ((chip->driver_caps & AZX_DCAPS_PM_RUNTIME) || chip->use_vga_switcheroo)  		pm_runtime_put_noidle(&pci->dev); -	return 0; -  out_free: -	chip->init_failed = 1; +	if (err < 0) +		chip->init_failed = 1; +	complete_all(&chip->probe_wait);  	return err;  } diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index 1a83559f4cbd..cac015be3325 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c @@ -147,6 +147,8 @@ static void ad_vmaster_eapd_hook(void *private_data, int enabled)  	if (!spec->eapd_nid)  		return; +	if (codec->inv_eapd) +		enabled = !enabled;  	snd_hda_codec_update_cache(codec, spec->eapd_nid, 0,  				   AC_VERB_SET_EAPD_BTLENABLE,  				   enabled ? 0x02 : 0x00); @@ -359,6 +361,9 @@ static int patch_ad1986a(struct hda_codec *codec)  	 */  	spec->gen.multiout.no_share_stream = 1; +	/* AD1986A can't manage the dynamic pin on/off smoothly */ +	spec->gen.auto_mute_via_amp = 1; +  	snd_hda_pick_fixup(codec, ad1986a_fixup_models, ad1986a_fixup_tbl,  			   ad1986a_fixups);  	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); @@ -962,6 +967,7 @@ static void ad1884_fixup_hp_eapd(struct hda_codec *codec,  	switch (action) {  	case HDA_FIXUP_ACT_PRE_PROBE:  		spec->gen.vmaster_mute.hook = ad1884_vmaster_hp_gpio_hook; +		spec->gen.own_eapd_ctl = 1;  		snd_hda_sequence_write_cache(codec, gpio_init_verbs);  		break;  	case HDA_FIXUP_ACT_PROBE: diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index 08407bed093e..c4a66ef6cf6f 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c @@ -1142,32 +1142,34 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec,  static bool hdmi_present_sense(struct hdmi_spec_per_pin *per_pin, int repoll); -static void hdmi_intrinsic_event(struct hda_codec *codec, unsigned int res) +static void jack_callback(struct hda_codec *codec, struct hda_jack_tbl *jack)  {  	struct hdmi_spec *spec = codec->spec; +	int pin_idx = pin_nid_to_pin_index(spec, jack->nid); +	if (pin_idx < 0) +		return; + +	if (hdmi_present_sense(get_pin(spec, pin_idx), 1)) +		snd_hda_jack_report_sync(codec); +} + +static void hdmi_intrinsic_event(struct hda_codec *codec, unsigned int res) +{  	int tag = res >> AC_UNSOL_RES_TAG_SHIFT; -	int pin_nid; -	int pin_idx;  	struct hda_jack_tbl *jack;  	int dev_entry = (res & AC_UNSOL_RES_DE) >> AC_UNSOL_RES_DE_SHIFT;  	jack = snd_hda_jack_tbl_get_from_tag(codec, tag);  	if (!jack)  		return; -	pin_nid = jack->nid;  	jack->jack_dirty = 1;  	_snd_printd(SND_PR_VERBOSE,  		"HDMI hot plug event: Codec=%d Pin=%d Device=%d Inactive=%d Presence_Detect=%d ELD_Valid=%d\n", -		codec->addr, pin_nid, dev_entry, !!(res & AC_UNSOL_RES_IA), +		codec->addr, jack->nid, dev_entry, !!(res & AC_UNSOL_RES_IA),  		!!(res & AC_UNSOL_RES_PD), !!(res & AC_UNSOL_RES_ELDV)); -	pin_idx = pin_nid_to_pin_index(spec, pin_nid); -	if (pin_idx < 0) -		return; - -	if (hdmi_present_sense(get_pin(spec, pin_idx), 1)) -		snd_hda_jack_report_sync(codec); +	jack_callback(codec, jack);  }  static void hdmi_non_intrinsic_event(struct hda_codec *codec, unsigned int res) @@ -2095,7 +2097,8 @@ static int generic_hdmi_init(struct hda_codec *codec)  		hda_nid_t pin_nid = per_pin->pin_nid;  		hdmi_init_pin(codec, pin_nid); -		snd_hda_jack_detect_enable(codec, pin_nid, pin_nid); +		snd_hda_jack_detect_enable_callback(codec, pin_nid, pin_nid, +			codec->jackpoll_interval > 0 ? jack_callback : NULL);  	}  	return 0;  } diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index c770bdba6531..c5ea483d7559 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -1780,6 +1780,7 @@ enum {  	ALC889_FIXUP_DAC_ROUTE,  	ALC889_FIXUP_MBP_VREF,  	ALC889_FIXUP_IMAC91_VREF, +	ALC889_FIXUP_MBA21_VREF,  	ALC882_FIXUP_INV_DMIC,  	ALC882_FIXUP_NO_PRIMARY_HP,  	ALC887_FIXUP_ASUS_BASS, @@ -1884,17 +1885,13 @@ static void alc889_fixup_mbp_vref(struct hda_codec *codec,  	}  } -/* Set VREF on speaker pins on imac91 */ -static void alc889_fixup_imac91_vref(struct hda_codec *codec, -				     const struct hda_fixup *fix, int action) +static void alc889_fixup_mac_pins(struct hda_codec *codec, +				  const hda_nid_t *nids, int num_nids)  {  	struct alc_spec *spec = codec->spec; -	static hda_nid_t nids[2] = { 0x18, 0x1a };  	int i; -	if (action != HDA_FIXUP_ACT_INIT) -		return; -	for (i = 0; i < ARRAY_SIZE(nids); i++) { +	for (i = 0; i < num_nids; i++) {  		unsigned int val;  		val = snd_hda_codec_get_pin_target(codec, nids[i]);  		val |= AC_PINCTL_VREF_50; @@ -1903,6 +1900,26 @@ static void alc889_fixup_imac91_vref(struct hda_codec *codec,  	spec->gen.keep_vref_in_automute = 1;  } +/* Set VREF on speaker pins on imac91 */ +static void alc889_fixup_imac91_vref(struct hda_codec *codec, +				     const struct hda_fixup *fix, int action) +{ +	static hda_nid_t nids[2] = { 0x18, 0x1a }; + +	if (action == HDA_FIXUP_ACT_INIT) +		alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids)); +} + +/* Set VREF on speaker pins on mba21 */ +static void alc889_fixup_mba21_vref(struct hda_codec *codec, +				    const struct hda_fixup *fix, int action) +{ +	static hda_nid_t nids[2] = { 0x18, 0x19 }; + +	if (action == HDA_FIXUP_ACT_INIT) +		alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids)); +} +  /* Don't take HP output as primary   * Strangely, the speaker output doesn't work on Vaio Z and some Vaio   * all-in-one desktop PCs (for example VGC-LN51JGB) through DAC 0x05 @@ -2102,6 +2119,12 @@ static const struct hda_fixup alc882_fixups[] = {  		.chained = true,  		.chain_id = ALC882_FIXUP_GPIO1,  	}, +	[ALC889_FIXUP_MBA21_VREF] = { +		.type = HDA_FIXUP_FUNC, +		.v.func = alc889_fixup_mba21_vref, +		.chained = true, +		.chain_id = ALC889_FIXUP_MBP_VREF, +	},  	[ALC882_FIXUP_INV_DMIC] = {  		.type = HDA_FIXUP_FUNC,  		.v.func = alc_fixup_inv_dmic_0x12, @@ -2172,7 +2195,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {  	SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889_FIXUP_MBP_VREF),  	SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_FIXUP_EAPD),  	SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC889_FIXUP_MBP_VREF), -	SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC889_FIXUP_MBP_VREF), +	SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC889_FIXUP_MBA21_VREF),  	SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889_FIXUP_MBP_VREF),  	SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),  	SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_FIXUP_MACPRO_GPIO), @@ -3287,6 +3310,7 @@ static void alc_headset_mode_ctia(struct hda_codec *codec)  		alc_write_coef_idx(codec, 0x18, 0x7388);  		break;  	case 0x10ec0668: +		alc_write_coef_idx(codec, 0x11, 0x0001);  		alc_write_coef_idx(codec, 0x15, 0x0d60);  		alc_write_coef_idx(codec, 0xc3, 0x0000);  		break; @@ -3315,6 +3339,7 @@ static void alc_headset_mode_omtp(struct hda_codec *codec)  		alc_write_coef_idx(codec, 0x18, 0x7388);  		break;  	case 0x10ec0668: +		alc_write_coef_idx(codec, 0x11, 0x0001);  		alc_write_coef_idx(codec, 0x15, 0x0d50);  		alc_write_coef_idx(codec, 0xc3, 0x0000);  		break; @@ -3600,11 +3625,6 @@ static void alc283_hp_automute_hook(struct hda_codec *codec,  			    vref);  } -static void alc283_chromebook_caps(struct hda_codec *codec) -{ -	snd_hda_override_wcaps(codec, 0x03, 0); -} -  static void alc283_fixup_chromebook(struct hda_codec *codec,  				    const struct hda_fixup *fix, int action)  { @@ -3613,9 +3633,26 @@ static void alc283_fixup_chromebook(struct hda_codec *codec,  	switch (action) {  	case HDA_FIXUP_ACT_PRE_PROBE: -		alc283_chromebook_caps(codec); +		snd_hda_override_wcaps(codec, 0x03, 0);  		/* Disable AA-loopback as it causes white noise */  		spec->gen.mixer_nid = 0; +		break; +	case HDA_FIXUP_ACT_INIT: +		/* Enable Line1 input control by verb */ +		val = alc_read_coef_idx(codec, 0x1a); +		alc_write_coef_idx(codec, 0x1a, val | (1 << 4)); +		break; +	} +} + +static void alc283_fixup_sense_combo_jack(struct hda_codec *codec, +				    const struct hda_fixup *fix, int action) +{ +	struct alc_spec *spec = codec->spec; +	int val; + +	switch (action) { +	case HDA_FIXUP_ACT_PRE_PROBE:  		spec->gen.hp_automute_hook = alc283_hp_automute_hook;  		break;  	case HDA_FIXUP_ACT_INIT: @@ -3623,9 +3660,6 @@ static void alc283_fixup_chromebook(struct hda_codec *codec,  		/* Set to manual mode */  		val = alc_read_coef_idx(codec, 0x06);  		alc_write_coef_idx(codec, 0x06, val & ~0x000c); -		/* Enable Line1 input control by verb */ -		val = alc_read_coef_idx(codec, 0x1a); -		alc_write_coef_idx(codec, 0x1a, val | (1 << 4));  		break;  	}  } @@ -3821,6 +3855,7 @@ enum {  	ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED,  	ALC269VB_FIXUP_ORDISSIMO_EVE2,  	ALC283_FIXUP_CHROME_BOOK, +	ALC283_FIXUP_SENSE_COMBO_JACK,  	ALC282_FIXUP_ASUS_TX300,  	ALC283_FIXUP_INT_MIC,  	ALC290_FIXUP_MONO_SPEAKERS, @@ -4120,6 +4155,12 @@ static const struct hda_fixup alc269_fixups[] = {  		.type = HDA_FIXUP_FUNC,  		.v.func = alc283_fixup_chromebook,  	}, +	[ALC283_FIXUP_SENSE_COMBO_JACK] = { +		.type = HDA_FIXUP_FUNC, +		.v.func = alc283_fixup_sense_combo_jack, +		.chained = true, +		.chain_id = ALC283_FIXUP_CHROME_BOOK, +	},  	[ALC282_FIXUP_ASUS_TX300] = {  		.type = HDA_FIXUP_FUNC,  		.v.func = alc282_fixup_asus_tx300, @@ -4202,6 +4243,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {  	SND_PCI_QUIRK(0x1028, 0x0614, "Dell Inspiron 3135", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),  	SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_MONO_SPEAKERS),  	SND_PCI_QUIRK(0x1028, 0x061f, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE), +	SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS),  	SND_PCI_QUIRK(0x1028, 0x063f, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),  	SND_PCI_QUIRK(0x1028, 0x15cc, "Dell X5 Precision", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE),  	SND_PCI_QUIRK(0x1028, 0x15cd, "Dell X5 Precision", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE), @@ -4210,7 +4252,6 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {  	SND_PCI_QUIRK(0x103c, 0x1973, "HP Pavilion", ALC269_FIXUP_HP_MUTE_LED_MIC1),  	SND_PCI_QUIRK(0x103c, 0x1983, "HP Pavilion", ALC269_FIXUP_HP_MUTE_LED_MIC1),  	SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED), -	SND_PCI_QUIRK(0x103c, 0x21ed, "HP Falco Chromebook", ALC283_FIXUP_CHROME_BOOK),  	SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED),  	SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),  	SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), @@ -4318,6 +4359,8 @@ static const struct hda_model_fixup alc269_fixup_models[] = {  	{.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},  	{.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"},  	{.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"}, +	{.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-chrome"}, +	{.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"},  	{}  }; @@ -4493,6 +4536,7 @@ enum {  	ALC861_FIXUP_AMP_VREF_0F,  	ALC861_FIXUP_NO_JACK_DETECT,  	ALC861_FIXUP_ASUS_A6RP, +	ALC660_FIXUP_ASUS_W7J,  };  /* On some laptops, VREF of pin 0x0f is abused for controlling the main amp */ @@ -4542,10 +4586,22 @@ static const struct hda_fixup alc861_fixups[] = {  		.v.func = alc861_fixup_asus_amp_vref_0f,  		.chained = true,  		.chain_id = ALC861_FIXUP_NO_JACK_DETECT, +	}, +	[ALC660_FIXUP_ASUS_W7J] = { +		.type = HDA_FIXUP_VERBS, +		.v.verbs = (const struct hda_verb[]) { +			/* ASUS W7J needs a magic pin setup on unused NID 0x10 +			 * for enabling outputs +			 */ +			{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, +			{ } +		},  	}  };  static const struct snd_pci_quirk alc861_fixup_tbl[] = { +	SND_PCI_QUIRK(0x1043, 0x1253, "ASUS W7J", ALC660_FIXUP_ASUS_W7J), +	SND_PCI_QUIRK(0x1043, 0x1263, "ASUS Z35HL", ALC660_FIXUP_ASUS_W7J),  	SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", ALC861_FIXUP_ASUS_A6RP),  	SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", ALC861_FIXUP_AMP_VREF_0F),  	SND_PCI_QUIRK(0x1462, 0x7254, "HP DX2200", ALC861_FIXUP_NO_JACK_DETECT), diff --git a/sound/soc/atmel/sam9x5_wm8731.c b/sound/soc/atmel/sam9x5_wm8731.c index 992ae38d5a15..1b372283bd01 100644 --- a/sound/soc/atmel/sam9x5_wm8731.c +++ b/sound/soc/atmel/sam9x5_wm8731.c @@ -97,6 +97,8 @@ static int sam9x5_wm8731_driver_probe(struct platform_device *pdev)  		goto out;  	} +	snd_soc_card_set_drvdata(card, priv); +  	card->dev = &pdev->dev;  	card->owner = THIS_MODULE;  	card->dai_link = dai; diff --git a/sound/soc/codecs/wm5110.c b/sound/soc/codecs/wm5110.c index c3c7396a6181..99b359e19d35 100644 --- a/sound/soc/codecs/wm5110.c +++ b/sound/soc/codecs/wm5110.c @@ -248,19 +248,6 @@ ARIZONA_MIXER_CONTROLS("SPKDAT1R", ARIZONA_OUT5RMIX_INPUT_1_SOURCE),  ARIZONA_MIXER_CONTROLS("SPKDAT2L", ARIZONA_OUT6LMIX_INPUT_1_SOURCE),  ARIZONA_MIXER_CONTROLS("SPKDAT2R", ARIZONA_OUT6RMIX_INPUT_1_SOURCE), -SOC_SINGLE("HPOUT1 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_1L, -	   ARIZONA_OUT1_OSR_SHIFT, 1, 0), -SOC_SINGLE("HPOUT2 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_2L, -	   ARIZONA_OUT2_OSR_SHIFT, 1, 0), -SOC_SINGLE("HPOUT3 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_3L, -	   ARIZONA_OUT3_OSR_SHIFT, 1, 0), -SOC_SINGLE("Speaker High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_4L, -	   ARIZONA_OUT4_OSR_SHIFT, 1, 0), -SOC_SINGLE("SPKDAT1 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_5L, -	   ARIZONA_OUT5_OSR_SHIFT, 1, 0), -SOC_SINGLE("SPKDAT2 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_6L, -	   ARIZONA_OUT6_OSR_SHIFT, 1, 0), -  SOC_DOUBLE_R("HPOUT1 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_1L,  	     ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_MUTE_SHIFT, 1, 1),  SOC_DOUBLE_R("HPOUT2 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_2L, @@ -293,18 +280,6 @@ SOC_DOUBLE_R_TLV("SPKDAT2 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_6L,  		 ARIZONA_DAC_DIGITAL_VOLUME_6R, ARIZONA_OUT6L_VOL_SHIFT,  		 0xbf, 0, digital_tlv), -SOC_DOUBLE_R_RANGE_TLV("HPOUT1 Volume", ARIZONA_OUTPUT_PATH_CONFIG_1L, -		       ARIZONA_OUTPUT_PATH_CONFIG_1R, -		       ARIZONA_OUT1L_PGA_VOL_SHIFT, -		       0x34, 0x40, 0, ana_tlv), -SOC_DOUBLE_R_RANGE_TLV("HPOUT2 Volume", ARIZONA_OUTPUT_PATH_CONFIG_2L, -		       ARIZONA_OUTPUT_PATH_CONFIG_2R, -		       ARIZONA_OUT2L_PGA_VOL_SHIFT, -		       0x34, 0x40, 0, ana_tlv), -SOC_DOUBLE_R_RANGE_TLV("HPOUT3 Volume", ARIZONA_OUTPUT_PATH_CONFIG_3L, -		       ARIZONA_OUTPUT_PATH_CONFIG_3R, -		       ARIZONA_OUT3L_PGA_VOL_SHIFT, 0x34, 0x40, 0, ana_tlv), -  SOC_DOUBLE("SPKDAT1 Switch", ARIZONA_PDM_SPK1_CTRL_1, ARIZONA_SPK1L_MUTE_SHIFT,  	   ARIZONA_SPK1R_MUTE_SHIFT, 1, 1),  SOC_DOUBLE("SPKDAT2 Switch", ARIZONA_PDM_SPK2_CTRL_1, ARIZONA_SPK2L_MUTE_SHIFT, diff --git a/sound/soc/codecs/wm8731.c b/sound/soc/codecs/wm8731.c index 456bb8c6d759..bc7472c968e3 100644 --- a/sound/soc/codecs/wm8731.c +++ b/sound/soc/codecs/wm8731.c @@ -447,10 +447,10 @@ static int wm8731_set_dai_fmt(struct snd_soc_dai *codec_dai,  		iface |= 0x0001;  		break;  	case SND_SOC_DAIFMT_DSP_A: -		iface |= 0x0003; +		iface |= 0x0013;  		break;  	case SND_SOC_DAIFMT_DSP_B: -		iface |= 0x0013; +		iface |= 0x0003;  		break;  	default:  		return -EINVAL; diff --git a/sound/soc/codecs/wm8990.c b/sound/soc/codecs/wm8990.c index 253c88bb7a4c..4f05fb88bddf 100644 --- a/sound/soc/codecs/wm8990.c +++ b/sound/soc/codecs/wm8990.c @@ -1259,6 +1259,8 @@ static int wm8990_set_bias_level(struct snd_soc_codec *codec,  		/* disable POBCTRL, SOFT_ST and BUFDCOPEN */  		snd_soc_write(codec, WM8990_ANTIPOP2, 0x0); + +		codec->cache_sync = 1;  		break;  	} diff --git a/sound/soc/fsl/pcm030-audio-fabric.c b/sound/soc/fsl/pcm030-audio-fabric.c index eb4373840bb6..3665f612819d 100644 --- a/sound/soc/fsl/pcm030-audio-fabric.c +++ b/sound/soc/fsl/pcm030-audio-fabric.c @@ -69,7 +69,6 @@ static int pcm030_fabric_probe(struct platform_device *op)  		return -ENOMEM;  	card->dev = &op->dev; -	platform_set_drvdata(op, pdata);  	pdata->card = card; @@ -98,6 +97,8 @@ static int pcm030_fabric_probe(struct platform_device *op)  	if (ret)  		dev_err(&op->dev, "snd_soc_register_card() failed: %d\n", ret); +	platform_set_drvdata(op, pdata); +  	return ret;  } diff --git a/sound/soc/kirkwood/kirkwood-i2s.c b/sound/soc/kirkwood/kirkwood-i2s.c index d34d91743e3f..0b18f654b413 100644 --- a/sound/soc/kirkwood/kirkwood-i2s.c +++ b/sound/soc/kirkwood/kirkwood-i2s.c @@ -33,6 +33,10 @@  	 SNDRV_PCM_FMTBIT_S24_LE | \  	 SNDRV_PCM_FMTBIT_S32_LE) +#define KIRKWOOD_SPDIF_FORMATS \ +	(SNDRV_PCM_FMTBIT_S16_LE | \ +	 SNDRV_PCM_FMTBIT_S24_LE) +  static int kirkwood_i2s_set_fmt(struct snd_soc_dai *cpu_dai,  		unsigned int fmt)  { @@ -244,15 +248,15 @@ static int kirkwood_i2s_play_trigger(struct snd_pcm_substream *substream,  				   ctl);  	} -	if (dai->id == 0) -		ctl &= ~KIRKWOOD_PLAYCTL_SPDIF_EN;	/* i2s */ -	else -		ctl &= ~KIRKWOOD_PLAYCTL_I2S_EN;	/* spdif */ -  	switch (cmd) {  	case SNDRV_PCM_TRIGGER_START:  		/* configure */  		ctl = priv->ctl_play; +		if (dai->id == 0) +			ctl &= ~KIRKWOOD_PLAYCTL_SPDIF_EN;	/* i2s */ +		else +			ctl &= ~KIRKWOOD_PLAYCTL_I2S_EN;	/* spdif */ +  		value = ctl & ~KIRKWOOD_PLAYCTL_ENABLE_MASK;  		writel(value, priv->io + KIRKWOOD_PLAYCTL); @@ -449,14 +453,14 @@ static struct snd_soc_dai_driver kirkwood_i2s_dai[2] = {  		.channels_max = 2,  		.rates = SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |  				SNDRV_PCM_RATE_96000, -		.formats = KIRKWOOD_I2S_FORMATS, +		.formats = KIRKWOOD_SPDIF_FORMATS,  	},  	.capture = {  		.channels_min = 1,  		.channels_max = 2,  		.rates = SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |  				SNDRV_PCM_RATE_96000, -		.formats = KIRKWOOD_I2S_FORMATS, +		.formats = KIRKWOOD_SPDIF_FORMATS,  	},  	.ops = &kirkwood_i2s_dai_ops,      }, @@ -493,7 +497,7 @@ static struct snd_soc_dai_driver kirkwood_i2s_dai_extclk[2] = {  		.rates = SNDRV_PCM_RATE_8000_192000 |  			 SNDRV_PCM_RATE_CONTINUOUS |  			 SNDRV_PCM_RATE_KNOT, -		.formats = KIRKWOOD_I2S_FORMATS, +		.formats = KIRKWOOD_SPDIF_FORMATS,  	},  	.capture = {  		.channels_min = 1, @@ -501,7 +505,7 @@ static struct snd_soc_dai_driver kirkwood_i2s_dai_extclk[2] = {  		.rates = SNDRV_PCM_RATE_8000_192000 |  			 SNDRV_PCM_RATE_CONTINUOUS |  			 SNDRV_PCM_RATE_KNOT, -		.formats = KIRKWOOD_I2S_FORMATS, +		.formats = KIRKWOOD_SPDIF_FORMATS,  	},  	.ops = &kirkwood_i2s_dai_ops,      }, diff --git a/sound/soc/omap/n810.c b/sound/soc/omap/n810.c index 6d216cb6c19b..3fde9e402710 100644 --- a/sound/soc/omap/n810.c +++ b/sound/soc/omap/n810.c @@ -100,12 +100,12 @@ static int n810_startup(struct snd_pcm_substream *substream)  				     SNDRV_PCM_HW_PARAM_CHANNELS, 2, 2);  	n810_ext_control(&codec->dapm); -	return clk_enable(sys_clkout2); +	return clk_prepare_enable(sys_clkout2);  }  static void n810_shutdown(struct snd_pcm_substream *substream)  { -	clk_disable(sys_clkout2); +	clk_disable_unprepare(sys_clkout2);  }  static int n810_hw_params(struct snd_pcm_substream *substream, diff --git a/sound/soc/sh/Kconfig b/sound/soc/sh/Kconfig index 14011d90d70a..ff60e11ecb56 100644 --- a/sound/soc/sh/Kconfig +++ b/sound/soc/sh/Kconfig @@ -37,6 +37,7 @@ config SND_SOC_SH4_SIU  config SND_SOC_RCAR  	tristate "R-Car series SRU/SCU/SSIU/SSI support"  	select SND_SIMPLE_CARD +	select REGMAP  	help  	  This option enables R-Car SUR/SCU/SSIU/SSI sound support diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 4e53d87e881d..a66783e13a9c 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -3212,11 +3212,11 @@ int snd_soc_bytes_get(struct snd_kcontrol *kcontrol,  			break;  		case 2:  			((u16 *)(&ucontrol->value.bytes.data))[0] -				&= ~params->mask; +				&= cpu_to_be16(~params->mask);  			break;  		case 4:  			((u32 *)(&ucontrol->value.bytes.data))[0] -				&= ~params->mask; +				&= cpu_to_be32(~params->mask);  			break;  		default:  			return -EINVAL; diff --git a/sound/soc/soc-devres.c b/sound/soc/soc-devres.c index b1d732255c02..3449c1e909ae 100644 --- a/sound/soc/soc-devres.c +++ b/sound/soc/soc-devres.c @@ -66,7 +66,7 @@ static void devm_card_release(struct device *dev, void *res)   */  int devm_snd_soc_register_card(struct device *dev, struct snd_soc_card *card)  { -	struct device **ptr; +	struct snd_soc_card **ptr;  	int ret;  	ptr = devres_alloc(devm_card_release, sizeof(*ptr), GFP_KERNEL); @@ -75,7 +75,7 @@ int devm_snd_soc_register_card(struct device *dev, struct snd_soc_card *card)  	ret = snd_soc_register_card(card);  	if (ret == 0) { -		*ptr = dev; +		*ptr = card;  		devres_add(dev, ptr);  	} else {  		devres_free(ptr); diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c index 42782c01e413..11a90cd027fa 100644 --- a/sound/soc/soc-pcm.c +++ b/sound/soc/soc-pcm.c @@ -148,12 +148,12 @@ static void soc_pcm_apply_msb(struct snd_pcm_substream *substream,  	}  } -static void soc_pcm_init_runtime_hw(struct snd_pcm_hardware *hw, +static void soc_pcm_init_runtime_hw(struct snd_pcm_runtime *runtime,  	struct snd_soc_pcm_stream *codec_stream,  	struct snd_soc_pcm_stream *cpu_stream)  { -	hw->rate_min = max(codec_stream->rate_min, cpu_stream->rate_min); -	hw->rate_max = max(codec_stream->rate_max, cpu_stream->rate_max); +	struct snd_pcm_hardware *hw = &runtime->hw; +  	hw->channels_min = max(codec_stream->channels_min,  		cpu_stream->channels_min);  	hw->channels_max = min(codec_stream->channels_max, @@ -166,6 +166,13 @@ static void soc_pcm_init_runtime_hw(struct snd_pcm_hardware *hw,  	if (cpu_stream->rates  		& (SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_CONTINUOUS))  		hw->rates |= codec_stream->rates; + +	snd_pcm_limit_hw_rates(runtime); + +	hw->rate_min = max(hw->rate_min, cpu_stream->rate_min); +	hw->rate_min = max(hw->rate_min, codec_stream->rate_min); +	hw->rate_max = min_not_zero(hw->rate_max, cpu_stream->rate_max); +	hw->rate_max = min_not_zero(hw->rate_max, codec_stream->rate_max);  }  /* @@ -235,15 +242,14 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)  	/* Check that the codec and cpu DAIs are compatible */  	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { -		soc_pcm_init_runtime_hw(&runtime->hw, &codec_dai_drv->playback, +		soc_pcm_init_runtime_hw(runtime, &codec_dai_drv->playback,  			&cpu_dai_drv->playback);  	} else { -		soc_pcm_init_runtime_hw(&runtime->hw, &codec_dai_drv->capture, +		soc_pcm_init_runtime_hw(runtime, &codec_dai_drv->capture,  			&cpu_dai_drv->capture);  	}  	ret = -EINVAL; -	snd_pcm_limit_hw_rates(runtime);  	if (!runtime->hw.rates) {  		printk(KERN_ERR "ASoC: %s <-> %s No matching rates\n",  			codec_dai->name, cpu_dai->name); diff --git a/tools/usb/Makefile b/tools/usb/Makefile index 396d6c44e9d7..acf2165c04e6 100644 --- a/tools/usb/Makefile +++ b/tools/usb/Makefile @@ -3,11 +3,12 @@  CC = $(CROSS_COMPILE)gcc  PTHREAD_LIBS = -lpthread  WARNINGS = -Wall -Wextra -CFLAGS = $(WARNINGS) -g $(PTHREAD_LIBS) -I../include +CFLAGS = $(WARNINGS) -g -I../include +LDFLAGS = $(PTHREAD_LIBS)  all: testusb ffs-test  %: %.c -	$(CC) $(CFLAGS) -o $@ $^ +	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)  clean:  	$(RM) testusb ffs-test |