diff options
329 files changed, 2706 insertions, 1289 deletions
@@ -111,6 +111,7 @@ Uwe Kleine-König <ukleinek@informatik.uni-freiburg.de>  Uwe Kleine-König <ukl@pengutronix.de>  Uwe Kleine-König <Uwe.Kleine-Koenig@digi.com>  Valdis Kletnieks <Valdis.Kletnieks@vt.edu> +Viresh Kumar <viresh.linux@gmail.com> <viresh.kumar@st.com>  Takashi YOSHII <takashi.yoshii.zj@renesas.com>  Yusuke Goda <goda.yusuke@renesas.com>  Gustavo Padovan <gustavo@las.ic.unicamp.br> diff --git a/Documentation/ABI/testing/sysfs-bus-iio b/Documentation/ABI/testing/sysfs-bus-iio index 5bc8a476c15..cfedf63cce1 100644 --- a/Documentation/ABI/testing/sysfs-bus-iio +++ b/Documentation/ABI/testing/sysfs-bus-iio @@ -219,6 +219,7 @@ What:		/sys/bus/iio/devices/iio:deviceX/in_voltageY_scale  What:		/sys/bus/iio/devices/iio:deviceX/in_voltageY_supply_scale  What:		/sys/bus/iio/devices/iio:deviceX/in_voltage_scale  What:		/sys/bus/iio/devices/iio:deviceX/out_voltageY_scale +What:		/sys/bus/iio/devices/iio:deviceX/out_altvoltageY_scale  What:		/sys/bus/iio/devices/iio:deviceX/in_accel_scale  What:		/sys/bus/iio/devices/iio:deviceX/in_accel_peak_scale  What:		/sys/bus/iio/devices/iio:deviceX/in_anglvel_scale @@ -273,6 +274,7 @@ What:		/sys/bus/iio/devices/iio:deviceX/in_accel_scale_available  What:		/sys/.../iio:deviceX/in_voltageX_scale_available  What:		/sys/.../iio:deviceX/in_voltage-voltage_scale_available  What:		/sys/.../iio:deviceX/out_voltageX_scale_available +What:		/sys/.../iio:deviceX/out_altvoltageX_scale_available  What:		/sys/.../iio:deviceX/in_capacitance_scale_available  KernelVersion:	2.635  Contact:	linux-iio@vger.kernel.org @@ -298,14 +300,19 @@ Description:  		gives the 3dB frequency of the filter in Hz.  What:		/sys/bus/iio/devices/iio:deviceX/out_voltageY_raw +What:		/sys/bus/iio/devices/iio:deviceX/out_altvoltageY_raw  KernelVersion:	2.6.37  Contact:	linux-iio@vger.kernel.org  Description:  		Raw (unscaled, no bias etc.) output voltage for  		channel Y.  The number must always be specified and  		unique if the output corresponds to a single channel. +		While DAC like devices typically use out_voltage, +		a continuous frequency generating device, such as +		a DDS or PLL should use out_altvoltage.  What:		/sys/bus/iio/devices/iio:deviceX/out_voltageY&Z_raw +What:		/sys/bus/iio/devices/iio:deviceX/out_altvoltageY&Z_raw  KernelVersion:	2.6.37  Contact:	linux-iio@vger.kernel.org  Description: @@ -316,6 +323,8 @@ Description:  What:		/sys/bus/iio/devices/iio:deviceX/out_voltageY_powerdown_mode  What:		/sys/bus/iio/devices/iio:deviceX/out_voltage_powerdown_mode +What:		/sys/bus/iio/devices/iio:deviceX/out_altvoltageY_powerdown_mode +What:		/sys/bus/iio/devices/iio:deviceX/out_altvoltage_powerdown_mode  KernelVersion:	2.6.38  Contact:	linux-iio@vger.kernel.org  Description: @@ -330,6 +339,8 @@ Description:  What:		/sys/.../iio:deviceX/out_votlageY_powerdown_mode_available  What:		/sys/.../iio:deviceX/out_voltage_powerdown_mode_available +What:		/sys/.../iio:deviceX/out_altvotlageY_powerdown_mode_available +What:		/sys/.../iio:deviceX/out_altvoltage_powerdown_mode_available  KernelVersion:	2.6.38  Contact:	linux-iio@vger.kernel.org  Description: @@ -338,6 +349,8 @@ Description:  What:		/sys/bus/iio/devices/iio:deviceX/out_voltageY_powerdown  What:		/sys/bus/iio/devices/iio:deviceX/out_voltage_powerdown +What:		/sys/bus/iio/devices/iio:deviceX/out_altvoltageY_powerdown +What:		/sys/bus/iio/devices/iio:deviceX/out_altvoltage_powerdown  KernelVersion:	2.6.38  Contact:	linux-iio@vger.kernel.org  Description: @@ -346,6 +359,24 @@ Description:  		normal operation. Y may be suppressed if all outputs are  		controlled together. +What:		/sys/bus/iio/devices/iio:deviceX/out_altvoltageY_frequency +KernelVersion:	3.4.0 +Contact:	linux-iio@vger.kernel.org +Description: +		Output frequency for channel Y in Hz. The number must always be +		specified and unique if the output corresponds to a single +		channel. + +What:		/sys/bus/iio/devices/iio:deviceX/out_altvoltageY_phase +KernelVersion:	3.4.0 +Contact:	linux-iio@vger.kernel.org +Description: +		Phase in radians of one frequency/clock output Y +		(out_altvoltageY) relative to another frequency/clock output +		(out_altvoltageZ) of the device X. The number must always be +		specified and unique if the output corresponds to a single +		channel. +  What:		/sys/bus/iio/devices/iio:deviceX/events  KernelVersion:	2.6.35  Contact:	linux-iio@vger.kernel.org diff --git a/Documentation/arm/SPEAr/overview.txt b/Documentation/arm/SPEAr/overview.txt index 57aae7765c7..65610bf52eb 100644 --- a/Documentation/arm/SPEAr/overview.txt +++ b/Documentation/arm/SPEAr/overview.txt @@ -60,4 +60,4 @@ Introduction    Document Author    --------------- -  Viresh Kumar <viresh.kumar@st.com>, (c) 2010-2012 ST Microelectronics +  Viresh Kumar <viresh.linux@gmail.com>, (c) 2010-2012 ST Microelectronics diff --git a/Documentation/hwmon/coretemp b/Documentation/hwmon/coretemp index 84d46c0c71a..c86b50c03ea 100644 --- a/Documentation/hwmon/coretemp +++ b/Documentation/hwmon/coretemp @@ -6,7 +6,9 @@ Supported chips:      Prefix: 'coretemp'      CPUID: family 0x6, models 0xe (Pentium M DC), 0xf (Core 2 DC 65nm),                                0x16 (Core 2 SC 65nm), 0x17 (Penryn 45nm), -                              0x1a (Nehalem), 0x1c (Atom), 0x1e (Lynnfield) +                              0x1a (Nehalem), 0x1c (Atom), 0x1e (Lynnfield), +                              0x26 (Tunnel Creek Atom), 0x27 (Medfield Atom), +                              0x36 (Cedar Trail Atom)      Datasheet: Intel 64 and IA-32 Architectures Software Developer's Manual                 Volume 3A: System Programming Guide                 http://softwarecommunity.intel.com/Wiki/Mobility/720.htm @@ -52,6 +54,17 @@ Some information comes from ark.intel.com  Process		Processor					TjMax(C) +22nm		Core i5/i7 Processors +		i7 3920XM, 3820QM, 3720QM, 3667U, 3520M		105 +		i5 3427U, 3360M/3320M				105 +		i7 3770/3770K					105 +		i5 3570/3570K, 3550, 3470/3450			105 +		i7 3770S					103 +		i5 3570S/3550S, 3475S/3470S/3450S		103 +		i7 3770T					94 +		i5 3570T					94 +		i5 3470T					91 +  32nm		Core i3/i5/i7 Processors  		i7 660UM/640/620, 640LM/620, 620M, 610E		105  		i5 540UM/520/430, 540M/520/450/430		105 @@ -65,6 +78,11 @@ Process		Processor					TjMax(C)  		U3400						105  		P4505/P4500 					90 +32nm		Atom Processors +		Z2460						90 +		D2700/2550/2500					100 +		N2850/2800/2650/2600				100 +  45nm		Xeon Processors 5400 Quad-Core  		X5492, X5482, X5472, X5470, X5460, X5450	85  		E5472, E5462, E5450/40/30/20/10/05		85 @@ -85,6 +103,8 @@ Process		Processor					TjMax(C)  		N475/470/455/450				100  		N280/270					90  		330/230						125 +		E680/660/640/620				90 +		E680T/660T/640T/620T				110  45nm		Core2 Processors  		Solo ULV SU3500/3300				100 diff --git a/MAINTAINERS b/MAINTAINERS index 3e30a3afe2a..eb22272b211 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -579,7 +579,7 @@ F:	drivers/net/appletalk/  F:	net/appletalk/  ARASAN COMPACT FLASH PATA CONTROLLER -M:	Viresh Kumar <viresh.kumar@st.com> +M:     Viresh Kumar <viresh.linux@gmail.com>  L:	linux-ide@vger.kernel.org  S:	Maintained  F:	include/linux/pata_arasan_cf_data.h @@ -5296,7 +5296,7 @@ S:	Maintained  F:	drivers/pinctrl/  PIN CONTROLLER - ST SPEAR -M:	Viresh Kumar <viresh.kumar@st.com> +M:     Viresh Kumar <viresh.linux@gmail.com>  L:	spear-devel@list.st.com  L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)  W:	http://www.st.com/spear @@ -5873,7 +5873,7 @@ S:	Maintained  F:	drivers/tty/serial  SYNOPSYS DESIGNWARE DMAC DRIVER -M:	Viresh Kumar <viresh.kumar@st.com> +M:     Viresh Kumar <viresh.linux@gmail.com>  S:	Maintained  F:	include/linux/dw_dmac.h  F:	drivers/dma/dw_dmac_regs.h @@ -6021,7 +6021,7 @@ S:	Maintained  F:	drivers/mmc/host/sdhci-s3c.c  SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) ST SPEAR DRIVER -M:	Viresh Kumar <viresh.kumar@st.com> +M:     Viresh Kumar <viresh.linux@gmail.com>  L:	spear-devel@list.st.com  L:	linux-mmc@vger.kernel.org  S:	Maintained @@ -6377,7 +6377,7 @@ S:	Maintained  F:	include/linux/compiler.h  SPEAR PLATFORM SUPPORT -M:	Viresh Kumar <viresh.kumar@st.com> +M:     Viresh Kumar <viresh.linux@gmail.com>  M:	Shiraz Hashim <shiraz.hashim@st.com>  L:	spear-devel@list.st.com  L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) @@ -6386,7 +6386,7 @@ S:	Maintained  F:	arch/arm/plat-spear/  SPEAR13XX MACHINE SUPPORT -M:	Viresh Kumar <viresh.kumar@st.com> +M:     Viresh Kumar <viresh.linux@gmail.com>  M:	Shiraz Hashim <shiraz.hashim@st.com>  L:	spear-devel@list.st.com  L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) @@ -6395,7 +6395,7 @@ S:	Maintained  F:	arch/arm/mach-spear13xx/  SPEAR3XX MACHINE SUPPORT -M:	Viresh Kumar <viresh.kumar@st.com> +M:     Viresh Kumar <viresh.linux@gmail.com>  M:	Shiraz Hashim <shiraz.hashim@st.com>  L:	spear-devel@list.st.com  L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) @@ -6406,7 +6406,7 @@ F:	arch/arm/mach-spear3xx/  SPEAR6XX MACHINE SUPPORT  M:	Rajeev Kumar <rajeev-dlh.kumar@st.com>  M:	Shiraz Hashim <shiraz.hashim@st.com> -M:	Viresh Kumar <viresh.kumar@st.com> +M:     Viresh Kumar <viresh.linux@gmail.com>  L:	spear-devel@list.st.com  L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)  W:	http://www.st.com/spear @@ -6414,7 +6414,7 @@ S:	Maintained  F:	arch/arm/mach-spear6xx/  SPEAR CLOCK FRAMEWORK SUPPORT -M:	Viresh Kumar <viresh.kumar@st.com> +M:     Viresh Kumar <viresh.linux@gmail.com>  L:	spear-devel@list.st.com  L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)  W:	http://www.st.com/spear @@ -7421,7 +7421,7 @@ F:	include/linux/vlynq.h  VME SUBSYSTEM  M:	Martyn Welch <martyn.welch@ge.com> -M:	Manohar Vanga <manohar.vanga@cern.ch> +M:	Manohar Vanga <manohar.vanga@gmail.com>  M:	Greg Kroah-Hartman <gregkh@linuxfoundation.org>  L:	devel@driverdev.osuosl.org  S:	Maintained @@ -1,7 +1,7 @@  VERSION = 3  PATCHLEVEL = 5  SUBLEVEL = 0 -EXTRAVERSION = -rc3 +EXTRAVERSION = -rc4  NAME = Saber-toothed Squirrel  # *DOCUMENTATION* @@ -561,6 +561,8 @@ else  KBUILD_CFLAGS	+= -O2  endif +include $(srctree)/arch/$(SRCARCH)/Makefile +  ifdef CONFIG_READABLE_ASM  # Disable optimizations that make assembler listings hard to read.  # reorder blocks reorders the control in the function @@ -571,8 +573,6 @@ KBUILD_CFLAGS += $(call cc-option,-fno-reorder-blocks,) \                   $(call cc-option,-fno-partial-inlining)  endif -include $(srctree)/arch/$(SRCARCH)/Makefile -  ifneq ($(CONFIG_FRAME_WARN),0)  KBUILD_CFLAGS += $(call cc-option,-Wframe-larger-than=${CONFIG_FRAME_WARN})  endif diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 4b1fc0d612b..0063845d208 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -293,6 +293,7 @@ config ARCH_VERSATILE  	select ICST  	select GENERIC_CLOCKEVENTS  	select ARCH_WANT_OPTIONAL_GPIOLIB +	select NEED_MACH_IO_H if PCI  	select PLAT_VERSATILE  	select PLAT_VERSATILE_CLCD  	select PLAT_VERSATILE_FPGA_IRQ @@ -588,6 +589,7 @@ config ARCH_ORION5X  	select PCI  	select ARCH_REQUIRE_GPIOLIB  	select GENERIC_CLOCKEVENTS +	select NEED_MACH_IO_H  	select PLAT_ORION  	help  	  Support for the following Marvell Orion 5x series SoCs: diff --git a/arch/arm/boot/dts/mmp2-brownstone.dts b/arch/arm/boot/dts/mmp2-brownstone.dts index 153a4b2d12b..c9b4f27d191 100644 --- a/arch/arm/boot/dts/mmp2-brownstone.dts +++ b/arch/arm/boot/dts/mmp2-brownstone.dts @@ -11,7 +11,7 @@  /include/ "mmp2.dtsi"  / { -	model = "Marvell MMP2 Aspenite Development Board"; +	model = "Marvell MMP2 Brownstone Development Board";  	compatible = "mrvl,mmp2-brownstone", "mrvl,mmp2";  	chosen { @@ -19,7 +19,7 @@  	};  	memory { -		reg = <0x00000000 0x04000000>; +		reg = <0x00000000 0x08000000>;  	};  	soc { diff --git a/arch/arm/boot/dts/omap2.dtsi b/arch/arm/boot/dts/omap2.dtsi index f2ab4ea7cc0..581cb081cb0 100644 --- a/arch/arm/boot/dts/omap2.dtsi +++ b/arch/arm/boot/dts/omap2.dtsi @@ -44,6 +44,8 @@  			compatible = "ti,omap2-intc";  			interrupt-controller;  			#interrupt-cells = <1>; +			ti,intc-size = <96>; +			reg = <0x480FE000 0x1000>;  		};  		uart1: serial@4806a000 { diff --git a/arch/arm/boot/dts/spear1310-evb.dts b/arch/arm/boot/dts/spear1310-evb.dts index 8314e417188..dd4358bc26e 100644 --- a/arch/arm/boot/dts/spear1310-evb.dts +++ b/arch/arm/boot/dts/spear1310-evb.dts @@ -1,7 +1,7 @@  /*   * DTS file for SPEAr1310 Evaluation Baord   * - * Copyright 2012 Viresh Kumar <viresh.kumar@st.com> + * Copyright 2012 Viresh Kumar <viresh.linux@gmail.com>   *   * The code contained herein is licensed under the GNU General Public   * License. You may obtain a copy of the GNU General Public License diff --git a/arch/arm/boot/dts/spear1310.dtsi b/arch/arm/boot/dts/spear1310.dtsi index 9e61da404d5..419ea7413d2 100644 --- a/arch/arm/boot/dts/spear1310.dtsi +++ b/arch/arm/boot/dts/spear1310.dtsi @@ -1,7 +1,7 @@  /*   * DTS file for all SPEAr1310 SoCs   * - * Copyright 2012 Viresh Kumar <viresh.kumar@st.com> + * Copyright 2012 Viresh Kumar <viresh.linux@gmail.com>   *   * The code contained herein is licensed under the GNU General Public   * License. You may obtain a copy of the GNU General Public License diff --git a/arch/arm/boot/dts/spear1340-evb.dts b/arch/arm/boot/dts/spear1340-evb.dts index 0d8472e5ab9..c9a54e06fb6 100644 --- a/arch/arm/boot/dts/spear1340-evb.dts +++ b/arch/arm/boot/dts/spear1340-evb.dts @@ -1,7 +1,7 @@  /*   * DTS file for SPEAr1340 Evaluation Baord   * - * Copyright 2012 Viresh Kumar <viresh.kumar@st.com> + * Copyright 2012 Viresh Kumar <viresh.linux@gmail.com>   *   * The code contained herein is licensed under the GNU General Public   * License. You may obtain a copy of the GNU General Public License diff --git a/arch/arm/boot/dts/spear1340.dtsi b/arch/arm/boot/dts/spear1340.dtsi index a26fc47a55e..d71fe2a68f0 100644 --- a/arch/arm/boot/dts/spear1340.dtsi +++ b/arch/arm/boot/dts/spear1340.dtsi @@ -1,7 +1,7 @@  /*   * DTS file for all SPEAr1340 SoCs   * - * Copyright 2012 Viresh Kumar <viresh.kumar@st.com> + * Copyright 2012 Viresh Kumar <viresh.linux@gmail.com>   *   * The code contained herein is licensed under the GNU General Public   * License. You may obtain a copy of the GNU General Public License diff --git a/arch/arm/boot/dts/spear13xx.dtsi b/arch/arm/boot/dts/spear13xx.dtsi index 1f8e1e1481d..10dcec7e732 100644 --- a/arch/arm/boot/dts/spear13xx.dtsi +++ b/arch/arm/boot/dts/spear13xx.dtsi @@ -1,7 +1,7 @@  /*   * DTS file for all SPEAr13xx SoCs   * - * Copyright 2012 Viresh Kumar <viresh.kumar@st.com> + * Copyright 2012 Viresh Kumar <viresh.linux@gmail.com>   *   * The code contained herein is licensed under the GNU General Public   * License. You may obtain a copy of the GNU General Public License diff --git a/arch/arm/boot/dts/spear300-evb.dts b/arch/arm/boot/dts/spear300-evb.dts index fc82b1a2645..d71b8d581e3 100644 --- a/arch/arm/boot/dts/spear300-evb.dts +++ b/arch/arm/boot/dts/spear300-evb.dts @@ -1,7 +1,7 @@  /*   * DTS file for SPEAr300 Evaluation Baord   * - * Copyright 2012 Viresh Kumar <viresh.kumar@st.com> + * Copyright 2012 Viresh Kumar <viresh.linux@gmail.com>   *   * The code contained herein is licensed under the GNU General Public   * License. You may obtain a copy of the GNU General Public License diff --git a/arch/arm/boot/dts/spear300.dtsi b/arch/arm/boot/dts/spear300.dtsi index 01c5e358fdb..ed3627c116c 100644 --- a/arch/arm/boot/dts/spear300.dtsi +++ b/arch/arm/boot/dts/spear300.dtsi @@ -1,7 +1,7 @@  /*   * DTS file for SPEAr300 SoC   * - * Copyright 2012 Viresh Kumar <viresh.kumar@st.com> + * Copyright 2012 Viresh Kumar <viresh.linux@gmail.com>   *   * The code contained herein is licensed under the GNU General Public   * License. You may obtain a copy of the GNU General Public License diff --git a/arch/arm/boot/dts/spear310-evb.dts b/arch/arm/boot/dts/spear310-evb.dts index dc5e2d445a9..b00544e0cd5 100644 --- a/arch/arm/boot/dts/spear310-evb.dts +++ b/arch/arm/boot/dts/spear310-evb.dts @@ -1,7 +1,7 @@  /*   * DTS file for SPEAr310 Evaluation Baord   * - * Copyright 2012 Viresh Kumar <viresh.kumar@st.com> + * Copyright 2012 Viresh Kumar <viresh.linux@gmail.com>   *   * The code contained herein is licensed under the GNU General Public   * License. You may obtain a copy of the GNU General Public License diff --git a/arch/arm/boot/dts/spear310.dtsi b/arch/arm/boot/dts/spear310.dtsi index e47081c494d..62fc4fb3e5f 100644 --- a/arch/arm/boot/dts/spear310.dtsi +++ b/arch/arm/boot/dts/spear310.dtsi @@ -1,7 +1,7 @@  /*   * DTS file for SPEAr310 SoC   * - * Copyright 2012 Viresh Kumar <viresh.kumar@st.com> + * Copyright 2012 Viresh Kumar <viresh.linux@gmail.com>   *   * The code contained herein is licensed under the GNU General Public   * License. You may obtain a copy of the GNU General Public License diff --git a/arch/arm/boot/dts/spear320-evb.dts b/arch/arm/boot/dts/spear320-evb.dts index 6308fa3bec1..c13fd1f3b09 100644 --- a/arch/arm/boot/dts/spear320-evb.dts +++ b/arch/arm/boot/dts/spear320-evb.dts @@ -1,7 +1,7 @@  /*   * DTS file for SPEAr320 Evaluation Baord   * - * Copyright 2012 Viresh Kumar <viresh.kumar@st.com> + * Copyright 2012 Viresh Kumar <viresh.linux@gmail.com>   *   * The code contained herein is licensed under the GNU General Public   * License. You may obtain a copy of the GNU General Public License diff --git a/arch/arm/boot/dts/spear320.dtsi b/arch/arm/boot/dts/spear320.dtsi index 5372ca399b1..1f49d69595a 100644 --- a/arch/arm/boot/dts/spear320.dtsi +++ b/arch/arm/boot/dts/spear320.dtsi @@ -1,7 +1,7 @@  /*   * DTS file for SPEAr320 SoC   * - * Copyright 2012 Viresh Kumar <viresh.kumar@st.com> + * Copyright 2012 Viresh Kumar <viresh.linux@gmail.com>   *   * The code contained herein is licensed under the GNU General Public   * License. You may obtain a copy of the GNU General Public License diff --git a/arch/arm/boot/dts/spear3xx.dtsi b/arch/arm/boot/dts/spear3xx.dtsi index 91072553963..3a8bb573692 100644 --- a/arch/arm/boot/dts/spear3xx.dtsi +++ b/arch/arm/boot/dts/spear3xx.dtsi @@ -1,7 +1,7 @@  /*   * DTS file for all SPEAr3xx SoCs   * - * Copyright 2012 Viresh Kumar <viresh.kumar@st.com> + * Copyright 2012 Viresh Kumar <viresh.linux@gmail.com>   *   * The code contained herein is licensed under the GNU General Public   * License. You may obtain a copy of the GNU General Public License diff --git a/arch/arm/include/asm/futex.h b/arch/arm/include/asm/futex.h index 7be54690aee..e42cf597f6e 100644 --- a/arch/arm/include/asm/futex.h +++ b/arch/arm/include/asm/futex.h @@ -19,6 +19,7 @@  	"	.long	1b, 4f, 2b, 4f\n"			\  	"	.popsection\n"					\  	"	.pushsection .fixup,\"ax\"\n"			\ +	"	.align	2\n"					\  	"4:	mov	%0, " err_reg "\n"			\  	"	b	3b\n"					\  	"	.popsection" diff --git a/arch/arm/include/asm/hardware/sp810.h b/arch/arm/include/asm/hardware/sp810.h index e0d1c0cfa54..6b9b077d86b 100644 --- a/arch/arm/include/asm/hardware/sp810.h +++ b/arch/arm/include/asm/hardware/sp810.h @@ -4,7 +4,7 @@   * ARM PrimeXsys System Controller SP810 header file   *   * Copyright (C) 2009 ST Microelectronics - * Viresh Kumar<viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index 437f0c42651..0d1851ca6eb 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S @@ -495,6 +495,7 @@ ENDPROC(__und_usr)   * The out of line fixup for the ldrt above.   */  	.pushsection .fixup, "ax" +	.align	2  4:	mov	pc, r9  	.popsection  	.pushsection __ex_table,"a" diff --git a/arch/arm/kernel/kprobes-thumb.c b/arch/arm/kernel/kprobes-thumb.c index 8f96ec778e8..6123daf397a 100644 --- a/arch/arm/kernel/kprobes-thumb.c +++ b/arch/arm/kernel/kprobes-thumb.c @@ -660,7 +660,7 @@ static const union decode_item t32_table_1111_100x[] = {  	/* LDRSB (literal)	1111 1001 x001 1111 xxxx xxxx xxxx xxxx */  	/* LDRH (literal)	1111 1000 x011 1111 xxxx xxxx xxxx xxxx */  	/* LDRSH (literal)	1111 1001 x011 1111 xxxx xxxx xxxx xxxx */ -	DECODE_EMULATEX	(0xfe5f0000, 0xf81f0000, t32_simulate_ldr_literal, +	DECODE_SIMULATEX(0xfe5f0000, 0xf81f0000, t32_simulate_ldr_literal,  						 REGS(PC, NOSPPCX, 0, 0, 0)),  	/* STRB (immediate)	1111 1000 0000 xxxx xxxx 1xxx xxxx xxxx */ diff --git a/arch/arm/mach-highbank/Makefile b/arch/arm/mach-highbank/Makefile index f8437dd238c..ded4652ada8 100644 --- a/arch/arm/mach-highbank/Makefile +++ b/arch/arm/mach-highbank/Makefile @@ -1,4 +1,8 @@ -obj-y					:= clock.o highbank.o system.o +obj-y					:= clock.o highbank.o system.o smc.o + +plus_sec := $(call as-instr,.arch_extension sec,+sec) +AFLAGS_smc.o				:=-Wa,-march=armv7-a$(plus_sec) +  obj-$(CONFIG_DEBUG_HIGHBANK_UART)	+= lluart.o  obj-$(CONFIG_SMP)			+= platsmp.o  obj-$(CONFIG_HOTPLUG_CPU)		+= hotplug.o diff --git a/arch/arm/mach-highbank/core.h b/arch/arm/mach-highbank/core.h index d8e2d0be64a..141ed517182 100644 --- a/arch/arm/mach-highbank/core.h +++ b/arch/arm/mach-highbank/core.h @@ -8,3 +8,4 @@ extern void highbank_lluart_map_io(void);  static inline void highbank_lluart_map_io(void) {}  #endif +extern void highbank_smc1(int fn, int arg); diff --git a/arch/arm/mach-highbank/highbank.c b/arch/arm/mach-highbank/highbank.c index 410a112bb52..8777612b1a4 100644 --- a/arch/arm/mach-highbank/highbank.c +++ b/arch/arm/mach-highbank/highbank.c @@ -85,10 +85,24 @@ const static struct of_device_id irq_match[] = {  	{}  }; +#ifdef CONFIG_CACHE_L2X0 +static void highbank_l2x0_disable(void) +{ +	/* Disable PL310 L2 Cache controller */ +	highbank_smc1(0x102, 0x0); +} +#endif +  static void __init highbank_init_irq(void)  {  	of_irq_init(irq_match); + +#ifdef CONFIG_CACHE_L2X0 +	/* Enable PL310 L2 Cache controller */ +	highbank_smc1(0x102, 0x1);  	l2x0_of_init(0, ~0UL); +	outer_cache.disable = highbank_l2x0_disable; +#endif  }  static void __init highbank_timer_init(void) diff --git a/arch/arm/mach-highbank/smc.S b/arch/arm/mach-highbank/smc.S new file mode 100644 index 00000000000..407d17baaaa --- /dev/null +++ b/arch/arm/mach-highbank/smc.S @@ -0,0 +1,27 @@ +/* + * Copied from omap44xx-smc.S Copyright (C) 2010 Texas Instruments, Inc. + * Copyright 2012 Calxeda, Inc. + * + * This program is free software,you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include <linux/linkage.h> + +/* + * This is common routine to manage secure monitor API + * used to modify the PL310 secure registers. + * 'r0' contains the value to be modified and 'r12' contains + * the monitor API number. + * Function signature : void highbank_smc1(u32 fn, u32 arg) + */ + +ENTRY(highbank_smc1) +	stmfd   sp!, {r4-r11, lr} +	mov	r12, r0 +	mov 	r0, r1 +	dsb +	smc	#0 +	ldmfd   sp!, {r4-r11, pc} +ENDPROC(highbank_smc1) diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig index 0021f726b15..eff4db5de0d 100644 --- a/arch/arm/mach-imx/Kconfig +++ b/arch/arm/mach-imx/Kconfig @@ -477,6 +477,7 @@ config MACH_MX31_3DS  	select IMX_HAVE_PLATFORM_IMX2_WDT  	select IMX_HAVE_PLATFORM_IMX_I2C  	select IMX_HAVE_PLATFORM_IMX_KEYPAD +	select IMX_HAVE_PLATFORM_IMX_SSI  	select IMX_HAVE_PLATFORM_IMX_UART  	select IMX_HAVE_PLATFORM_IPU_CORE  	select IMX_HAVE_PLATFORM_MXC_EHCI diff --git a/arch/arm/mach-imx/clk-imx1.c b/arch/arm/mach-imx/clk-imx1.c index 0f0beb580b7..516ddee1948 100644 --- a/arch/arm/mach-imx/clk-imx1.c +++ b/arch/arm/mach-imx/clk-imx1.c @@ -108,8 +108,7 @@ int __init mx1_clocks_init(unsigned long fref)  	clk_register_clkdev(clk[clk32], NULL, "mxc_rtc.0");  	clk_register_clkdev(clk[clko], "clko", NULL); -	mxc_timer_init(NULL, MX1_IO_ADDRESS(MX1_TIM1_BASE_ADDR), -			MX1_TIM1_INT); +	mxc_timer_init(MX1_IO_ADDRESS(MX1_TIM1_BASE_ADDR), MX1_TIM1_INT);  	return 0;  } diff --git a/arch/arm/mach-imx/clk-imx21.c b/arch/arm/mach-imx/clk-imx21.c index 4e4f384ee8d..ea13e61bd5f 100644 --- a/arch/arm/mach-imx/clk-imx21.c +++ b/arch/arm/mach-imx/clk-imx21.c @@ -180,7 +180,7 @@ int __init mx21_clocks_init(unsigned long lref, unsigned long href)  	clk_register_clkdev(clk[sdhc1_ipg_gate], "sdhc1", NULL);  	clk_register_clkdev(clk[sdhc2_ipg_gate], "sdhc2", NULL); -	mxc_timer_init(NULL, MX21_IO_ADDRESS(MX21_GPT1_BASE_ADDR), -			MX21_INT_GPT1); +	mxc_timer_init(MX21_IO_ADDRESS(MX21_GPT1_BASE_ADDR), MX21_INT_GPT1); +  	return 0;  } diff --git a/arch/arm/mach-imx/clk-imx25.c b/arch/arm/mach-imx/clk-imx25.c index d9833bb5fd6..fdd8cc87c9f 100644 --- a/arch/arm/mach-imx/clk-imx25.c +++ b/arch/arm/mach-imx/clk-imx25.c @@ -243,6 +243,6 @@ int __init mx25_clocks_init(void)  	clk_register_clkdev(clk[sdma_ahb], "ahb", "imx35-sdma");  	clk_register_clkdev(clk[iim_ipg], "iim", NULL); -	mxc_timer_init(NULL, MX25_IO_ADDRESS(MX25_GPT1_BASE_ADDR), 54); +	mxc_timer_init(MX25_IO_ADDRESS(MX25_GPT1_BASE_ADDR), 54);  	return 0;  } diff --git a/arch/arm/mach-imx/clk-imx27.c b/arch/arm/mach-imx/clk-imx27.c index 50a7ebd8d1b..295cbd7c08d 100644 --- a/arch/arm/mach-imx/clk-imx27.c +++ b/arch/arm/mach-imx/clk-imx27.c @@ -263,8 +263,7 @@ int __init mx27_clocks_init(unsigned long fref)  	clk_register_clkdev(clk[ssi1_baud_gate], "bitrate" , "imx-ssi.0");  	clk_register_clkdev(clk[ssi2_baud_gate], "bitrate" , "imx-ssi.1"); -	mxc_timer_init(NULL, MX27_IO_ADDRESS(MX27_GPT1_BASE_ADDR), -			MX27_INT_GPT1); +	mxc_timer_init(MX27_IO_ADDRESS(MX27_GPT1_BASE_ADDR), MX27_INT_GPT1);  	clk_prepare_enable(clk[emi_ahb_gate]); diff --git a/arch/arm/mach-imx/clk-imx31.c b/arch/arm/mach-imx/clk-imx31.c index a854b9cae5e..c9a06d800f8 100644 --- a/arch/arm/mach-imx/clk-imx31.c +++ b/arch/arm/mach-imx/clk-imx31.c @@ -175,8 +175,7 @@ int __init mx31_clocks_init(unsigned long fref)  	mx31_revision();  	clk_disable_unprepare(clk[iim_gate]); -	mxc_timer_init(NULL, MX31_IO_ADDRESS(MX31_GPT1_BASE_ADDR), -			MX31_INT_GPT); +	mxc_timer_init(MX31_IO_ADDRESS(MX31_GPT1_BASE_ADDR), MX31_INT_GPT);  	return 0;  } diff --git a/arch/arm/mach-imx/clk-imx35.c b/arch/arm/mach-imx/clk-imx35.c index a9e60bf7dd7..920a8cc4272 100644 --- a/arch/arm/mach-imx/clk-imx35.c +++ b/arch/arm/mach-imx/clk-imx35.c @@ -267,11 +267,9 @@ int __init mx35_clocks_init()  	imx_print_silicon_rev("i.MX35", mx35_revision());  #ifdef CONFIG_MXC_USE_EPIT -	epit_timer_init(&epit1_clk, -			MX35_IO_ADDRESS(MX35_EPIT1_BASE_ADDR), MX35_INT_EPIT1); +	epit_timer_init(MX35_IO_ADDRESS(MX35_EPIT1_BASE_ADDR), MX35_INT_EPIT1);  #else -	mxc_timer_init(NULL, MX35_IO_ADDRESS(MX35_GPT1_BASE_ADDR), -			MX35_INT_GPT); +	mxc_timer_init(MX35_IO_ADDRESS(MX35_GPT1_BASE_ADDR), MX35_INT_GPT);  #endif  	return 0; diff --git a/arch/arm/mach-imx/clk-imx51-imx53.c b/arch/arm/mach-imx/clk-imx51-imx53.c index fcd94f3b0f0..a2200c77bf7 100644 --- a/arch/arm/mach-imx/clk-imx51-imx53.c +++ b/arch/arm/mach-imx/clk-imx51-imx53.c @@ -104,12 +104,12 @@ static void __init mx5_clocks_common_init(unsigned long rate_ckil,  				periph_apm_sel, ARRAY_SIZE(periph_apm_sel));  	clk[main_bus] = imx_clk_mux("main_bus", MXC_CCM_CBCDR, 25, 1,  				main_bus_sel, ARRAY_SIZE(main_bus_sel)); -	clk[per_lp_apm] = imx_clk_mux("per_lp_apm", MXC_CCM_CBCDR, 1, 1, +	clk[per_lp_apm] = imx_clk_mux("per_lp_apm", MXC_CCM_CBCMR, 1, 1,  				per_lp_apm_sel, ARRAY_SIZE(per_lp_apm_sel));  	clk[per_pred1] = imx_clk_divider("per_pred1", "per_lp_apm", MXC_CCM_CBCDR, 6, 2);  	clk[per_pred2] = imx_clk_divider("per_pred2", "per_pred1", MXC_CCM_CBCDR, 3, 3);  	clk[per_podf] = imx_clk_divider("per_podf", "per_pred2", MXC_CCM_CBCDR, 0, 3); -	clk[per_root] = imx_clk_mux("per_root", MXC_CCM_CBCDR, 1, 0, +	clk[per_root] = imx_clk_mux("per_root", MXC_CCM_CBCMR, 0, 1,  				per_root_sel, ARRAY_SIZE(per_root_sel));  	clk[ahb] = imx_clk_divider("ahb", "main_bus", MXC_CCM_CBCDR, 10, 3);  	clk[ahb_max] = imx_clk_gate2("ahb_max", "ahb", MXC_CCM_CCGR0, 28); @@ -172,7 +172,7 @@ static void __init mx5_clocks_common_init(unsigned long rate_ckil,  	clk[pwm1_hf_gate] = imx_clk_gate2("pwm1_hf_gate", "ipg", MXC_CCM_CCGR2, 12);  	clk[pwm2_ipg_gate] = imx_clk_gate2("pwm2_ipg_gate", "ipg", MXC_CCM_CCGR2, 14);  	clk[pwm2_hf_gate] = imx_clk_gate2("pwm2_hf_gate", "ipg", MXC_CCM_CCGR2, 16); -	clk[gpt_gate] = imx_clk_gate2("gpt_gate", "ipg", MXC_CCM_CCGR2, 18); +	clk[gpt_gate] = imx_clk_gate2("gpt_gate", "per_root", MXC_CCM_CCGR2, 18);  	clk[fec_gate] = imx_clk_gate2("fec_gate", "ipg", MXC_CCM_CCGR2, 24);  	clk[usboh3_gate] = imx_clk_gate2("usboh3_gate", "ipg", MXC_CCM_CCGR2, 26);  	clk[usboh3_per_gate] = imx_clk_gate2("usboh3_per_gate", "usboh3_podf", MXC_CCM_CCGR2, 28); @@ -366,8 +366,7 @@ int __init mx51_clocks_init(unsigned long rate_ckil, unsigned long rate_osc,  	clk_set_rate(clk[esdhc_b_podf], 166250000);  	/* System timer */ -	mxc_timer_init(NULL, MX51_IO_ADDRESS(MX51_GPT1_BASE_ADDR), -		MX51_INT_GPT); +	mxc_timer_init(MX51_IO_ADDRESS(MX51_GPT1_BASE_ADDR), MX51_INT_GPT);  	clk_prepare_enable(clk[iim_gate]);  	imx_print_silicon_rev("i.MX51", mx51_revision()); @@ -452,8 +451,7 @@ int __init mx53_clocks_init(unsigned long rate_ckil, unsigned long rate_osc,  	clk_set_rate(clk[esdhc_b_podf], 200000000);  	/* System timer */ -	mxc_timer_init(NULL, MX53_IO_ADDRESS(MX53_GPT1_BASE_ADDR), -		MX53_INT_GPT); +	mxc_timer_init(MX53_IO_ADDRESS(MX53_GPT1_BASE_ADDR), MX53_INT_GPT);  	clk_prepare_enable(clk[iim_gate]);  	imx_print_silicon_rev("i.MX53", mx53_revision()); diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c index cab02d0a15d..17dc66a085a 100644 --- a/arch/arm/mach-imx/clk-imx6q.c +++ b/arch/arm/mach-imx/clk-imx6q.c @@ -122,10 +122,6 @@ static const char *cko1_sels[]	= { "pll3_usb_otg", "pll2_bus", "pll1_sys", "pll5  				    "dummy", "axi", "enfc", "ipu1_di0", "ipu1_di1", "ipu2_di0",  				    "ipu2_di1", "ahb", "ipg", "ipg_per", "ckil", "pll4_audio", }; -static const char * const clks_init_on[] __initconst = { -	"mmdc_ch0_axi", "mmdc_ch1_axi", "usboh3", -}; -  enum mx6q_clks {  	dummy, ckil, ckih, osc, pll2_pfd0_352m, pll2_pfd1_594m, pll2_pfd2_396m,  	pll3_pfd0_720m, pll3_pfd1_540m, pll3_pfd2_508m, pll3_pfd3_454m, @@ -161,11 +157,14 @@ enum mx6q_clks {  static struct clk *clk[clk_max]; +static enum mx6q_clks const clks_init_on[] __initconst = { +	mmdc_ch0_axi, mmdc_ch1_axi, +}; +  int __init mx6q_clocks_init(void)  {  	struct device_node *np;  	void __iomem *base; -	struct clk *c;  	int i, irq;  	clk[dummy] = imx_clk_fixed("dummy", 0); @@ -424,21 +423,14 @@ int __init mx6q_clocks_init(void)  	clk_register_clkdev(clk[ahb], "ahb", NULL);  	clk_register_clkdev(clk[cko1], "cko1", NULL); -	for (i = 0; i < ARRAY_SIZE(clks_init_on); i++) { -		c = clk_get_sys(clks_init_on[i], NULL); -		if (IS_ERR(c)) { -			pr_err("%s: failed to get clk %s", __func__, -			       clks_init_on[i]); -			return PTR_ERR(c); -		} -		clk_prepare_enable(c); -	} +	for (i = 0; i < ARRAY_SIZE(clks_init_on); i++) +		clk_prepare_enable(clk[clks_init_on[i]]);  	np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-gpt");  	base = of_iomap(np, 0);  	WARN_ON(!base);  	irq = irq_of_parse_and_map(np, 0); -	mxc_timer_init(NULL, base, irq); +	mxc_timer_init(base, irq);  	return 0;  } diff --git a/arch/arm/mach-imx/clk-pllv2.c b/arch/arm/mach-imx/clk-pllv2.c index 4685919deb6..0440379e362 100644 --- a/arch/arm/mach-imx/clk-pllv2.c +++ b/arch/arm/mach-imx/clk-pllv2.c @@ -74,30 +74,15 @@ struct clk_pllv2 {  	void __iomem	*base;  }; -static unsigned long clk_pllv2_recalc_rate(struct clk_hw *hw, -		unsigned long parent_rate) +static unsigned long __clk_pllv2_recalc_rate(unsigned long parent_rate, +		u32 dp_ctl, u32 dp_op, u32 dp_mfd, u32 dp_mfn)  {  	long mfi, mfn, mfd, pdf, ref_clk, mfn_abs; -	unsigned long dp_op, dp_mfd, dp_mfn, dp_ctl, pll_hfsm, dbl; -	void __iomem *pllbase; +	unsigned long dbl;  	s64 temp; -	struct clk_pllv2 *pll = to_clk_pllv2(hw); - -	pllbase = pll->base; -	dp_ctl = __raw_readl(pllbase + MXC_PLL_DP_CTL); -	pll_hfsm = dp_ctl & MXC_PLL_DP_CTL_HFSM;  	dbl = dp_ctl & MXC_PLL_DP_CTL_DPDCK0_2_EN; -	if (pll_hfsm == 0) { -		dp_op = __raw_readl(pllbase + MXC_PLL_DP_OP); -		dp_mfd = __raw_readl(pllbase + MXC_PLL_DP_MFD); -		dp_mfn = __raw_readl(pllbase + MXC_PLL_DP_MFN); -	} else { -		dp_op = __raw_readl(pllbase + MXC_PLL_DP_HFS_OP); -		dp_mfd = __raw_readl(pllbase + MXC_PLL_DP_HFS_MFD); -		dp_mfn = __raw_readl(pllbase + MXC_PLL_DP_HFS_MFN); -	}  	pdf = dp_op & MXC_PLL_DP_OP_PDF_MASK;  	mfi = (dp_op & MXC_PLL_DP_OP_MFI_MASK) >> MXC_PLL_DP_OP_MFI_OFFSET;  	mfi = (mfi <= 5) ? 5 : mfi; @@ -123,18 +108,30 @@ static unsigned long clk_pllv2_recalc_rate(struct clk_hw *hw,  	return temp;  } -static int clk_pllv2_set_rate(struct clk_hw *hw, unsigned long rate, +static unsigned long clk_pllv2_recalc_rate(struct clk_hw *hw,  		unsigned long parent_rate)  { +	u32 dp_op, dp_mfd, dp_mfn, dp_ctl; +	void __iomem *pllbase;  	struct clk_pllv2 *pll = to_clk_pllv2(hw); + +	pllbase = pll->base; + +	dp_ctl = __raw_readl(pllbase + MXC_PLL_DP_CTL); +	dp_op = __raw_readl(pllbase + MXC_PLL_DP_OP); +	dp_mfd = __raw_readl(pllbase + MXC_PLL_DP_MFD); +	dp_mfn = __raw_readl(pllbase + MXC_PLL_DP_MFN); + +	return __clk_pllv2_recalc_rate(parent_rate, dp_ctl, dp_op, dp_mfd, dp_mfn); +} + +static int __clk_pllv2_set_rate(unsigned long rate, unsigned long parent_rate, +		u32 *dp_op, u32 *dp_mfd, u32 *dp_mfn) +{  	u32 reg; -	void __iomem *pllbase;  	long mfi, pdf, mfn, mfd = 999999;  	s64 temp64;  	unsigned long quad_parent_rate; -	unsigned long pll_hfsm, dp_ctl; - -	pllbase = pll->base;  	quad_parent_rate = 4 * parent_rate;  	pdf = mfi = -1; @@ -144,25 +141,41 @@ static int clk_pllv2_set_rate(struct clk_hw *hw, unsigned long rate,  		return -EINVAL;  	pdf--; -	temp64 = rate * (pdf+1) - quad_parent_rate * mfi; -	do_div(temp64, quad_parent_rate/1000000); +	temp64 = rate * (pdf + 1) - quad_parent_rate * mfi; +	do_div(temp64, quad_parent_rate / 1000000);  	mfn = (long)temp64; +	reg = mfi << 4 | pdf; + +	*dp_op = reg; +	*dp_mfd = mfd; +	*dp_mfn = mfn; + +	return 0; +} + +static int clk_pllv2_set_rate(struct clk_hw *hw, unsigned long rate, +		unsigned long parent_rate) +{ +	struct clk_pllv2 *pll = to_clk_pllv2(hw); +	void __iomem *pllbase; +	u32 dp_ctl, dp_op, dp_mfd, dp_mfn; +	int ret; + +	pllbase = pll->base; + + +	ret = __clk_pllv2_set_rate(rate, parent_rate, &dp_op, &dp_mfd, &dp_mfn); +	if (ret) +		return ret; +  	dp_ctl = __raw_readl(pllbase + MXC_PLL_DP_CTL);  	/* use dpdck0_2 */  	__raw_writel(dp_ctl | 0x1000L, pllbase + MXC_PLL_DP_CTL); -	pll_hfsm = dp_ctl & MXC_PLL_DP_CTL_HFSM; -	if (pll_hfsm == 0) { -		reg = mfi << 4 | pdf; -		__raw_writel(reg, pllbase + MXC_PLL_DP_OP); -		__raw_writel(mfd, pllbase + MXC_PLL_DP_MFD); -		__raw_writel(mfn, pllbase + MXC_PLL_DP_MFN); -	} else { -		reg = mfi << 4 | pdf; -		__raw_writel(reg, pllbase + MXC_PLL_DP_HFS_OP); -		__raw_writel(mfd, pllbase + MXC_PLL_DP_HFS_MFD); -		__raw_writel(mfn, pllbase + MXC_PLL_DP_HFS_MFN); -	} + +	__raw_writel(dp_op, pllbase + MXC_PLL_DP_OP); +	__raw_writel(dp_mfd, pllbase + MXC_PLL_DP_MFD); +	__raw_writel(dp_mfn, pllbase + MXC_PLL_DP_MFN);  	return 0;  } @@ -170,7 +183,11 @@ static int clk_pllv2_set_rate(struct clk_hw *hw, unsigned long rate,  static long clk_pllv2_round_rate(struct clk_hw *hw, unsigned long rate,  		unsigned long *prate)  { -	return rate; +	u32 dp_op, dp_mfd, dp_mfn; + +	__clk_pllv2_set_rate(rate, *prate, &dp_op, &dp_mfd, &dp_mfn); +	return __clk_pllv2_recalc_rate(*prate, MXC_PLL_DP_CTL_DPDCK0_2_EN, +			dp_op, dp_mfd, dp_mfn);  }  static int clk_pllv2_prepare(struct clk_hw *hw) diff --git a/arch/arm/mach-imx/crm-regs-imx5.h b/arch/arm/mach-imx/crm-regs-imx5.h index 5e11ba7daee..5e3f1f0f4ca 100644 --- a/arch/arm/mach-imx/crm-regs-imx5.h +++ b/arch/arm/mach-imx/crm-regs-imx5.h @@ -23,7 +23,7 @@  #define MX53_DPLL1_BASE		MX53_IO_ADDRESS(MX53_PLL1_BASE_ADDR)  #define MX53_DPLL2_BASE		MX53_IO_ADDRESS(MX53_PLL2_BASE_ADDR)  #define MX53_DPLL3_BASE		MX53_IO_ADDRESS(MX53_PLL3_BASE_ADDR) -#define MX53_DPLL4_BASE		MX53_IO_ADDRESS(MX53_PLL3_BASE_ADDR) +#define MX53_DPLL4_BASE		MX53_IO_ADDRESS(MX53_PLL4_BASE_ADDR)  /* PLL Register Offsets */  #define MXC_PLL_DP_CTL			0x00 diff --git a/arch/arm/mach-imx/hotplug.c b/arch/arm/mach-imx/hotplug.c index 89493abd497..20ed2d56c1a 100644 --- a/arch/arm/mach-imx/hotplug.c +++ b/arch/arm/mach-imx/hotplug.c @@ -12,6 +12,7 @@  #include <linux/errno.h>  #include <asm/cacheflush.h> +#include <asm/cp15.h>  #include <mach/common.h>  int platform_cpu_kill(unsigned int cpu) @@ -19,6 +20,44 @@ int platform_cpu_kill(unsigned int cpu)  	return 1;  } +static inline void cpu_enter_lowpower(void) +{ +	unsigned int v; + +	flush_cache_all(); +	asm volatile( +		"mcr	p15, 0, %1, c7, c5, 0\n" +	"	mcr	p15, 0, %1, c7, c10, 4\n" +	/* +	 * Turn off coherency +	 */ +	"	mrc	p15, 0, %0, c1, c0, 1\n" +	"	bic	%0, %0, %3\n" +	"	mcr	p15, 0, %0, c1, c0, 1\n" +	"	mrc	p15, 0, %0, c1, c0, 0\n" +	"	bic	%0, %0, %2\n" +	"	mcr	p15, 0, %0, c1, c0, 0\n" +	  : "=&r" (v) +	  : "r" (0), "Ir" (CR_C), "Ir" (0x40) +	  : "cc"); +} + +static inline void cpu_leave_lowpower(void) +{ +	unsigned int v; + +	asm volatile( +		"mrc	p15, 0, %0, c1, c0, 0\n" +	"	orr	%0, %0, %1\n" +	"	mcr	p15, 0, %0, c1, c0, 0\n" +	"	mrc	p15, 0, %0, c1, c0, 1\n" +	"	orr	%0, %0, %2\n" +	"	mcr	p15, 0, %0, c1, c0, 1\n" +	  : "=&r" (v) +	  : "Ir" (CR_C), "Ir" (0x40) +	  : "cc"); +} +  /*   * platform-specific code to shutdown a CPU   * @@ -26,9 +65,10 @@ int platform_cpu_kill(unsigned int cpu)   */  void platform_cpu_die(unsigned int cpu)  { -	flush_cache_all(); +	cpu_enter_lowpower();  	imx_enable_cpu(cpu, false);  	cpu_do_idle(); +	cpu_leave_lowpower();  	/* We should never return from idle */  	panic("cpu %d unexpectedly exit from shutdown\n", cpu); diff --git a/arch/arm/mach-imx/mach-cpuimx35.c b/arch/arm/mach-imx/mach-cpuimx35.c index c515f8ede1a..6450303f1a7 100644 --- a/arch/arm/mach-imx/mach-cpuimx35.c +++ b/arch/arm/mach-imx/mach-cpuimx35.c @@ -70,7 +70,6 @@ static struct i2c_board_info eukrea_cpuimx35_i2c_devices[] = {  		I2C_BOARD_INFO("pcf8563", 0x51),  	}, {  		I2C_BOARD_INFO("tsc2007", 0x48), -		.type		= "tsc2007",  		.platform_data	= &tsc2007_info,  		.irq		= IMX_GPIO_TO_IRQ(TSC2007_IRQGPIO),  	}, diff --git a/arch/arm/mach-imx/mach-cpuimx51sd.c b/arch/arm/mach-imx/mach-cpuimx51sd.c index ac50f1671e3..1e09de50cbc 100644 --- a/arch/arm/mach-imx/mach-cpuimx51sd.c +++ b/arch/arm/mach-imx/mach-cpuimx51sd.c @@ -142,7 +142,6 @@ static struct i2c_board_info eukrea_cpuimx51sd_i2c_devices[] = {  		I2C_BOARD_INFO("pcf8563", 0x51),  	}, {  		I2C_BOARD_INFO("tsc2007", 0x49), -		.type		= "tsc2007",  		.platform_data	= &tsc2007_info,  	},  }; diff --git a/arch/arm/mach-imx/mach-imx27_visstrim_m10.c b/arch/arm/mach-imx/mach-imx27_visstrim_m10.c index dff82eb57cd..f76edb96a48 100644 --- a/arch/arm/mach-imx/mach-imx27_visstrim_m10.c +++ b/arch/arm/mach-imx/mach-imx27_visstrim_m10.c @@ -116,6 +116,8 @@ static const int visstrim_m10_pins[] __initconst = {  	PB23_PF_USB_PWR,  	PB24_PF_USB_OC,  	/* CSI */ +	TVP5150_RSTN | GPIO_GPIO | GPIO_OUT, +	TVP5150_PWDN | GPIO_GPIO | GPIO_OUT,  	PB10_PF_CSI_D0,  	PB11_PF_CSI_D1,  	PB12_PF_CSI_D2, @@ -147,6 +149,24 @@ static struct gpio visstrim_m10_version_gpios[] = {  	{ MOTHERBOARD_BIT2, GPIOF_IN, "mother-version-2" },  }; +static const struct gpio visstrim_m10_gpios[] __initconst = { +	{ +		.gpio = TVP5150_RSTN, +		.flags = GPIOF_DIR_OUT | GPIOF_INIT_HIGH, +		.label = "tvp5150_rstn", +	}, +	{ +		.gpio = TVP5150_PWDN, +		.flags = GPIOF_DIR_OUT | GPIOF_INIT_LOW, +		.label = "tvp5150_pwdn", +	}, +	{ +		.gpio = OTG_PHY_CS_GPIO, +		.flags = GPIOF_DIR_OUT | GPIOF_INIT_LOW, +		.label = "usbotg_cs", +	}, +}; +  /* Camera */  static int visstrim_camera_power(struct device *dev, int on)  { @@ -190,13 +210,6 @@ static void __init visstrim_camera_init(void)  	struct platform_device *pdev;  	int dma; -	/* Initialize tvp5150 gpios */ -	mxc_gpio_mode(TVP5150_RSTN | GPIO_GPIO | GPIO_OUT); -	mxc_gpio_mode(TVP5150_PWDN | GPIO_GPIO | GPIO_OUT); -	gpio_set_value(TVP5150_RSTN, 1); -	gpio_set_value(TVP5150_PWDN, 0); -	ndelay(1); -  	gpio_set_value(TVP5150_PWDN, 1);  	ndelay(1);  	gpio_set_value(TVP5150_RSTN, 0); @@ -377,10 +390,6 @@ static struct i2c_board_info visstrim_m10_i2c_devices[] = {  /* USB OTG */  static int otg_phy_init(struct platform_device *pdev)  { -	gpio_set_value(OTG_PHY_CS_GPIO, 0); - -	mdelay(10); -  	return mx27_initialize_usb_hw(pdev->id, MXC_EHCI_POWER_PINS_ENABLED);  } @@ -435,6 +444,11 @@ static void __init visstrim_m10_board_init(void)  	if (ret)  		pr_err("Failed to setup pins (%d)\n", ret); +	ret = gpio_request_array(visstrim_m10_gpios, +				ARRAY_SIZE(visstrim_m10_gpios)); +	if (ret) +		pr_err("Failed to request gpios (%d)\n", ret); +  	imx27_add_imx_ssi(0, &visstrim_m10_ssi_pdata);  	imx27_add_imx_uart0(&uart_pdata); diff --git a/arch/arm/mach-imx/mach-mx21ads.c b/arch/arm/mach-imx/mach-mx21ads.c index d14bbe949a4..3e7401fca76 100644 --- a/arch/arm/mach-imx/mach-mx21ads.c +++ b/arch/arm/mach-imx/mach-mx21ads.c @@ -32,7 +32,7 @@   * Memory-mapped I/O on MX21ADS base board   */  #define MX21ADS_MMIO_BASE_ADDR   0xf5000000 -#define MX21ADS_MMIO_SIZE        SZ_16M +#define MX21ADS_MMIO_SIZE        0xc00000  #define MX21ADS_REG_ADDR(offset)    (void __force __iomem *) \  		(MX21ADS_MMIO_BASE_ADDR + (offset)) diff --git a/arch/arm/mach-imx/mm-imx3.c b/arch/arm/mach-imx/mm-imx3.c index 967ed5b35a4..a8983b9778d 100644 --- a/arch/arm/mach-imx/mm-imx3.c +++ b/arch/arm/mach-imx/mm-imx3.c @@ -86,6 +86,7 @@ static void __iomem *imx3_ioremap_caller(unsigned long phys_addr, size_t size,  void __init imx3_init_l2x0(void)  { +#ifdef CONFIG_CACHE_L2X0  	void __iomem *l2x0_base;  	void __iomem *clkctl_base; @@ -115,6 +116,7 @@ void __init imx3_init_l2x0(void)  	}  	l2x0_init(l2x0_base, 0x00030024, 0x00000000); +#endif  }  #ifdef CONFIG_SOC_IMX31 @@ -179,6 +181,8 @@ void __init imx31_soc_init(void)  	mxc_register_gpio("imx31-gpio", 1, MX31_GPIO2_BASE_ADDR, SZ_16K, MX31_INT_GPIO2, 0);  	mxc_register_gpio("imx31-gpio", 2, MX31_GPIO3_BASE_ADDR, SZ_16K, MX31_INT_GPIO3, 0); +	pinctrl_provide_dummies(); +  	if (to_version == 1) {  		strncpy(imx31_sdma_pdata.fw_name, "sdma-imx31-to1.bin",  			strlen(imx31_sdma_pdata.fw_name)); diff --git a/arch/arm/mach-imx/mm-imx5.c b/arch/arm/mach-imx/mm-imx5.c index feeee17da96..1d003053d56 100644 --- a/arch/arm/mach-imx/mm-imx5.c +++ b/arch/arm/mach-imx/mm-imx5.c @@ -202,6 +202,8 @@ void __init imx51_soc_init(void)  	mxc_register_gpio("imx31-gpio", 2, MX51_GPIO3_BASE_ADDR, SZ_16K, MX51_INT_GPIO3_LOW, MX51_INT_GPIO3_HIGH);  	mxc_register_gpio("imx31-gpio", 3, MX51_GPIO4_BASE_ADDR, SZ_16K, MX51_INT_GPIO4_LOW, MX51_INT_GPIO4_HIGH); +	pinctrl_provide_dummies(); +  	/* i.mx51 has the i.mx35 type sdma */  	imx_add_imx_sdma("imx35-sdma", MX51_SDMA_BASE_ADDR, MX51_INT_SDMA, &imx51_sdma_pdata); diff --git a/arch/arm/mach-kirkwood/board-iconnect.c b/arch/arm/mach-kirkwood/board-iconnect.c index 2222c573951..b0d3cc49269 100644 --- a/arch/arm/mach-kirkwood/board-iconnect.c +++ b/arch/arm/mach-kirkwood/board-iconnect.c @@ -20,9 +20,6 @@  #include <linux/mv643xx_eth.h>  #include <linux/gpio.h>  #include <linux/leds.h> -#include <linux/spi/flash.h> -#include <linux/spi/spi.h> -#include <linux/spi/orion_spi.h>  #include <linux/i2c.h>  #include <linux/input.h>  #include <linux/gpio_keys.h> diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c index 25fb3fd418e..f261cd24264 100644 --- a/arch/arm/mach-kirkwood/common.c +++ b/arch/arm/mach-kirkwood/common.c @@ -159,6 +159,7 @@ static struct clk __init *clk_register_gate_fn(struct device *dev,  	gate_fn->gate.flags = clk_gate_flags;  	gate_fn->gate.lock = lock;  	gate_fn->gate.hw.init = &init; +	gate_fn->fn = fn;  	/* ops is the gate ops, but with our disable function */  	if (clk_gate_fn_ops.disable != clk_gate_fn_disable) { @@ -193,9 +194,11 @@ static struct clk __init *kirkwood_register_gate_fn(const char *name,  				    bit_idx, 0, &gating_lock, fn);  } +static struct clk *ge0, *ge1; +  void __init kirkwood_clk_init(void)  { -	struct clk *runit, *ge0, *ge1, *sata0, *sata1, *usb0, *sdio; +	struct clk *runit, *sata0, *sata1, *usb0, *sdio;  	struct clk *crypto, *xor0, *xor1, *pex0, *pex1, *audio;  	tclk = clk_register_fixed_rate(NULL, "tclk", NULL, @@ -257,6 +260,9 @@ void __init kirkwood_ge00_init(struct mv643xx_eth_platform_data *eth_data)  	orion_ge00_init(eth_data,  			GE00_PHYS_BASE, IRQ_KIRKWOOD_GE00_SUM,  			IRQ_KIRKWOOD_GE00_ERR); +	/* The interface forgets the MAC address assigned by u-boot if +	the clock is turned off, so claim the clk now. */ +	clk_prepare_enable(ge0);  } @@ -268,6 +274,7 @@ void __init kirkwood_ge01_init(struct mv643xx_eth_platform_data *eth_data)  	orion_ge01_init(eth_data,  			GE01_PHYS_BASE, IRQ_KIRKWOOD_GE01_SUM,  			IRQ_KIRKWOOD_GE01_ERR); +	clk_prepare_enable(ge1);  } diff --git a/arch/arm/mach-kirkwood/include/mach/bridge-regs.h b/arch/arm/mach-kirkwood/include/mach/bridge-regs.h index 3eee37a3b50..a115142f869 100644 --- a/arch/arm/mach-kirkwood/include/mach/bridge-regs.h +++ b/arch/arm/mach-kirkwood/include/mach/bridge-regs.h @@ -38,6 +38,7 @@  #define IRQ_MASK_HIGH_OFF	0x0014  #define TIMER_VIRT_BASE		(BRIDGE_VIRT_BASE | 0x0300) +#define TIMER_PHYS_BASE		(BRIDGE_PHYS_BASE | 0x0300)  #define L2_CONFIG_REG		(BRIDGE_VIRT_BASE | 0x0128)  #define L2_WRITETHROUGH		0x00000010 diff --git a/arch/arm/mach-kirkwood/include/mach/kirkwood.h b/arch/arm/mach-kirkwood/include/mach/kirkwood.h index fede3d503ef..c5b68510776 100644 --- a/arch/arm/mach-kirkwood/include/mach/kirkwood.h +++ b/arch/arm/mach-kirkwood/include/mach/kirkwood.h @@ -80,6 +80,7 @@  #define  UART1_VIRT_BASE	(DEV_BUS_VIRT_BASE | 0x2100)  #define BRIDGE_VIRT_BASE	(KIRKWOOD_REGS_VIRT_BASE | 0x20000) +#define BRIDGE_PHYS_BASE	(KIRKWOOD_REGS_PHYS_BASE | 0x20000)  #define CRYPTO_PHYS_BASE	(KIRKWOOD_REGS_PHYS_BASE | 0x30000) diff --git a/arch/arm/mach-mmp/irq.c b/arch/arm/mach-mmp/irq.c index fcfe0e3bd70..e60c7d98922 100644 --- a/arch/arm/mach-mmp/irq.c +++ b/arch/arm/mach-mmp/irq.c @@ -241,6 +241,7 @@ void __init mmp2_init_icu(void)  	icu_data[1].clr_mfp_irq_base = IRQ_MMP2_PMIC_BASE;  	icu_data[1].clr_mfp_hwirq = IRQ_MMP2_PMIC - IRQ_MMP2_PMIC_BASE;  	icu_data[1].nr_irqs = 2; +	icu_data[1].cascade_irq = 4;  	icu_data[1].virq_base = IRQ_MMP2_PMIC_BASE;  	icu_data[1].domain = irq_domain_add_legacy(NULL, icu_data[1].nr_irqs,  						   icu_data[1].virq_base, 0, @@ -249,6 +250,7 @@ void __init mmp2_init_icu(void)  	icu_data[2].reg_status = mmp_icu_base + 0x154;  	icu_data[2].reg_mask = mmp_icu_base + 0x16c;  	icu_data[2].nr_irqs = 2; +	icu_data[2].cascade_irq = 5;  	icu_data[2].virq_base = IRQ_MMP2_RTC_BASE;  	icu_data[2].domain = irq_domain_add_legacy(NULL, icu_data[2].nr_irqs,  						   icu_data[2].virq_base, 0, @@ -257,6 +259,7 @@ void __init mmp2_init_icu(void)  	icu_data[3].reg_status = mmp_icu_base + 0x180;  	icu_data[3].reg_mask = mmp_icu_base + 0x17c;  	icu_data[3].nr_irqs = 3; +	icu_data[3].cascade_irq = 9;  	icu_data[3].virq_base = IRQ_MMP2_KEYPAD_BASE;  	icu_data[3].domain = irq_domain_add_legacy(NULL, icu_data[3].nr_irqs,  						   icu_data[3].virq_base, 0, @@ -265,6 +268,7 @@ void __init mmp2_init_icu(void)  	icu_data[4].reg_status = mmp_icu_base + 0x158;  	icu_data[4].reg_mask = mmp_icu_base + 0x170;  	icu_data[4].nr_irqs = 5; +	icu_data[4].cascade_irq = 17;  	icu_data[4].virq_base = IRQ_MMP2_TWSI_BASE;  	icu_data[4].domain = irq_domain_add_legacy(NULL, icu_data[4].nr_irqs,  						   icu_data[4].virq_base, 0, @@ -273,6 +277,7 @@ void __init mmp2_init_icu(void)  	icu_data[5].reg_status = mmp_icu_base + 0x15c;  	icu_data[5].reg_mask = mmp_icu_base + 0x174;  	icu_data[5].nr_irqs = 15; +	icu_data[5].cascade_irq = 35;  	icu_data[5].virq_base = IRQ_MMP2_MISC_BASE;  	icu_data[5].domain = irq_domain_add_legacy(NULL, icu_data[5].nr_irqs,  						   icu_data[5].virq_base, 0, @@ -281,6 +286,7 @@ void __init mmp2_init_icu(void)  	icu_data[6].reg_status = mmp_icu_base + 0x160;  	icu_data[6].reg_mask = mmp_icu_base + 0x178;  	icu_data[6].nr_irqs = 2; +	icu_data[6].cascade_irq = 51;  	icu_data[6].virq_base = IRQ_MMP2_MIPI_HSI1_BASE;  	icu_data[6].domain = irq_domain_add_legacy(NULL, icu_data[6].nr_irqs,  						   icu_data[6].virq_base, 0, @@ -289,6 +295,7 @@ void __init mmp2_init_icu(void)  	icu_data[7].reg_status = mmp_icu_base + 0x188;  	icu_data[7].reg_mask = mmp_icu_base + 0x184;  	icu_data[7].nr_irqs = 2; +	icu_data[7].cascade_irq = 55;  	icu_data[7].virq_base = IRQ_MMP2_MIPI_HSI0_BASE;  	icu_data[7].domain = irq_domain_add_legacy(NULL, icu_data[7].nr_irqs,  						   icu_data[7].virq_base, 0, diff --git a/arch/arm/mach-omap2/am35xx-emac.c b/arch/arm/mach-omap2/am35xx-emac.c index 447682c4e11..2c90ac68668 100644 --- a/arch/arm/mach-omap2/am35xx-emac.c +++ b/arch/arm/mach-omap2/am35xx-emac.c @@ -15,27 +15,13 @@   * General Public License for more details.   */ -#include <linux/clk.h> +#include <linux/err.h>  #include <linux/davinci_emac.h> -#include <linux/platform_device.h> -#include <plat/irqs.h> +#include <asm/system.h> +#include <plat/omap_device.h>  #include <mach/am35xx.h> -  #include "control.h" - -static struct mdio_platform_data am35xx_emac_mdio_pdata; - -static struct resource am35xx_emac_mdio_resources[] = { -	DEFINE_RES_MEM(AM35XX_IPSS_EMAC_BASE + AM35XX_EMAC_MDIO_OFFSET, SZ_4K), -}; - -static struct platform_device am35xx_emac_mdio_device = { -	.name		= "davinci_mdio", -	.id		= 0, -	.num_resources	= ARRAY_SIZE(am35xx_emac_mdio_resources), -	.resource	= am35xx_emac_mdio_resources, -	.dev.platform_data = &am35xx_emac_mdio_pdata, -}; +#include "am35xx-emac.h"  static void am35xx_enable_emac_int(void)  { @@ -69,41 +55,57 @@ static struct emac_platform_data am35xx_emac_pdata = {  	.interrupt_disable	= am35xx_disable_emac_int,  }; -static struct resource am35xx_emac_resources[] = { -	DEFINE_RES_MEM(AM35XX_IPSS_EMAC_BASE, 0x30000), -	DEFINE_RES_IRQ(INT_35XX_EMAC_C0_RXTHRESH_IRQ), -	DEFINE_RES_IRQ(INT_35XX_EMAC_C0_RX_PULSE_IRQ), -	DEFINE_RES_IRQ(INT_35XX_EMAC_C0_TX_PULSE_IRQ), -	DEFINE_RES_IRQ(INT_35XX_EMAC_C0_MISC_PULSE_IRQ), -}; +static struct mdio_platform_data am35xx_mdio_pdata; -static struct platform_device am35xx_emac_device = { -	.name		= "davinci_emac", -	.id		= -1, -	.num_resources	= ARRAY_SIZE(am35xx_emac_resources), -	.resource	= am35xx_emac_resources, -	.dev		= { -		.platform_data	= &am35xx_emac_pdata, -	}, -}; +static int __init omap_davinci_emac_dev_init(struct omap_hwmod *oh, +		void *pdata, int pdata_len) +{ +	struct platform_device *pdev; + +	pdev = omap_device_build(oh->class->name, 0, oh, pdata, pdata_len, +				 NULL, 0, false); +	if (IS_ERR(pdev)) { +		WARN(1, "Can't build omap_device for %s:%s.\n", +		     oh->class->name, oh->name); +		return PTR_ERR(pdev); +	} + +	return 0; +}  void __init am35xx_emac_init(unsigned long mdio_bus_freq, u8 rmii_en)  { +	struct omap_hwmod *oh;  	u32 v; -	int err; +	int ret; -	am35xx_emac_pdata.rmii_en = rmii_en; -	am35xx_emac_mdio_pdata.bus_freq = mdio_bus_freq; -	err = platform_device_register(&am35xx_emac_device); -	if (err) { -		pr_err("AM35x: failed registering EMAC device: %d\n", err); +	oh = omap_hwmod_lookup("davinci_mdio"); +	if (!oh) { +		pr_err("Could not find davinci_mdio hwmod\n"); +		return; +	} + +	am35xx_mdio_pdata.bus_freq = mdio_bus_freq; + +	ret = omap_davinci_emac_dev_init(oh, &am35xx_mdio_pdata, +					 sizeof(am35xx_mdio_pdata)); +	if (ret) { +		pr_err("Could not build davinci_mdio hwmod device\n");  		return;  	} -	err = platform_device_register(&am35xx_emac_mdio_device); -	if (err) { -		pr_err("AM35x: failed registering EMAC MDIO device: %d\n", err); -		platform_device_unregister(&am35xx_emac_device); +	oh = omap_hwmod_lookup("davinci_emac"); +	if (!oh) { +		pr_err("Could not find davinci_emac hwmod\n"); +		return; +	} + +	am35xx_emac_pdata.rmii_en = rmii_en; + +	ret = omap_davinci_emac_dev_init(oh, &am35xx_emac_pdata, +					 sizeof(am35xx_emac_pdata)); +	if (ret) { +		pr_err("Could not build davinci_emac hwmod device\n");  		return;  	} diff --git a/arch/arm/mach-omap2/board-n8x0.c b/arch/arm/mach-omap2/board-n8x0.c index 8ca14e88a31..2c5d0ed7528 100644 --- a/arch/arm/mach-omap2/board-n8x0.c +++ b/arch/arm/mach-omap2/board-n8x0.c @@ -83,11 +83,9 @@ static struct musb_hdrc_config musb_config = {  };  static struct musb_hdrc_platform_data tusb_data = { -#if defined(CONFIG_USB_MUSB_OTG) +#ifdef CONFIG_USB_GADGET_MUSB_HDRC  	.mode		= MUSB_OTG, -#elif defined(CONFIG_USB_MUSB_PERIPHERAL) -	.mode		= MUSB_PERIPHERAL, -#else /* defined(CONFIG_USB_MUSB_HOST) */ +#else  	.mode		= MUSB_HOST,  #endif  	.set_power	= tusb_set_power, diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c index 75eb88a738c..6202fc76e49 100644 --- a/arch/arm/mach-omap2/board-omap3beagle.c +++ b/arch/arm/mach-omap2/board-omap3beagle.c @@ -81,13 +81,13 @@ static u8 omap3_beagle_version;  static struct {  	int mmc1_gpio_wp;  	int usb_pwr_level; -	int reset_gpio; +	int dvi_pd_gpio;  	int usr_button_gpio;  	int mmc_caps;  } beagle_config = {  	.mmc1_gpio_wp = -EINVAL,  	.usb_pwr_level = GPIOF_OUT_INIT_LOW, -	.reset_gpio = 129, +	.dvi_pd_gpio = -EINVAL,  	.usr_button_gpio = 4,  	.mmc_caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,  }; @@ -126,21 +126,21 @@ static void __init omap3_beagle_init_rev(void)  		printk(KERN_INFO "OMAP3 Beagle Rev: Ax/Bx\n");  		omap3_beagle_version = OMAP3BEAGLE_BOARD_AXBX;  		beagle_config.mmc1_gpio_wp = 29; -		beagle_config.reset_gpio = 170; +		beagle_config.dvi_pd_gpio = 170;  		beagle_config.usr_button_gpio = 7;  		break;  	case 6:  		printk(KERN_INFO "OMAP3 Beagle Rev: C1/C2/C3\n");  		omap3_beagle_version = OMAP3BEAGLE_BOARD_C1_3;  		beagle_config.mmc1_gpio_wp = 23; -		beagle_config.reset_gpio = 170; +		beagle_config.dvi_pd_gpio = 170;  		beagle_config.usr_button_gpio = 7;  		break;  	case 5:  		printk(KERN_INFO "OMAP3 Beagle Rev: C4\n");  		omap3_beagle_version = OMAP3BEAGLE_BOARD_C4;  		beagle_config.mmc1_gpio_wp = 23; -		beagle_config.reset_gpio = 170; +		beagle_config.dvi_pd_gpio = 170;  		beagle_config.usr_button_gpio = 7;  		break;  	case 0: @@ -274,11 +274,9 @@ static int beagle_twl_gpio_setup(struct device *dev,  		if (r)  			pr_err("%s: unable to configure nDVI_PWR_EN\n",  				__func__); -		r = gpio_request_one(gpio + 2, GPIOF_OUT_INIT_HIGH, -				     "DVI_LDO_EN"); -		if (r) -			pr_err("%s: unable to configure DVI_LDO_EN\n", -				__func__); + +		beagle_config.dvi_pd_gpio = gpio + 2; +  	} else {  		/*  		 * REVISIT: need ehci-omap hooks for external VBUS @@ -287,7 +285,7 @@ static int beagle_twl_gpio_setup(struct device *dev,  		if (gpio_request_one(gpio + 1, GPIOF_IN, "EHCI_nOC"))  			pr_err("%s: unable to configure EHCI_nOC\n", __func__);  	} -	dvi_panel.power_down_gpio = beagle_config.reset_gpio; +	dvi_panel.power_down_gpio = beagle_config.dvi_pd_gpio;  	gpio_request_one(gpio + TWL4030_GPIO_MAX, beagle_config.usb_pwr_level,  			"nEN_USB_PWR"); @@ -499,7 +497,7 @@ static void __init omap3_beagle_init(void)  	omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);  	omap3_beagle_init_rev(); -	if (beagle_config.mmc1_gpio_wp != -EINVAL) +	if (gpio_is_valid(beagle_config.mmc1_gpio_wp))  		omap_mux_init_gpio(beagle_config.mmc1_gpio_wp, OMAP_PIN_INPUT);  	mmc[0].caps = beagle_config.mmc_caps;  	omap_hsmmc_init(mmc); @@ -510,15 +508,13 @@ static void __init omap3_beagle_init(void)  	platform_add_devices(omap3_beagle_devices,  			ARRAY_SIZE(omap3_beagle_devices)); +	if (gpio_is_valid(beagle_config.dvi_pd_gpio)) +		omap_mux_init_gpio(beagle_config.dvi_pd_gpio, OMAP_PIN_OUTPUT);  	omap_display_init(&beagle_dss_data);  	omap_serial_init();  	omap_sdrc_init(mt46h32m32lf6_sdrc_params,  				  mt46h32m32lf6_sdrc_params); -	omap_mux_init_gpio(170, OMAP_PIN_INPUT); -	/* REVISIT leave DVI powered down until it's needed ... */ -	gpio_request_one(170, GPIOF_OUT_INIT_HIGH, "DVI_nPD"); -  	usb_musb_init(NULL);  	usbhs_init(&usbhs_bdata);  	omap_nand_flash_init(NAND_BUSWIDTH_16, omap3beagle_nand_partitions, diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c index ff53decceca..df2534de336 100644 --- a/arch/arm/mach-omap2/board-rx51-peripherals.c +++ b/arch/arm/mach-omap2/board-rx51-peripherals.c @@ -144,7 +144,6 @@ static struct lis3lv02d_platform_data rx51_lis3lv02d_data = {  	.release_resources = lis302_release,  	.st_min_limits = {-32, 3, 3},  	.st_max_limits = {-3, 32, 32}, -	.irq2 = OMAP_GPIO_IRQ(LIS302_IRQ2_GPIO),  };  #endif @@ -1030,7 +1029,6 @@ static struct i2c_board_info __initdata rx51_peripherals_i2c_board_info_3[] = {  	{  		I2C_BOARD_INFO("lis3lv02d", 0x1d),  		.platform_data = &rx51_lis3lv02d_data, -		.irq = OMAP_GPIO_IRQ(LIS302_IRQ1_GPIO),  	},  #endif  }; @@ -1056,6 +1054,10 @@ static int __init rx51_i2c_init(void)  	omap_pmic_init(1, 2200, "twl5030", INT_34XX_SYS_NIRQ, &rx51_twldata);  	omap_register_i2c_bus(2, 100, rx51_peripherals_i2c_board_info_2,  			      ARRAY_SIZE(rx51_peripherals_i2c_board_info_2)); +#if defined(CONFIG_SENSORS_LIS3_I2C) || defined(CONFIG_SENSORS_LIS3_I2C_MODULE) +	rx51_lis3lv02d_data.irq2 = gpio_to_irq(LIS302_IRQ2_GPIO); +	rx51_peripherals_i2c_board_info_3[0].irq = gpio_to_irq(LIS302_IRQ1_GPIO); +#endif  	omap_register_i2c_bus(3, 400, rx51_peripherals_i2c_board_info_3,  			      ARRAY_SIZE(rx51_peripherals_i2c_board_info_3));  	return 0; diff --git a/arch/arm/mach-omap2/clock3xxx_data.c b/arch/arm/mach-omap2/clock3xxx_data.c index 4e1a3b0e8cc..a67aaa97dcd 100644 --- a/arch/arm/mach-omap2/clock3xxx_data.c +++ b/arch/arm/mach-omap2/clock3xxx_data.c @@ -2490,13 +2490,13 @@ static struct clk uart4_fck = {  };  static struct clk uart4_fck_am35xx = { -	.name           = "uart4_fck", -	.ops            = &clkops_omap2_dflt_wait, -	.parent         = &per_48m_fck, -	.enable_reg     = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), -	.enable_bit     = OMAP3430_EN_UART4_SHIFT, -	.clkdm_name     = "core_l4_clkdm", -	.recalc         = &followparent_recalc, +	.name		= "uart4_fck", +	.ops		= &clkops_omap2_dflt_wait, +	.parent		= &core_48m_fck, +	.enable_reg	= OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), +	.enable_bit	= AM35XX_EN_UART4_SHIFT, +	.clkdm_name	= "core_l4_clkdm", +	.recalc		= &followparent_recalc,  };  static struct clk gpt2_fck = { @@ -3201,8 +3201,12 @@ static struct clk vpfe_fck = {  };  /* - * The UART1/2 functional clock acts as the functional - * clock for UART4. No separate fclk control available. + * The UART1/2 functional clock acts as the functional clock for + * UART4. No separate fclk control available.  XXX Well now we have a + * uart4_fck that is apparently used as the UART4 functional clock, + * but it also seems that uart1_fck or uart2_fck are still needed, at + * least for UART4 softresets to complete.  This really needs + * clarification.   */  static struct clk uart4_ick_am35xx = {  	.name		= "uart4_ick", @@ -3474,12 +3478,12 @@ static struct omap_clk omap3xxx_clks[] = {  	CLK(NULL,	"ipss_ick",	&ipss_ick,	CK_AM35XX),  	CLK(NULL,	"rmii_ck",	&rmii_ck,	CK_AM35XX),  	CLK(NULL,	"pclk_ck",	&pclk_ck,	CK_AM35XX), -	CLK("davinci_emac",	NULL,	&emac_ick,	CK_AM35XX), +	CLK("davinci_emac.0",	NULL,	&emac_ick,	CK_AM35XX),  	CLK("davinci_mdio.0",	NULL,	&emac_fck,	CK_AM35XX),  	CLK("vpfe-capture",	"master",	&vpfe_ick,	CK_AM35XX),  	CLK("vpfe-capture",	"slave",	&vpfe_fck,	CK_AM35XX), -	CLK("musb-am35x",	"ick",		&hsotgusb_ick_am35xx,	CK_AM35XX), -	CLK("musb-am35x",	"fck",		&hsotgusb_fck_am35xx,	CK_AM35XX), +	CLK(NULL,	"hsotgusb_ick",		&hsotgusb_ick_am35xx,	CK_AM35XX), +	CLK(NULL,	"hsotgusb_fck",		&hsotgusb_fck_am35xx,	CK_AM35XX),  	CLK(NULL,	"hecc_ck",	&hecc_ck,	CK_AM35XX),  	CLK(NULL,	"uart4_ick",	&uart4_ick_am35xx,	CK_AM35XX),  	CLK("omap_timer.1",	"32k_ck",	&omap_32k_fck,  CK_3XXX), @@ -3514,7 +3518,7 @@ int __init omap3xxx_clk_init(void)  	struct omap_clk *c;  	u32 cpu_clkflg = 0; -	if (cpu_is_omap3517()) { +	if (soc_is_am35xx()) {  		cpu_mask = RATE_IN_34XX;  		cpu_clkflg = CK_AM35XX;  	} else if (cpu_is_omap3630()) { diff --git a/arch/arm/mach-omap2/clock44xx_data.c b/arch/arm/mach-omap2/clock44xx_data.c index 2172f660384..e2b701e164f 100644 --- a/arch/arm/mach-omap2/clock44xx_data.c +++ b/arch/arm/mach-omap2/clock44xx_data.c @@ -84,6 +84,7 @@ static struct clk slimbus_clk = {  static struct clk sys_32k_ck = {  	.name		= "sys_32k_ck", +	.clkdm_name	= "prm_clkdm",  	.rate		= 32768,  	.ops		= &clkops_null,  }; @@ -512,6 +513,7 @@ static struct clk ddrphy_ck = {  	.name		= "ddrphy_ck",  	.parent		= &dpll_core_m2_ck,  	.ops		= &clkops_null, +	.clkdm_name	= "l3_emif_clkdm",  	.fixed_div	= 2,  	.recalc		= &omap_fixed_divisor_recalc,  }; @@ -769,6 +771,7 @@ static const struct clksel dpll_mpu_m2_div[] = {  static struct clk dpll_mpu_m2_ck = {  	.name		= "dpll_mpu_m2_ck",  	.parent		= &dpll_mpu_ck, +	.clkdm_name	= "cm_clkdm",  	.clksel		= dpll_mpu_m2_div,  	.clksel_reg	= OMAP4430_CM_DIV_M2_DPLL_MPU,  	.clksel_mask	= OMAP4430_DPLL_CLKOUT_DIV_MASK, @@ -1149,6 +1152,7 @@ static const struct clksel l3_div_div[] = {  static struct clk l3_div_ck = {  	.name		= "l3_div_ck",  	.parent		= &div_core_ck, +	.clkdm_name	= "cm_clkdm",  	.clksel		= l3_div_div,  	.clksel_reg	= OMAP4430_CM_CLKSEL_CORE,  	.clksel_mask	= OMAP4430_CLKSEL_L3_MASK, @@ -2824,6 +2828,7 @@ static const struct clksel trace_clk_div_div[] = {  static struct clk trace_clk_div_ck = {  	.name		= "trace_clk_div_ck",  	.parent		= &pmd_trace_clk_mux_ck, +	.clkdm_name	= "emu_sys_clkdm",  	.clksel		= trace_clk_div_div,  	.clksel_reg	= OMAP4430_CM_EMU_DEBUGSS_CLKCTRL,  	.clksel_mask	= OMAP4430_CLKSEL_PMD_TRACE_CLK_MASK, diff --git a/arch/arm/mach-omap2/clockdomains3xxx_data.c b/arch/arm/mach-omap2/clockdomains3xxx_data.c index 6038adb9771..8e35080026d 100644 --- a/arch/arm/mach-omap2/clockdomains3xxx_data.c +++ b/arch/arm/mach-omap2/clockdomains3xxx_data.c @@ -59,6 +59,12 @@ static struct clkdm_dep gfx_sgx_3xxx_wkdeps[] = {  	{ NULL },  }; +static struct clkdm_dep gfx_sgx_am35x_wkdeps[] = { +	{ .clkdm_name = "mpu_clkdm" }, +	{ .clkdm_name = "wkup_clkdm" }, +	{ NULL }, +}; +  /* 3430: PM_WKDEP_PER: CORE, IVA2, MPU, WKUP */  static struct clkdm_dep per_wkdeps[] = {  	{ .clkdm_name = "core_l3_clkdm" }, @@ -69,6 +75,14 @@ static struct clkdm_dep per_wkdeps[] = {  	{ NULL },  }; +static struct clkdm_dep per_am35x_wkdeps[] = { +	{ .clkdm_name = "core_l3_clkdm" }, +	{ .clkdm_name = "core_l4_clkdm" }, +	{ .clkdm_name = "mpu_clkdm" }, +	{ .clkdm_name = "wkup_clkdm" }, +	{ NULL }, +}; +  /* 3430ES2: PM_WKDEP_USBHOST: CORE, IVA2, MPU, WKUP */  static struct clkdm_dep usbhost_wkdeps[] = {  	{ .clkdm_name = "core_l3_clkdm" }, @@ -79,6 +93,14 @@ static struct clkdm_dep usbhost_wkdeps[] = {  	{ NULL },  }; +static struct clkdm_dep usbhost_am35x_wkdeps[] = { +	{ .clkdm_name = "core_l3_clkdm" }, +	{ .clkdm_name = "core_l4_clkdm" }, +	{ .clkdm_name = "mpu_clkdm" }, +	{ .clkdm_name = "wkup_clkdm" }, +	{ NULL }, +}; +  /* 3430 PM_WKDEP_MPU: CORE, IVA2, DSS, PER */  static struct clkdm_dep mpu_3xxx_wkdeps[] = {  	{ .clkdm_name = "core_l3_clkdm" }, @@ -89,6 +111,14 @@ static struct clkdm_dep mpu_3xxx_wkdeps[] = {  	{ NULL },  }; +static struct clkdm_dep mpu_am35x_wkdeps[] = { +	{ .clkdm_name = "core_l3_clkdm" }, +	{ .clkdm_name = "core_l4_clkdm" }, +	{ .clkdm_name = "dss_clkdm" }, +	{ .clkdm_name = "per_clkdm" }, +	{ NULL }, +}; +  /* 3430 PM_WKDEP_IVA2: CORE, MPU, WKUP, DSS, PER */  static struct clkdm_dep iva2_wkdeps[] = {  	{ .clkdm_name = "core_l3_clkdm" }, @@ -116,6 +146,12 @@ static struct clkdm_dep dss_wkdeps[] = {  	{ NULL },  }; +static struct clkdm_dep dss_am35x_wkdeps[] = { +	{ .clkdm_name = "mpu_clkdm" }, +	{ .clkdm_name = "wkup_clkdm" }, +	{ NULL }, +}; +  /* 3430: PM_WKDEP_NEON: MPU */  static struct clkdm_dep neon_wkdeps[] = {  	{ .clkdm_name = "mpu_clkdm" }, @@ -131,6 +167,11 @@ static struct clkdm_dep dss_sleepdeps[] = {  	{ NULL },  }; +static struct clkdm_dep dss_am35x_sleepdeps[] = { +	{ .clkdm_name = "mpu_clkdm" }, +	{ NULL }, +}; +  /* 3430: CM_SLEEPDEP_PER: MPU, IVA */  static struct clkdm_dep per_sleepdeps[] = {  	{ .clkdm_name = "mpu_clkdm" }, @@ -138,6 +179,11 @@ static struct clkdm_dep per_sleepdeps[] = {  	{ NULL },  }; +static struct clkdm_dep per_am35x_sleepdeps[] = { +	{ .clkdm_name = "mpu_clkdm" }, +	{ NULL }, +}; +  /* 3430ES2: CM_SLEEPDEP_USBHOST: MPU, IVA */  static struct clkdm_dep usbhost_sleepdeps[] = {  	{ .clkdm_name = "mpu_clkdm" }, @@ -145,6 +191,11 @@ static struct clkdm_dep usbhost_sleepdeps[] = {  	{ NULL },  }; +static struct clkdm_dep usbhost_am35x_sleepdeps[] = { +	{ .clkdm_name = "mpu_clkdm" }, +	{ NULL }, +}; +  /* 3430: CM_SLEEPDEP_CAM: MPU */  static struct clkdm_dep cam_sleepdeps[] = {  	{ .clkdm_name = "mpu_clkdm" }, @@ -175,6 +226,15 @@ static struct clockdomain mpu_3xxx_clkdm = {  	.clktrctrl_mask = OMAP3430_CLKTRCTRL_MPU_MASK,  }; +static struct clockdomain mpu_am35x_clkdm = { +	.name		= "mpu_clkdm", +	.pwrdm		= { .name = "mpu_pwrdm" }, +	.flags		= CLKDM_CAN_HWSUP | CLKDM_CAN_FORCE_WAKEUP, +	.dep_bit	= OMAP3430_EN_MPU_SHIFT, +	.wkdep_srcs	= mpu_am35x_wkdeps, +	.clktrctrl_mask = OMAP3430_CLKTRCTRL_MPU_MASK, +}; +  static struct clockdomain neon_clkdm = {  	.name		= "neon_clkdm",  	.pwrdm		= { .name = "neon_pwrdm" }, @@ -210,6 +270,15 @@ static struct clockdomain sgx_clkdm = {  	.clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_SGX_MASK,  }; +static struct clockdomain sgx_am35x_clkdm = { +	.name		= "sgx_clkdm", +	.pwrdm		= { .name = "sgx_pwrdm" }, +	.flags		= CLKDM_CAN_HWSUP_SWSUP, +	.wkdep_srcs	= gfx_sgx_am35x_wkdeps, +	.sleepdep_srcs	= gfx_sgx_sleepdeps, +	.clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_SGX_MASK, +}; +  /*   * The die-to-die clockdomain was documented in the 34xx ES1 TRM, but   * then that information was removed from the 34xx ES2+ TRM.  It is @@ -261,6 +330,16 @@ static struct clockdomain dss_3xxx_clkdm = {  	.clktrctrl_mask = OMAP3430_CLKTRCTRL_DSS_MASK,  }; +static struct clockdomain dss_am35x_clkdm = { +	.name		= "dss_clkdm", +	.pwrdm		= { .name = "dss_pwrdm" }, +	.flags		= CLKDM_CAN_HWSUP_SWSUP, +	.dep_bit	= OMAP3430_PM_WKDEP_MPU_EN_DSS_SHIFT, +	.wkdep_srcs	= dss_am35x_wkdeps, +	.sleepdep_srcs	= dss_am35x_sleepdeps, +	.clktrctrl_mask = OMAP3430_CLKTRCTRL_DSS_MASK, +}; +  static struct clockdomain cam_clkdm = {  	.name		= "cam_clkdm",  	.pwrdm		= { .name = "cam_pwrdm" }, @@ -279,6 +358,15 @@ static struct clockdomain usbhost_clkdm = {  	.clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_USBHOST_MASK,  }; +static struct clockdomain usbhost_am35x_clkdm = { +	.name		= "usbhost_clkdm", +	.pwrdm		= { .name = "core_pwrdm" }, +	.flags		= CLKDM_CAN_HWSUP_SWSUP, +	.wkdep_srcs	= usbhost_am35x_wkdeps, +	.sleepdep_srcs	= usbhost_am35x_sleepdeps, +	.clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_USBHOST_MASK, +}; +  static struct clockdomain per_clkdm = {  	.name		= "per_clkdm",  	.pwrdm		= { .name = "per_pwrdm" }, @@ -289,6 +377,16 @@ static struct clockdomain per_clkdm = {  	.clktrctrl_mask = OMAP3430_CLKTRCTRL_PER_MASK,  }; +static struct clockdomain per_am35x_clkdm = { +	.name		= "per_clkdm", +	.pwrdm		= { .name = "per_pwrdm" }, +	.flags		= CLKDM_CAN_HWSUP_SWSUP, +	.dep_bit	= OMAP3430_EN_PER_SHIFT, +	.wkdep_srcs	= per_am35x_wkdeps, +	.sleepdep_srcs	= per_am35x_sleepdeps, +	.clktrctrl_mask = OMAP3430_CLKTRCTRL_PER_MASK, +}; +  /*   * Disable hw supervised mode for emu_clkdm, because emu_pwrdm is   * switched of even if sdti is in use @@ -341,31 +439,44 @@ static struct clkdm_autodep clkdm_autodeps[] = {  	}  }; +static struct clkdm_autodep clkdm_am35x_autodeps[] = { +	{ +		.clkdm = { .name = "mpu_clkdm" }, +	}, +	{ +		.clkdm = { .name = NULL }, +	} +}; +  /*   *   */ -static struct clockdomain *clockdomains_omap3430_common[] __initdata = { +static struct clockdomain *clockdomains_common[] __initdata = {  	&wkup_common_clkdm,  	&cm_common_clkdm,  	&prm_common_clkdm, -	&mpu_3xxx_clkdm,  	&neon_clkdm, -	&iva2_clkdm, -	&d2d_clkdm,  	&core_l3_3xxx_clkdm,  	&core_l4_3xxx_clkdm, -	&dss_3xxx_clkdm, -	&cam_clkdm, -	&per_clkdm,  	&emu_clkdm,  	&dpll1_clkdm, -	&dpll2_clkdm,  	&dpll3_clkdm,  	&dpll4_clkdm,  	NULL  }; +static struct clockdomain *clockdomains_omap3430[] __initdata = { +	&mpu_3xxx_clkdm, +	&iva2_clkdm, +	&d2d_clkdm, +	&dss_3xxx_clkdm, +	&cam_clkdm, +	&per_clkdm, +	&dpll2_clkdm, +	NULL +}; +  static struct clockdomain *clockdomains_omap3430es1[] __initdata = {  	&gfx_3430es1_clkdm,  	NULL, @@ -378,21 +489,41 @@ static struct clockdomain *clockdomains_omap3430es2plus[] __initdata = {  	NULL,  }; +static struct clockdomain *clockdomains_am35x[] __initdata = { +	&mpu_am35x_clkdm, +	&sgx_am35x_clkdm, +	&dss_am35x_clkdm, +	&per_am35x_clkdm, +	&usbhost_am35x_clkdm, +	&dpll5_clkdm, +	NULL +}; +  void __init omap3xxx_clockdomains_init(void)  {  	struct clockdomain **sc; +	unsigned int rev;  	if (!cpu_is_omap34xx())  		return;  	clkdm_register_platform_funcs(&omap3_clkdm_operations); -	clkdm_register_clkdms(clockdomains_omap3430_common); +	clkdm_register_clkdms(clockdomains_common); -	sc = (omap_rev() == OMAP3430_REV_ES1_0) ? clockdomains_omap3430es1 : -		clockdomains_omap3430es2plus; +	rev = omap_rev(); -	clkdm_register_clkdms(sc); +	if (rev == AM35XX_REV_ES1_0 || rev == AM35XX_REV_ES1_1) { +		clkdm_register_clkdms(clockdomains_am35x); +		clkdm_register_autodeps(clkdm_am35x_autodeps); +	} else { +		clkdm_register_clkdms(clockdomains_omap3430); + +		sc = (rev == OMAP3430_REV_ES1_0) ? +			clockdomains_omap3430es1 : clockdomains_omap3430es2plus; + +		clkdm_register_clkdms(sc); +		clkdm_register_autodeps(clkdm_autodeps); +	} -	clkdm_register_autodeps(clkdm_autodeps);  	clkdm_complete_init();  } diff --git a/arch/arm/mach-omap2/cm-regbits-34xx.h b/arch/arm/mach-omap2/cm-regbits-34xx.h index 8083a8cdc55..766338fe4d3 100644 --- a/arch/arm/mach-omap2/cm-regbits-34xx.h +++ b/arch/arm/mach-omap2/cm-regbits-34xx.h @@ -169,8 +169,6 @@  /* AM35XX specific CM_ICLKEN1_CORE bits */  #define AM35XX_EN_IPSS_MASK				(1 << 4)  #define AM35XX_EN_IPSS_SHIFT				4 -#define AM35XX_EN_UART4_MASK				(1 << 23) -#define AM35XX_EN_UART4_SHIFT				23  /* CM_ICLKEN2_CORE */  #define OMAP3430_EN_PKA_MASK				(1 << 4) @@ -207,6 +205,8 @@  #define OMAP3430_ST_DES2_MASK				(1 << 26)  #define OMAP3430_ST_MSPRO_SHIFT				23  #define OMAP3430_ST_MSPRO_MASK				(1 << 23) +#define AM35XX_ST_UART4_SHIFT				23 +#define AM35XX_ST_UART4_MASK				(1 << 23)  #define OMAP3430_ST_HDQ_SHIFT				22  #define OMAP3430_ST_HDQ_MASK				(1 << 22)  #define OMAP3430ES1_ST_FAC_SHIFT			8 diff --git a/arch/arm/mach-omap2/cm.h b/arch/arm/mach-omap2/cm.h index a7bc096bd40..f24e3f7a2bb 100644 --- a/arch/arm/mach-omap2/cm.h +++ b/arch/arm/mach-omap2/cm.h @@ -22,4 +22,15 @@   */  #define MAX_MODULE_READY_TIME		2000 +/* + * MAX_MODULE_DISABLE_TIME: max duration in microseconds to wait for + * the PRCM to request that a module enter the inactive state in the + * case of OMAP2 & 3.  In the case of OMAP4 this is the max duration + * in microseconds for the module to reach the inactive state from + * a functional state. + * XXX FSUSB on OMAP4430 takes ~4ms to idle after reset during + * kernel init. + */ +#define MAX_MODULE_DISABLE_TIME		5000 +  #endif diff --git a/arch/arm/mach-omap2/cminst44xx.c b/arch/arm/mach-omap2/cminst44xx.c index 8c86d294b1a..1a39945d9ff 100644 --- a/arch/arm/mach-omap2/cminst44xx.c +++ b/arch/arm/mach-omap2/cminst44xx.c @@ -313,9 +313,9 @@ int omap4_cminst_wait_module_idle(u8 part, u16 inst, s16 cdoffs, u16 clkctrl_off  	omap_test_timeout((_clkctrl_idlest(part, inst, cdoffs, clkctrl_offs) ==  			   CLKCTRL_IDLEST_DISABLED), -			  MAX_MODULE_READY_TIME, i); +			  MAX_MODULE_DISABLE_TIME, i); -	return (i < MAX_MODULE_READY_TIME) ? 0 : -EBUSY; +	return (i < MAX_MODULE_DISABLE_TIME) ? 0 : -EBUSY;  }  /** diff --git a/arch/arm/mach-omap2/dsp.c b/arch/arm/mach-omap2/dsp.c index 845309f146f..88ffa1e645c 100644 --- a/arch/arm/mach-omap2/dsp.c +++ b/arch/arm/mach-omap2/dsp.c @@ -20,6 +20,9 @@  #include <linux/module.h>  #include <linux/platform_device.h> + +#include <asm/memblock.h> +  #include "cm2xxx_3xxx.h"  #include "prm2xxx_3xxx.h"  #ifdef CONFIG_BRIDGE_DVFS diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c index 0389b3264ab..00486a8564f 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c @@ -247,6 +247,17 @@ void __init omap3xxx_check_features(void)  	omap_features |= OMAP3_HAS_SDRC;  	/* +	 * am35x fixups: +	 * - The am35x Chip ID register has bits 12, 7:5, and 3:2 marked as +	 *   reserved and therefore return 0 when read.  Unfortunately, +	 *   OMAP3_CHECK_FEATURE() will interpret some of those zeroes to +	 *   mean that a feature is present even though it isn't so clear +	 *   the incorrectly set feature bits. +	 */ +	if (soc_is_am35xx()) +		omap_features &= ~(OMAP3_HAS_IVA | OMAP3_HAS_ISP); + +	/*  	 * TODO: Get additional info (where applicable)  	 *       e.g. Size of L2 cache.  	 */ diff --git a/arch/arm/mach-omap2/include/mach/am35xx.h b/arch/arm/mach-omap2/include/mach/am35xx.h index f1e13d1ca5e..95594495fcf 100644 --- a/arch/arm/mach-omap2/include/mach/am35xx.h +++ b/arch/arm/mach-omap2/include/mach/am35xx.h @@ -36,6 +36,8 @@  #define AM35XX_EMAC_CNTRL_MOD_OFFSET	(0x0)  #define AM35XX_EMAC_CNTRL_RAM_OFFSET	(0x20000)  #define AM35XX_EMAC_MDIO_OFFSET		(0x30000) +#define AM35XX_IPSS_MDIO_BASE		(AM35XX_IPSS_EMAC_BASE + \ +						AM35XX_EMAC_MDIO_OFFSET)  #define AM35XX_EMAC_CNTRL_RAM_SIZE	(0x2000)  #define AM35XX_EMAC_RAM_ADDR		(AM3517_EMAC_BASE + \  						AM3517_EMAC_CNTRL_RAM_OFFSET) diff --git a/arch/arm/mach-omap2/irq.c b/arch/arm/mach-omap2/irq.c index 74d77e00802..4c35366c7e4 100644 --- a/arch/arm/mach-omap2/irq.c +++ b/arch/arm/mach-omap2/irq.c @@ -149,6 +149,7 @@ omap_alloc_gc(void __iomem *base, unsigned int irq_start, unsigned int num)  	ct->chip.irq_ack = omap_mask_ack_irq;  	ct->chip.irq_mask = irq_gc_mask_disable_reg;  	ct->chip.irq_unmask = irq_gc_unmask_enable_reg; +	ct->chip.flags |= IRQCHIP_SKIP_SET_WAKE;  	ct->regs.enable = INTC_MIR_CLEAR0;  	ct->regs.disable = INTC_MIR_SET0; diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c index 80e55c5c999..9fe6829f4c1 100644 --- a/arch/arm/mach-omap2/mux.c +++ b/arch/arm/mach-omap2/mux.c @@ -41,6 +41,7 @@  #include "control.h"  #include "mux.h"  #include "prm.h" +#include "common.h"  #define OMAP_MUX_BASE_OFFSET		0x30	/* Offset from CTRL_BASE */  #define OMAP_MUX_BASE_SZ		0x5ca @@ -217,8 +218,7 @@ static int __init _omap_mux_get_by_name(struct omap_mux_partition *partition,  	return -ENODEV;  } -static int __init -omap_mux_get_by_name(const char *muxname, +int __init omap_mux_get_by_name(const char *muxname,  			struct omap_mux_partition **found_partition,  			struct omap_mux **found_mux)  { diff --git a/arch/arm/mach-omap2/mux.h b/arch/arm/mach-omap2/mux.h index 69fe060a0b7..471e62a74a1 100644 --- a/arch/arm/mach-omap2/mux.h +++ b/arch/arm/mach-omap2/mux.h @@ -59,6 +59,7 @@  #define OMAP_PIN_OFF_WAKEUPENABLE	OMAP_WAKEUP_EN  #define OMAP_MODE_GPIO(x)	(((x) & OMAP_MUX_MODE7) == OMAP_MUX_MODE4) +#define OMAP_MODE_UART(x)	(((x) & OMAP_MUX_MODE7) == OMAP_MUX_MODE0)  /* Flags for omapX_mux_init */  #define OMAP_PACKAGE_MASK		0xffff @@ -225,8 +226,18 @@ omap_hwmod_mux_init(struct omap_device_pad *bpads, int nr_pads);   */  void omap_hwmod_mux(struct omap_hwmod_mux_info *hmux, u8 state); +int omap_mux_get_by_name(const char *muxname, +		struct omap_mux_partition **found_partition, +		struct omap_mux **found_mux);  #else +static inline int omap_mux_get_by_name(const char *muxname, +		struct omap_mux_partition **found_partition, +		struct omap_mux **found_mux) +{ +	return 0; +} +  static inline int omap_mux_init_gpio(int gpio, int val)  {  	return 0; diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index bf86f7e8f91..773193670ea 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c @@ -530,7 +530,7 @@ static int _disable_wakeup(struct omap_hwmod *oh, u32 *v)  	if (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP)  		_set_slave_idlemode(oh, HWMOD_IDLEMODE_SMART, v);  	if (oh->class->sysc->idlemodes & MSTANDBY_SMART_WKUP) -		_set_master_standbymode(oh, HWMOD_IDLEMODE_SMART_WKUP, v); +		_set_master_standbymode(oh, HWMOD_IDLEMODE_SMART, v);  	/* XXX test pwrdm_get_wken for this hwmod's subsystem */ diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c index b26d3c9bca1..a8653af1969 100644 --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c @@ -527,11 +527,27 @@ static struct omap_hwmod omap36xx_uart4_hwmod = {  static struct omap_hwmod_irq_info am35xx_uart4_mpu_irqs[] = {  	{ .irq = INT_35XX_UART4_IRQ, }, +	{ .irq = -1 }  };  static struct omap_hwmod_dma_info am35xx_uart4_sdma_reqs[] = {  	{ .name = "rx", .dma_req = AM35XX_DMA_UART4_RX, },  	{ .name = "tx", .dma_req = AM35XX_DMA_UART4_TX, }, +	{ .dma_req = -1 } +}; + +/* + * XXX AM35xx UART4 cannot complete its softreset without uart1_fck or + * uart2_fck being enabled.  So we add uart1_fck as an optional clock, + * below, and set the HWMOD_CONTROL_OPT_CLKS_IN_RESET.  This really + * should not be needed.  The functional clock structure of the AM35xx + * UART4 is extremely unclear and opaque; it is unclear what the role + * of uart1/2_fck is for the UART4.  Any clarification from either + * empirical testing or the AM3505/3517 hardware designers would be + * most welcome. + */ +static struct omap_hwmod_opt_clk am35xx_uart4_opt_clks[] = { +	{ .role = "softreset_uart1_fck", .clk = "uart1_fck" },  };  static struct omap_hwmod am35xx_uart4_hwmod = { @@ -543,11 +559,14 @@ static struct omap_hwmod am35xx_uart4_hwmod = {  		.omap2 = {  			.module_offs = CORE_MOD,  			.prcm_reg_id = 1, -			.module_bit = OMAP3430_EN_UART4_SHIFT, +			.module_bit = AM35XX_EN_UART4_SHIFT,  			.idlest_reg_id = 1, -			.idlest_idle_bit = OMAP3430_EN_UART4_SHIFT, +			.idlest_idle_bit = AM35XX_ST_UART4_SHIFT,  		},  	}, +	.opt_clks	= am35xx_uart4_opt_clks, +	.opt_clks_cnt	= ARRAY_SIZE(am35xx_uart4_opt_clks), +	.flags		= HWMOD_CONTROL_OPT_CLKS_IN_RESET,  	.class		= &omap2_uart_class,  }; @@ -1638,25 +1657,20 @@ static struct omap_hwmod omap3xxx_usbhsotg_hwmod = {  /* usb_otg_hs */  static struct omap_hwmod_irq_info am35xx_usbhsotg_mpu_irqs[] = { -  	{ .name = "mc", .irq = 71 },  	{ .irq = -1 }  };  static struct omap_hwmod_class am35xx_usbotg_class = {  	.name = "am35xx_usbotg", -	.sysc = NULL,  };  static struct omap_hwmod am35xx_usbhsotg_hwmod = {  	.name		= "am35x_otg_hs",  	.mpu_irqs	= am35xx_usbhsotg_mpu_irqs, -	.main_clk	= NULL, -	.prcm = { -		.omap2 = { -		}, -	}, +	.main_clk	= "hsotgusb_fck",  	.class		= &am35xx_usbotg_class, +	.flags		= HWMOD_NO_IDLEST,  };  /* MMC/SD/SDIO common */ @@ -2097,9 +2111,10 @@ static struct omap_hwmod_ocp_if omap3xxx_usbhsotg__l3 = {  static struct omap_hwmod_ocp_if am35xx_usbhsotg__l3 = {  	.master		= &am35xx_usbhsotg_hwmod,  	.slave		= &omap3xxx_l3_main_hwmod, -	.clk		= "core_l3_ick", +	.clk		= "hsotgusb_ick",  	.user		= OCP_USER_MPU,  }; +  /* L4_CORE -> L4_WKUP interface */  static struct omap_hwmod_ocp_if omap3xxx_l4_core__l4_wkup = {  	.master	= &omap3xxx_l4_core_hwmod, @@ -2243,6 +2258,7 @@ static struct omap_hwmod_addr_space am35xx_uart4_addr_space[] = {  		.pa_end		= OMAP3_UART4_AM35XX_BASE + SZ_1K - 1,  		.flags		= ADDR_MAP_ON_INIT | ADDR_TYPE_RT,  	}, +	{ }  };  static struct omap_hwmod_ocp_if am35xx_l4_core__uart4 = { @@ -2393,7 +2409,7 @@ static struct omap_hwmod_addr_space am35xx_usbhsotg_addrs[] = {  static struct omap_hwmod_ocp_if am35xx_l4_core__usbhsotg = {  	.master		= &omap3xxx_l4_core_hwmod,  	.slave		= &am35xx_usbhsotg_hwmod, -	.clk		= "l4_ick", +	.clk		= "hsotgusb_ick",  	.addr		= am35xx_usbhsotg_addrs,  	.user		= OCP_USER_MPU,  }; @@ -3138,6 +3154,107 @@ static struct omap_hwmod_ocp_if omap3xxx_l4_wkup__counter_32k = {  	.user		= OCP_USER_MPU | OCP_USER_SDMA,  }; +/* am35xx has Davinci MDIO & EMAC */ +static struct omap_hwmod_class am35xx_mdio_class = { +	.name = "davinci_mdio", +}; + +static struct omap_hwmod am35xx_mdio_hwmod = { +	.name		= "davinci_mdio", +	.class		= &am35xx_mdio_class, +	.flags		= HWMOD_NO_IDLEST, +}; + +/* + * XXX Should be connected to an IPSS hwmod, not the L3 directly; + * but this will probably require some additional hwmod core support, + * so is left as a future to-do item. + */ +static struct omap_hwmod_ocp_if am35xx_mdio__l3 = { +	.master		= &am35xx_mdio_hwmod, +	.slave		= &omap3xxx_l3_main_hwmod, +	.clk		= "emac_fck", +	.user		= OCP_USER_MPU, +}; + +static struct omap_hwmod_addr_space am35xx_mdio_addrs[] = { +	{ +		.pa_start	= AM35XX_IPSS_MDIO_BASE, +		.pa_end		= AM35XX_IPSS_MDIO_BASE + SZ_4K - 1, +		.flags		= ADDR_TYPE_RT, +	}, +	{ } +}; + +/* l4_core -> davinci mdio  */ +/* + * XXX Should be connected to an IPSS hwmod, not the L4_CORE directly; + * but this will probably require some additional hwmod core support, + * so is left as a future to-do item. + */ +static struct omap_hwmod_ocp_if am35xx_l4_core__mdio = { +	.master		= &omap3xxx_l4_core_hwmod, +	.slave		= &am35xx_mdio_hwmod, +	.clk		= "emac_fck", +	.addr		= am35xx_mdio_addrs, +	.user		= OCP_USER_MPU, +}; + +static struct omap_hwmod_irq_info am35xx_emac_mpu_irqs[] = { +	{ .name = "rxthresh",	.irq = INT_35XX_EMAC_C0_RXTHRESH_IRQ }, +	{ .name = "rx_pulse",	.irq = INT_35XX_EMAC_C0_RX_PULSE_IRQ }, +	{ .name = "tx_pulse",	.irq = INT_35XX_EMAC_C0_TX_PULSE_IRQ }, +	{ .name = "misc_pulse",	.irq = INT_35XX_EMAC_C0_MISC_PULSE_IRQ }, +	{ .irq = -1 } +}; + +static struct omap_hwmod_class am35xx_emac_class = { +	.name = "davinci_emac", +}; + +static struct omap_hwmod am35xx_emac_hwmod = { +	.name		= "davinci_emac", +	.mpu_irqs	= am35xx_emac_mpu_irqs, +	.class		= &am35xx_emac_class, +	.flags		= HWMOD_NO_IDLEST, +}; + +/* l3_core -> davinci emac interface */ +/* + * XXX Should be connected to an IPSS hwmod, not the L3 directly; + * but this will probably require some additional hwmod core support, + * so is left as a future to-do item. + */ +static struct omap_hwmod_ocp_if am35xx_emac__l3 = { +	.master		= &am35xx_emac_hwmod, +	.slave		= &omap3xxx_l3_main_hwmod, +	.clk		= "emac_ick", +	.user		= OCP_USER_MPU, +}; + +static struct omap_hwmod_addr_space am35xx_emac_addrs[] = { +	{ +		.pa_start	= AM35XX_IPSS_EMAC_BASE, +		.pa_end		= AM35XX_IPSS_EMAC_BASE + 0x30000 - 1, +		.flags		= ADDR_TYPE_RT, +	}, +	{ } +}; + +/* l4_core -> davinci emac  */ +/* + * XXX Should be connected to an IPSS hwmod, not the L4_CORE directly; + * but this will probably require some additional hwmod core support, + * so is left as a future to-do item. + */ +static struct omap_hwmod_ocp_if am35xx_l4_core__emac = { +	.master		= &omap3xxx_l4_core_hwmod, +	.slave		= &am35xx_emac_hwmod, +	.clk		= "emac_ick", +	.addr		= am35xx_emac_addrs, +	.user		= OCP_USER_MPU, +}; +  static struct omap_hwmod_ocp_if *omap3xxx_hwmod_ocp_ifs[] __initdata = {  	&omap3xxx_l3_main__l4_core,  	&omap3xxx_l3_main__l4_per, @@ -3266,6 +3383,10 @@ static struct omap_hwmod_ocp_if *am35xx_hwmod_ocp_ifs[] __initdata = {  	&omap3xxx_l4_core__usb_tll_hs,  	&omap3xxx_l4_core__es3plus_mmc1,  	&omap3xxx_l4_core__es3plus_mmc2, +	&am35xx_mdio__l3, +	&am35xx_l4_core__mdio, +	&am35xx_emac__l3, +	&am35xx_l4_core__emac,  	NULL  }; diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c index 950454a3fa3..f30e861ce6d 100644 --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c @@ -393,8 +393,7 @@ static struct omap_hwmod_class_sysconfig omap44xx_counter_sysc = {  	.rev_offs	= 0x0000,  	.sysc_offs	= 0x0004,  	.sysc_flags	= SYSC_HAS_SIDLEMODE, -	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART | -			   SIDLE_SMART_WKUP), +	.idlemodes	= (SIDLE_FORCE | SIDLE_NO),  	.sysc_fields	= &omap_hwmod_sysc_type1,  }; @@ -854,6 +853,11 @@ static struct omap_hwmod omap44xx_dss_hdmi_hwmod = {  	.name		= "dss_hdmi",  	.class		= &omap44xx_hdmi_hwmod_class,  	.clkdm_name	= "l3_dss_clkdm", +	/* +	 * HDMI audio requires to use no-idle mode. Hence, +	 * set idle mode by software. +	 */ +	.flags		= HWMOD_SWSUP_SIDLE,  	.mpu_irqs	= omap44xx_dss_hdmi_irqs,  	.sdma_reqs	= omap44xx_dss_hdmi_sdma_reqs,  	.main_clk	= "dss_48mhz_clk", diff --git a/arch/arm/mach-omap2/omap_l3_smx.c b/arch/arm/mach-omap2/omap_l3_smx.c index a05a62f9ee5..acc216491b8 100644 --- a/arch/arm/mach-omap2/omap_l3_smx.c +++ b/arch/arm/mach-omap2/omap_l3_smx.c @@ -155,10 +155,11 @@ static irqreturn_t omap3_l3_block_irq(struct omap3_l3 *l3,  	u8 multi = error & L3_ERROR_LOG_MULTI;  	u32 address = omap3_l3_decode_addr(error_addr); -	WARN(true, "%s seen by %s %s at address %x\n", +	pr_err("%s seen by %s %s at address %x\n",  			omap3_l3_code_string(code),  			omap3_l3_initiator_string(initid),  			multi ? "Multiple Errors" : "", address); +	WARN_ON(1);  	return IRQ_HANDLED;  } diff --git a/arch/arm/mach-omap2/omap_phy_internal.c b/arch/arm/mach-omap2/omap_phy_internal.c index 4c90477e6f8..d52651a05da 100644 --- a/arch/arm/mach-omap2/omap_phy_internal.c +++ b/arch/arm/mach-omap2/omap_phy_internal.c @@ -239,21 +239,15 @@ void am35x_set_mode(u8 musb_mode)  	devconf2 &= ~CONF2_OTGMODE;  	switch (musb_mode) { -#ifdef	CONFIG_USB_MUSB_HDRC_HCD  	case MUSB_HOST:		/* Force VBUS valid, ID = 0 */  		devconf2 |= CONF2_FORCE_HOST;  		break; -#endif -#ifdef	CONFIG_USB_GADGET_MUSB_HDRC  	case MUSB_PERIPHERAL:	/* Force VBUS valid, ID = 1 */  		devconf2 |= CONF2_FORCE_DEVICE;  		break; -#endif -#ifdef	CONFIG_USB_MUSB_OTG  	case MUSB_OTG:		/* Don't override the VBUS/ID comparators */  		devconf2 |= CONF2_NO_OVERRIDE;  		break; -#endif  	default:  		pr_info(KERN_INFO "Unsupported mode %u\n", musb_mode);  	} diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 7eb8c5e4183..9b463c98750 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c @@ -729,6 +729,7 @@ int __init omap3_pm_init(void)  	ret = request_irq(omap_prcm_event_to_irq("io"),  		_prcm_int_handle_io, IRQF_SHARED | IRQF_NO_SUSPEND, "pm_io",  		omap3_pm_init); +	enable_irq(omap_prcm_event_to_irq("io"));  	if (ret) {  		pr_err("pm: Failed to request pm_io irq\n"); diff --git a/arch/arm/mach-omap2/powerdomains3xxx_data.c b/arch/arm/mach-omap2/powerdomains3xxx_data.c index fb0a0a6869d..bb883e46307 100644 --- a/arch/arm/mach-omap2/powerdomains3xxx_data.c +++ b/arch/arm/mach-omap2/powerdomains3xxx_data.c @@ -71,6 +71,22 @@ static struct powerdomain mpu_3xxx_pwrdm = {  	.voltdm           = { .name = "mpu_iva" },  }; +static struct powerdomain mpu_am35x_pwrdm = { +	.name		  = "mpu_pwrdm", +	.prcm_offs	  = MPU_MOD, +	.pwrsts		  = PWRSTS_ON, +	.pwrsts_logic_ret = PWRSTS_ON, +	.flags		  = PWRDM_HAS_MPU_QUIRK, +	.banks		  = 1, +	.pwrsts_mem_ret	  = { +		[0] = PWRSTS_ON, +	}, +	.pwrsts_mem_on	  = { +		[0] = PWRSTS_ON, +	}, +	.voltdm           = { .name = "mpu_iva" }, +}; +  /*   * The USBTLL Save-and-Restore mechanism is broken on   * 3430s up to ES3.0 and 3630ES1.0. Hence this feature @@ -120,6 +136,23 @@ static struct powerdomain core_3xxx_es3_1_pwrdm = {  	.voltdm           = { .name = "core" },  }; +static struct powerdomain core_am35x_pwrdm = { +	.name		  = "core_pwrdm", +	.prcm_offs	  = CORE_MOD, +	.pwrsts		  = PWRSTS_ON, +	.pwrsts_logic_ret = PWRSTS_ON, +	.banks		  = 2, +	.pwrsts_mem_ret	  = { +		[0] = PWRSTS_ON,	 /* MEM1RETSTATE */ +		[1] = PWRSTS_ON,	 /* MEM2RETSTATE */ +	}, +	.pwrsts_mem_on	  = { +		[0] = PWRSTS_ON, /* MEM1ONSTATE */ +		[1] = PWRSTS_ON, /* MEM2ONSTATE */ +	}, +	.voltdm           = { .name = "core" }, +}; +  static struct powerdomain dss_pwrdm = {  	.name		  = "dss_pwrdm",  	.prcm_offs	  = OMAP3430_DSS_MOD, @@ -135,6 +168,21 @@ static struct powerdomain dss_pwrdm = {  	.voltdm           = { .name = "core" },  }; +static struct powerdomain dss_am35x_pwrdm = { +	.name		  = "dss_pwrdm", +	.prcm_offs	  = OMAP3430_DSS_MOD, +	.pwrsts		  = PWRSTS_ON, +	.pwrsts_logic_ret = PWRSTS_ON, +	.banks		  = 1, +	.pwrsts_mem_ret	  = { +		[0] = PWRSTS_ON, /* MEMRETSTATE */ +	}, +	.pwrsts_mem_on	  = { +		[0] = PWRSTS_ON,  /* MEMONSTATE */ +	}, +	.voltdm           = { .name = "core" }, +}; +  /*   * Although the 34XX TRM Rev K Table 4-371 notes that retention is a   * possible SGX powerstate, the SGX device itself does not support @@ -156,6 +204,21 @@ static struct powerdomain sgx_pwrdm = {  	.voltdm           = { .name = "core" },  }; +static struct powerdomain sgx_am35x_pwrdm = { +	.name		  = "sgx_pwrdm", +	.prcm_offs	  = OMAP3430ES2_SGX_MOD, +	.pwrsts		  = PWRSTS_ON, +	.pwrsts_logic_ret = PWRSTS_ON, +	.banks		  = 1, +	.pwrsts_mem_ret	  = { +		[0] = PWRSTS_ON, /* MEMRETSTATE */ +	}, +	.pwrsts_mem_on	  = { +		[0] = PWRSTS_ON,  /* MEMONSTATE */ +	}, +	.voltdm           = { .name = "core" }, +}; +  static struct powerdomain cam_pwrdm = {  	.name		  = "cam_pwrdm",  	.prcm_offs	  = OMAP3430_CAM_MOD, @@ -186,6 +249,21 @@ static struct powerdomain per_pwrdm = {  	.voltdm           = { .name = "core" },  }; +static struct powerdomain per_am35x_pwrdm = { +	.name		  = "per_pwrdm", +	.prcm_offs	  = OMAP3430_PER_MOD, +	.pwrsts		  = PWRSTS_ON, +	.pwrsts_logic_ret = PWRSTS_ON, +	.banks		  = 1, +	.pwrsts_mem_ret	  = { +		[0] = PWRSTS_ON, /* MEMRETSTATE */ +	}, +	.pwrsts_mem_on	  = { +		[0] = PWRSTS_ON,  /* MEMONSTATE */ +	}, +	.voltdm           = { .name = "core" }, +}; +  static struct powerdomain emu_pwrdm = {  	.name		= "emu_pwrdm",  	.prcm_offs	= OMAP3430_EMU_MOD, @@ -200,6 +278,14 @@ static struct powerdomain neon_pwrdm = {  	.voltdm           = { .name = "mpu_iva" },  }; +static struct powerdomain neon_am35x_pwrdm = { +	.name		  = "neon_pwrdm", +	.prcm_offs	  = OMAP3430_NEON_MOD, +	.pwrsts		  = PWRSTS_ON, +	.pwrsts_logic_ret = PWRSTS_ON, +	.voltdm           = { .name = "mpu_iva" }, +}; +  static struct powerdomain usbhost_pwrdm = {  	.name		  = "usbhost_pwrdm",  	.prcm_offs	  = OMAP3430ES2_USBHOST_MOD, @@ -293,6 +379,22 @@ static struct powerdomain *powerdomains_omap3430es3_1plus[] __initdata = {  	NULL  }; +static struct powerdomain *powerdomains_am35x[] __initdata = { +	&wkup_omap2_pwrdm, +	&mpu_am35x_pwrdm, +	&neon_am35x_pwrdm, +	&core_am35x_pwrdm, +	&sgx_am35x_pwrdm, +	&dss_am35x_pwrdm, +	&per_am35x_pwrdm, +	&emu_pwrdm, +	&dpll1_pwrdm, +	&dpll3_pwrdm, +	&dpll4_pwrdm, +	&dpll5_pwrdm, +	NULL +}; +  void __init omap3xxx_powerdomains_init(void)  {  	unsigned int rev; @@ -301,21 +403,34 @@ void __init omap3xxx_powerdomains_init(void)  		return;  	pwrdm_register_platform_funcs(&omap3_pwrdm_operations); -	pwrdm_register_pwrdms(powerdomains_omap3430_common);  	rev = omap_rev(); -	if (rev == OMAP3430_REV_ES1_0) -		pwrdm_register_pwrdms(powerdomains_omap3430es1); -	else if (rev == OMAP3430_REV_ES2_0 || rev == OMAP3430_REV_ES2_1 || -		 rev == OMAP3430_REV_ES3_0 || rev == OMAP3630_REV_ES1_0) -		pwrdm_register_pwrdms(powerdomains_omap3430es2_es3_0); -	else if (rev == OMAP3430_REV_ES3_1 || rev == OMAP3430_REV_ES3_1_2 || -		 rev == AM35XX_REV_ES1_0 || rev == AM35XX_REV_ES1_1 || -		 rev == OMAP3630_REV_ES1_1 || rev == OMAP3630_REV_ES1_2) -		pwrdm_register_pwrdms(powerdomains_omap3430es3_1plus); -	else -		WARN(1, "OMAP3 powerdomain init: unknown chip type\n"); +	if (rev == AM35XX_REV_ES1_0 || rev == AM35XX_REV_ES1_1) { +		pwrdm_register_pwrdms(powerdomains_am35x); +	} else { +		pwrdm_register_pwrdms(powerdomains_omap3430_common); + +		switch (rev) { +		case OMAP3430_REV_ES1_0: +			pwrdm_register_pwrdms(powerdomains_omap3430es1); +			break; +		case OMAP3430_REV_ES2_0: +		case OMAP3430_REV_ES2_1: +		case OMAP3430_REV_ES3_0: +		case OMAP3630_REV_ES1_0: +			pwrdm_register_pwrdms(powerdomains_omap3430es2_es3_0); +			break; +		case OMAP3430_REV_ES3_1: +		case OMAP3430_REV_ES3_1_2: +		case OMAP3630_REV_ES1_1: +		case OMAP3630_REV_ES1_2: +			pwrdm_register_pwrdms(powerdomains_omap3430es3_1plus); +			break; +		default: +			WARN(1, "OMAP3 powerdomain init: unknown chip type\n"); +		} +	}  	pwrdm_complete_init();  } diff --git a/arch/arm/mach-omap2/prcm-common.h b/arch/arm/mach-omap2/prcm-common.h index 6da3ba483ad..cc1398e8b46 100644 --- a/arch/arm/mach-omap2/prcm-common.h +++ b/arch/arm/mach-omap2/prcm-common.h @@ -203,8 +203,8 @@  #define OMAP3430_EN_MMC2_SHIFT				25  #define OMAP3430_EN_MMC1_MASK				(1 << 24)  #define OMAP3430_EN_MMC1_SHIFT				24 -#define OMAP3430_EN_UART4_MASK				(1 << 23) -#define OMAP3430_EN_UART4_SHIFT				23 +#define AM35XX_EN_UART4_MASK				(1 << 23) +#define AM35XX_EN_UART4_SHIFT				23  #define OMAP3430_EN_MCSPI4_MASK				(1 << 21)  #define OMAP3430_EN_MCSPI4_SHIFT			21  #define OMAP3430_EN_MCSPI3_MASK				(1 << 20) diff --git a/arch/arm/mach-omap2/prm2xxx_3xxx.c b/arch/arm/mach-omap2/prm2xxx_3xxx.c index 9ce765407ad..21cb74003a5 100644 --- a/arch/arm/mach-omap2/prm2xxx_3xxx.c +++ b/arch/arm/mach-omap2/prm2xxx_3xxx.c @@ -15,6 +15,7 @@  #include <linux/errno.h>  #include <linux/err.h>  #include <linux/io.h> +#include <linux/irq.h>  #include "common.h"  #include <plat/cpu.h> @@ -303,8 +304,15 @@ void omap3xxx_prm_restore_irqen(u32 *saved_mask)  static int __init omap3xxx_prcm_init(void)  { -	if (cpu_is_omap34xx()) -		return omap_prcm_register_chain_handler(&omap3_prcm_irq_setup); -	return 0; +	int ret = 0; + +	if (cpu_is_omap34xx()) { +		ret = omap_prcm_register_chain_handler(&omap3_prcm_irq_setup); +		if (!ret) +			irq_set_status_flags(omap_prcm_event_to_irq("io"), +					     IRQ_NOAUTOEN); +	} + +	return ret;  }  subsys_initcall(omap3xxx_prcm_init); diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c index 292d4aaca06..c1b93c752d7 100644 --- a/arch/arm/mach-omap2/serial.c +++ b/arch/arm/mach-omap2/serial.c @@ -57,6 +57,7 @@ struct omap_uart_state {  	struct list_head node;  	struct omap_hwmod *oh; +	struct omap_device_pad default_omap_uart_pads[2];  };  static LIST_HEAD(uart_list); @@ -126,11 +127,70 @@ static void omap_uart_set_smartidle(struct platform_device *pdev) {}  #endif /* CONFIG_PM */  #ifdef CONFIG_OMAP_MUX -static void omap_serial_fill_default_pads(struct omap_board_data *bdata) + +#define OMAP_UART_DEFAULT_PAD_NAME_LEN	28 +static char rx_pad_name[OMAP_UART_DEFAULT_PAD_NAME_LEN], +		tx_pad_name[OMAP_UART_DEFAULT_PAD_NAME_LEN] __initdata; + +static void  __init +omap_serial_fill_uart_tx_rx_pads(struct omap_board_data *bdata, +				struct omap_uart_state *uart)  { +	uart->default_omap_uart_pads[0].name = rx_pad_name; +	uart->default_omap_uart_pads[0].flags = OMAP_DEVICE_PAD_REMUX | +							OMAP_DEVICE_PAD_WAKEUP; +	uart->default_omap_uart_pads[0].enable = OMAP_PIN_INPUT | +							OMAP_MUX_MODE0; +	uart->default_omap_uart_pads[0].idle = OMAP_PIN_INPUT | OMAP_MUX_MODE0; +	uart->default_omap_uart_pads[1].name = tx_pad_name; +	uart->default_omap_uart_pads[1].enable = OMAP_PIN_OUTPUT | +							OMAP_MUX_MODE0; +	bdata->pads = uart->default_omap_uart_pads; +	bdata->pads_cnt = ARRAY_SIZE(uart->default_omap_uart_pads); +} + +static void  __init omap_serial_check_wakeup(struct omap_board_data *bdata, +						struct omap_uart_state *uart) +{ +	struct omap_mux_partition *tx_partition = NULL, *rx_partition = NULL; +	struct omap_mux *rx_mux = NULL, *tx_mux = NULL; +	char *rx_fmt, *tx_fmt; +	int uart_nr = bdata->id + 1; + +	if (bdata->id != 2) { +		rx_fmt = "uart%d_rx.uart%d_rx"; +		tx_fmt = "uart%d_tx.uart%d_tx"; +	} else { +		rx_fmt = "uart%d_rx_irrx.uart%d_rx_irrx"; +		tx_fmt = "uart%d_tx_irtx.uart%d_tx_irtx"; +	} + +	snprintf(rx_pad_name, OMAP_UART_DEFAULT_PAD_NAME_LEN, rx_fmt, +			uart_nr, uart_nr); +	snprintf(tx_pad_name, OMAP_UART_DEFAULT_PAD_NAME_LEN, tx_fmt, +			uart_nr, uart_nr); + +	if (omap_mux_get_by_name(rx_pad_name, &rx_partition, &rx_mux) >= 0 && +			omap_mux_get_by_name +				(tx_pad_name, &tx_partition, &tx_mux) >= 0) { +		u16 tx_mode, rx_mode; + +		tx_mode = omap_mux_read(tx_partition, tx_mux->reg_offset); +		rx_mode = omap_mux_read(rx_partition, rx_mux->reg_offset); + +		/* +		 * Check if uart is used in default tx/rx mode i.e. in mux mode0 +		 * if yes then configure rx pin for wake up capability +		 */ +		if (OMAP_MODE_UART(rx_mode) && OMAP_MODE_UART(tx_mode)) +			omap_serial_fill_uart_tx_rx_pads(bdata, uart); +	}  }  #else -static void omap_serial_fill_default_pads(struct omap_board_data *bdata) {} +static void __init omap_serial_check_wakeup(struct omap_board_data *bdata, +		struct omap_uart_state *uart) +{ +}  #endif  static char *cmdline_find_option(char *str) @@ -287,8 +347,7 @@ void __init omap_serial_board_init(struct omap_uart_port_info *info)  		bdata.pads = NULL;  		bdata.pads_cnt = 0; -		if (cpu_is_omap44xx() || cpu_is_omap34xx()) -			omap_serial_fill_default_pads(&bdata); +		omap_serial_check_wakeup(&bdata, uart);  		if (!info)  			omap_serial_init_port(&bdata, NULL); diff --git a/arch/arm/mach-omap2/usb-musb.c b/arch/arm/mach-omap2/usb-musb.c index b19d1b43c12..c4a57685666 100644 --- a/arch/arm/mach-omap2/usb-musb.c +++ b/arch/arm/mach-omap2/usb-musb.c @@ -41,12 +41,10 @@ static struct musb_hdrc_config musb_config = {  };  static struct musb_hdrc_platform_data musb_plat = { -#ifdef CONFIG_USB_MUSB_OTG +#ifdef CONFIG_USB_GADGET_MUSB_HDRC  	.mode		= MUSB_OTG, -#elif defined(CONFIG_USB_MUSB_HDRC_HCD) +#else  	.mode		= MUSB_HOST, -#elif defined(CONFIG_USB_GADGET_MUSB_HDRC) -	.mode		= MUSB_PERIPHERAL,  #endif  	/* .clock is set dynamically */  	.config		= &musb_config, diff --git a/arch/arm/mach-omap2/usb-tusb6010.c b/arch/arm/mach-omap2/usb-tusb6010.c index db84a46ce7f..805bea6edf1 100644 --- a/arch/arm/mach-omap2/usb-tusb6010.c +++ b/arch/arm/mach-omap2/usb-tusb6010.c @@ -300,7 +300,7 @@ tusb6010_setup_interface(struct musb_hdrc_platform_data *data,  		printk(error, 3, status);  		return status;  	} -	tusb_resources[2].start = irq + IH_GPIO_BASE; +	tusb_resources[2].start = gpio_to_irq(irq);  	/* set up memory timings ... can speed them up later */  	if (!ps_refclk) { diff --git a/arch/arm/mach-orion5x/include/mach/bridge-regs.h b/arch/arm/mach-orion5x/include/mach/bridge-regs.h index 96484bcd34c..11a3c1e9801 100644 --- a/arch/arm/mach-orion5x/include/mach/bridge-regs.h +++ b/arch/arm/mach-orion5x/include/mach/bridge-regs.h @@ -35,5 +35,5 @@  #define MAIN_IRQ_MASK		(ORION5X_BRIDGE_VIRT_BASE | 0x204)  #define TIMER_VIRT_BASE		(ORION5X_BRIDGE_VIRT_BASE | 0x300) - +#define TIMER_PHYS_BASE		(ORION5X_BRIDGE_PHYS_BASE | 0x300)  #endif diff --git a/arch/arm/mach-orion5x/include/mach/io.h b/arch/arm/mach-orion5x/include/mach/io.h new file mode 100644 index 00000000000..1aa5d0a50a0 --- /dev/null +++ b/arch/arm/mach-orion5x/include/mach/io.h @@ -0,0 +1,22 @@ +/* + * arch/arm/mach-orion5x/include/mach/io.h + * + * This file is licensed under the terms of the GNU General Public + * License version 2.  This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#ifndef __ASM_ARCH_IO_H +#define __ASM_ARCH_IO_H + +#include <mach/orion5x.h> +#include <asm/sizes.h> + +#define IO_SPACE_LIMIT		SZ_2M +static inline void __iomem *__io(unsigned long addr) +{ +	return (void __iomem *)(addr + ORION5X_PCIE_IO_VIRT_BASE); +} + +#define __io(a)			 __io(a) +#endif diff --git a/arch/arm/mach-orion5x/include/mach/orion5x.h b/arch/arm/mach-orion5x/include/mach/orion5x.h index 2745f5d95b3..683e085ce16 100644 --- a/arch/arm/mach-orion5x/include/mach/orion5x.h +++ b/arch/arm/mach-orion5x/include/mach/orion5x.h @@ -82,6 +82,7 @@  #define  UART1_VIRT_BASE		(ORION5X_DEV_BUS_VIRT_BASE | 0x2100)  #define ORION5X_BRIDGE_VIRT_BASE	(ORION5X_REGS_VIRT_BASE | 0x20000) +#define ORION5X_BRIDGE_PHYS_BASE	(ORION5X_REGS_PHYS_BASE | 0x20000)  #define ORION5X_PCI_VIRT_BASE		(ORION5X_REGS_VIRT_BASE | 0x30000) diff --git a/arch/arm/mach-spear13xx/include/mach/debug-macro.S b/arch/arm/mach-spear13xx/include/mach/debug-macro.S index ea1564609bd..9e3ae6bfe50 100644 --- a/arch/arm/mach-spear13xx/include/mach/debug-macro.S +++ b/arch/arm/mach-spear13xx/include/mach/debug-macro.S @@ -4,7 +4,7 @@   * Debugging macro include header spear13xx machine family   *   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/mach-spear13xx/include/mach/dma.h b/arch/arm/mach-spear13xx/include/mach/dma.h index 383ab04dc6c..d50bdb60592 100644 --- a/arch/arm/mach-spear13xx/include/mach/dma.h +++ b/arch/arm/mach-spear13xx/include/mach/dma.h @@ -4,7 +4,7 @@   * DMA information for SPEAr13xx machine family   *   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/mach-spear13xx/include/mach/generic.h b/arch/arm/mach-spear13xx/include/mach/generic.h index 6d8c45b9f29..dac57fd0cdf 100644 --- a/arch/arm/mach-spear13xx/include/mach/generic.h +++ b/arch/arm/mach-spear13xx/include/mach/generic.h @@ -4,7 +4,7 @@   * spear13xx machine family generic header file   *   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/mach-spear13xx/include/mach/gpio.h b/arch/arm/mach-spear13xx/include/mach/gpio.h index cd6f4f86a56..85f176311f6 100644 --- a/arch/arm/mach-spear13xx/include/mach/gpio.h +++ b/arch/arm/mach-spear13xx/include/mach/gpio.h @@ -4,7 +4,7 @@   * GPIO macros for SPEAr13xx machine family   *   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/mach-spear13xx/include/mach/irqs.h b/arch/arm/mach-spear13xx/include/mach/irqs.h index f542a24aa5f..271a62b4cd3 100644 --- a/arch/arm/mach-spear13xx/include/mach/irqs.h +++ b/arch/arm/mach-spear13xx/include/mach/irqs.h @@ -4,7 +4,7 @@   * IRQ helper macros for spear13xx machine family   *   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/mach-spear13xx/include/mach/spear.h b/arch/arm/mach-spear13xx/include/mach/spear.h index 30c57ef7268..65f27def239 100644 --- a/arch/arm/mach-spear13xx/include/mach/spear.h +++ b/arch/arm/mach-spear13xx/include/mach/spear.h @@ -4,7 +4,7 @@   * spear13xx Machine family specific definition   *   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/mach-spear13xx/include/mach/timex.h b/arch/arm/mach-spear13xx/include/mach/timex.h index 31af3e8d976..3a58b8284a6 100644 --- a/arch/arm/mach-spear13xx/include/mach/timex.h +++ b/arch/arm/mach-spear13xx/include/mach/timex.h @@ -4,7 +4,7 @@   * SPEAr3XX machine family specific timex definitions   *   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/mach-spear13xx/include/mach/uncompress.h b/arch/arm/mach-spear13xx/include/mach/uncompress.h index c7840896ae6..70fe72f05de 100644 --- a/arch/arm/mach-spear13xx/include/mach/uncompress.h +++ b/arch/arm/mach-spear13xx/include/mach/uncompress.h @@ -4,7 +4,7 @@   * Serial port stubs for kernel decompress status messages   *   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/mach-spear13xx/spear1310.c b/arch/arm/mach-spear13xx/spear1310.c index fefd15b2f38..732d29bc733 100644 --- a/arch/arm/mach-spear13xx/spear1310.c +++ b/arch/arm/mach-spear13xx/spear1310.c @@ -4,7 +4,7 @@   * SPEAr1310 machine source file   *   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/mach-spear13xx/spear1340.c b/arch/arm/mach-spear13xx/spear1340.c index ee38cbc5686..81e4ed76ad0 100644 --- a/arch/arm/mach-spear13xx/spear1340.c +++ b/arch/arm/mach-spear13xx/spear1340.c @@ -4,7 +4,7 @@   * SPEAr1340 machine source file   *   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/mach-spear13xx/spear13xx.c b/arch/arm/mach-spear13xx/spear13xx.c index 50b349ae863..cf936b106e2 100644 --- a/arch/arm/mach-spear13xx/spear13xx.c +++ b/arch/arm/mach-spear13xx/spear13xx.c @@ -4,7 +4,7 @@   * SPEAr13XX machines common source file   *   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/mach-spear3xx/include/mach/debug-macro.S b/arch/arm/mach-spear3xx/include/mach/debug-macro.S index 590519f10d6..0a6381fad5d 100644 --- a/arch/arm/mach-spear3xx/include/mach/debug-macro.S +++ b/arch/arm/mach-spear3xx/include/mach/debug-macro.S @@ -4,7 +4,7 @@   * Debugging macro include header spear3xx machine family   *   * Copyright (C) 2009 ST Microelectronics - * Viresh Kumar<viresh.kumar@st.com> + * Viresh Kumar<viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/mach-spear3xx/include/mach/generic.h b/arch/arm/mach-spear3xx/include/mach/generic.h index 4a95b9453c2..ce19113ca79 100644 --- a/arch/arm/mach-spear3xx/include/mach/generic.h +++ b/arch/arm/mach-spear3xx/include/mach/generic.h @@ -4,7 +4,7 @@   * SPEAr3XX machine family generic header file   *   * Copyright (C) 2009 ST Microelectronics - * Viresh Kumar<viresh.kumar@st.com> + * Viresh Kumar<viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/mach-spear3xx/include/mach/gpio.h b/arch/arm/mach-spear3xx/include/mach/gpio.h index 451b2081bfc..2ac74c6db7f 100644 --- a/arch/arm/mach-spear3xx/include/mach/gpio.h +++ b/arch/arm/mach-spear3xx/include/mach/gpio.h @@ -4,7 +4,7 @@   * GPIO macros for SPEAr3xx machine family   *   * Copyright (C) 2009 ST Microelectronics - * Viresh Kumar<viresh.kumar@st.com> + * Viresh Kumar<viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/mach-spear3xx/include/mach/irqs.h b/arch/arm/mach-spear3xx/include/mach/irqs.h index 51bd62a0254..803de76f5f3 100644 --- a/arch/arm/mach-spear3xx/include/mach/irqs.h +++ b/arch/arm/mach-spear3xx/include/mach/irqs.h @@ -4,7 +4,7 @@   * IRQ helper macros for SPEAr3xx machine family   *   * Copyright (C) 2009 ST Microelectronics - * Viresh Kumar<viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/mach-spear3xx/include/mach/misc_regs.h b/arch/arm/mach-spear3xx/include/mach/misc_regs.h index 18e2ac576f2..6309bf68d6f 100644 --- a/arch/arm/mach-spear3xx/include/mach/misc_regs.h +++ b/arch/arm/mach-spear3xx/include/mach/misc_regs.h @@ -4,7 +4,7 @@   * Miscellaneous registers definitions for SPEAr3xx machine family   *   * Copyright (C) 2009 ST Microelectronics - * Viresh Kumar<viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/mach-spear3xx/include/mach/spear.h b/arch/arm/mach-spear3xx/include/mach/spear.h index 51eb953148a..8cca95193d4 100644 --- a/arch/arm/mach-spear3xx/include/mach/spear.h +++ b/arch/arm/mach-spear3xx/include/mach/spear.h @@ -4,7 +4,7 @@   * SPEAr3xx Machine family specific definition   *   * Copyright (C) 2009 ST Microelectronics - * Viresh Kumar<viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/mach-spear3xx/include/mach/timex.h b/arch/arm/mach-spear3xx/include/mach/timex.h index a38cc9de876..9f5d08bd0c4 100644 --- a/arch/arm/mach-spear3xx/include/mach/timex.h +++ b/arch/arm/mach-spear3xx/include/mach/timex.h @@ -4,7 +4,7 @@   * SPEAr3XX machine family specific timex definitions   *   * Copyright (C) 2009 ST Microelectronics - * Viresh Kumar<viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/mach-spear3xx/include/mach/uncompress.h b/arch/arm/mach-spear3xx/include/mach/uncompress.h index 53ba8bbc0df..b909b011f7c 100644 --- a/arch/arm/mach-spear3xx/include/mach/uncompress.h +++ b/arch/arm/mach-spear3xx/include/mach/uncompress.h @@ -4,7 +4,7 @@   * Serial port stubs for kernel decompress status messages   *   * Copyright (C) 2009 ST Microelectronics - * Viresh Kumar<viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/mach-spear3xx/spear300.c b/arch/arm/mach-spear3xx/spear300.c index f74a05bdb82..0f882ecb7d8 100644 --- a/arch/arm/mach-spear3xx/spear300.c +++ b/arch/arm/mach-spear3xx/spear300.c @@ -4,7 +4,7 @@   * SPEAr300 machine source file   *   * Copyright (C) 2009-2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/mach-spear3xx/spear310.c b/arch/arm/mach-spear3xx/spear310.c index 84dfb090074..bbcf4571d36 100644 --- a/arch/arm/mach-spear3xx/spear310.c +++ b/arch/arm/mach-spear3xx/spear310.c @@ -4,7 +4,7 @@   * SPEAr310 machine source file   *   * Copyright (C) 2009-2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/mach-spear3xx/spear320.c b/arch/arm/mach-spear3xx/spear320.c index a88fa841d29..88d483bcd66 100644 --- a/arch/arm/mach-spear3xx/spear320.c +++ b/arch/arm/mach-spear3xx/spear320.c @@ -4,7 +4,7 @@   * SPEAr320 machine source file   *   * Copyright (C) 2009-2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/mach-spear3xx/spear3xx.c b/arch/arm/mach-spear3xx/spear3xx.c index f22419ed74a..0f41bd1c47c 100644 --- a/arch/arm/mach-spear3xx/spear3xx.c +++ b/arch/arm/mach-spear3xx/spear3xx.c @@ -4,7 +4,7 @@   * SPEAr3XX machines common source file   *   * Copyright (C) 2009-2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/mach-spear6xx/include/mach/gpio.h b/arch/arm/mach-spear6xx/include/mach/gpio.h index 3a789dbb69f..d42cefc0356 100644 --- a/arch/arm/mach-spear6xx/include/mach/gpio.h +++ b/arch/arm/mach-spear6xx/include/mach/gpio.h @@ -4,7 +4,7 @@   * GPIO macros for SPEAr6xx machine family   *   * Copyright (C) 2009 ST Microelectronics - * Viresh Kumar<viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/mach-spear6xx/include/mach/misc_regs.h b/arch/arm/mach-spear6xx/include/mach/misc_regs.h index 179e45774b3..c34acc201d3 100644 --- a/arch/arm/mach-spear6xx/include/mach/misc_regs.h +++ b/arch/arm/mach-spear6xx/include/mach/misc_regs.h @@ -4,7 +4,7 @@   * Miscellaneous registers definitions for SPEAr6xx machine family   *   * Copyright (C) 2009 ST Microelectronics - * Viresh Kumar<viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/mach-tegra/reset.c b/arch/arm/mach-tegra/reset.c index 4d6a2ee99c3..5beb7ebe294 100644 --- a/arch/arm/mach-tegra/reset.c +++ b/arch/arm/mach-tegra/reset.c @@ -33,7 +33,7 @@  static bool is_enabled; -static void tegra_cpu_reset_handler_enable(void) +static void __init tegra_cpu_reset_handler_enable(void)  {  	void __iomem *iram_base = IO_ADDRESS(TEGRA_IRAM_RESET_BASE);  	void __iomem *evp_cpu_reset = diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c index 9c74ac54584..1509a3cb583 100644 --- a/arch/arm/mach-ux500/board-mop500.c +++ b/arch/arm/mach-ux500/board-mop500.c @@ -580,43 +580,12 @@ static void ux500_uart0_reset(void)  	udelay(1);  } -/* This needs to be referenced by callbacks */ -struct pinctrl *u0_p; -struct pinctrl_state *u0_def; -struct pinctrl_state *u0_sleep; - -static void ux500_uart0_init(void) -{ -	int ret; - -	if (IS_ERR(u0_p) || IS_ERR(u0_def)) -		return; - -	ret = pinctrl_select_state(u0_p, u0_def); -	if (ret) -		pr_err("could not set UART0 defstate\n"); -} - -static void ux500_uart0_exit(void) -{ -	int ret; - -	if (IS_ERR(u0_p) || IS_ERR(u0_sleep)) -		return; - -	ret = pinctrl_select_state(u0_p, u0_sleep); -	if (ret) -		pr_err("could not set UART0 idlestate\n"); -} -  static struct amba_pl011_data uart0_plat = {  #ifdef CONFIG_STE_DMA40  	.dma_filter = stedma40_filter,  	.dma_rx_param = &uart0_dma_cfg_rx,  	.dma_tx_param = &uart0_dma_cfg_tx,  #endif -	.init = ux500_uart0_init, -	.exit = ux500_uart0_exit,  	.reset = ux500_uart0_reset,  }; @@ -638,28 +607,7 @@ static struct amba_pl011_data uart2_plat = {  static void __init mop500_uart_init(struct device *parent)  { -	struct amba_device *uart0_device; - -	uart0_device = db8500_add_uart0(parent, &uart0_plat); -	if (uart0_device) { -		u0_p = pinctrl_get(&uart0_device->dev); -		if (IS_ERR(u0_p)) -			dev_err(&uart0_device->dev, -				"could not get UART0 pinctrl\n"); -		else { -			u0_def = pinctrl_lookup_state(u0_p, -						      PINCTRL_STATE_DEFAULT); -			if (IS_ERR(u0_def)) { -				dev_err(&uart0_device->dev, -					"could not get UART0 defstate\n"); -			} -			u0_sleep = pinctrl_lookup_state(u0_p, -							PINCTRL_STATE_SLEEP); -			if (IS_ERR(u0_sleep)) -				dev_err(&uart0_device->dev, -					"could not get UART0 idlestate\n"); -		} -	} +	db8500_add_uart0(parent, &uart0_plat);  	db8500_add_uart1(parent, &uart1_plat);  	db8500_add_uart2(parent, &uart2_plat);  } diff --git a/arch/arm/mach-versatile/core.c b/arch/arm/mach-versatile/core.c index cf4687ee2a7..cd8ea3588f9 100644 --- a/arch/arm/mach-versatile/core.c +++ b/arch/arm/mach-versatile/core.c @@ -169,26 +169,13 @@ static struct map_desc versatile_io_desc[] __initdata = {  		.pfn		= __phys_to_pfn(VERSATILE_PCI_CFG_BASE),  		.length		= VERSATILE_PCI_CFG_BASE_SIZE,  		.type		= MT_DEVICE -	}, -#if 0 - 	{ -		.virtual	=  VERSATILE_PCI_VIRT_MEM_BASE0, -		.pfn		= __phys_to_pfn(VERSATILE_PCI_MEM_BASE0), -		.length		= SZ_16M, -		.type		= MT_DEVICE  	}, { -		.virtual	=  VERSATILE_PCI_VIRT_MEM_BASE1, -		.pfn		= __phys_to_pfn(VERSATILE_PCI_MEM_BASE1), -		.length		= SZ_16M, -		.type		= MT_DEVICE -	}, { -		.virtual	=  VERSATILE_PCI_VIRT_MEM_BASE2, -		.pfn		= __phys_to_pfn(VERSATILE_PCI_MEM_BASE2), -		.length		= SZ_16M, +		.virtual	=  (unsigned long)VERSATILE_PCI_VIRT_MEM_BASE0, +		.pfn		= __phys_to_pfn(VERSATILE_PCI_MEM_BASE0), +		.length		= IO_SPACE_LIMIT,  		.type		= MT_DEVICE  	},  #endif -#endif  };  void __init versatile_map_io(void) diff --git a/arch/arm/mach-versatile/include/mach/hardware.h b/arch/arm/mach-versatile/include/mach/hardware.h index 4d4973dd8fb..408e58da46c 100644 --- a/arch/arm/mach-versatile/include/mach/hardware.h +++ b/arch/arm/mach-versatile/include/mach/hardware.h @@ -29,8 +29,9 @@   */  #define VERSATILE_PCI_VIRT_BASE		(void __iomem *)0xe8000000ul  #define VERSATILE_PCI_CFG_VIRT_BASE	(void __iomem *)0xe9000000ul +#define VERSATILE_PCI_VIRT_MEM_BASE0	(void __iomem *)PCIO_BASE -/* macro to get at IO space when running virtually */ +/* macro to get at MMIO space when running virtually */  #define IO_ADDRESS(x)		(((x) & 0x0fffffff) + (((x) >> 4) & 0x0f000000) + 0xf0000000)  #define __io_address(n)		((void __iomem __force *)IO_ADDRESS(n)) diff --git a/arch/arm/mach-versatile/include/mach/io.h b/arch/arm/mach-versatile/include/mach/io.h new file mode 100644 index 00000000000..0406513be7d --- /dev/null +++ b/arch/arm/mach-versatile/include/mach/io.h @@ -0,0 +1,27 @@ +/* + *  arch/arm/mach-versatile/include/mach/io.h + * + *  Copyright (C) 2003 ARM Limited + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA + */ +#ifndef __ASM_ARM_ARCH_IO_H +#define __ASM_ARM_ARCH_IO_H + +#define PCIO_BASE	0xeb000000ul + +#define __io(a)		((a) + PCIO_BASE) + +#endif diff --git a/arch/arm/mach-versatile/pci.c b/arch/arm/mach-versatile/pci.c index 15c6a00000e..bec933b04ef 100644 --- a/arch/arm/mach-versatile/pci.c +++ b/arch/arm/mach-versatile/pci.c @@ -169,11 +169,18 @@ static struct pci_ops pci_versatile_ops = {  	.write	= versatile_write_config,  }; +static struct resource io_port = { +	.name	= "PCI", +	.start	= 0, +	.end	= IO_SPACE_LIMIT, +	.flags	= IORESOURCE_IO, +}; +  static struct resource io_mem = {  	.name	= "PCI I/O space",  	.start	= VERSATILE_PCI_MEM_BASE0,  	.end	= VERSATILE_PCI_MEM_BASE0+VERSATILE_PCI_MEM_BASE0_SIZE-1, -	.flags	= IORESOURCE_IO, +	.flags	= IORESOURCE_MEM,  };  static struct resource non_mem = { @@ -200,6 +207,12 @@ static int __init pci_versatile_setup_resources(struct pci_sys_data *sys)  		       "memory region (%d)\n", ret);  		goto out;  	} +	ret = request_resource(&ioport_resource, &io_port); +	if (ret) { +		printk(KERN_ERR "PCI: unable to allocate I/O " +		       "port region (%d)\n", ret); +		goto out; +	}  	ret = request_resource(&iomem_resource, &non_mem);  	if (ret) {  		printk(KERN_ERR "PCI: unable to allocate non-prefetchable " @@ -218,7 +231,7 @@ static int __init pci_versatile_setup_resources(struct pci_sys_data *sys)  	 * the mem resource for this bus  	 * the prefetch mem resource for this bus  	 */ -	pci_add_resource_offset(&sys->resources, &io_mem, sys->io_offset); +	pci_add_resource_offset(&sys->resources, &io_port, sys->io_offset);  	pci_add_resource_offset(&sys->resources, &non_mem, sys->mem_offset);  	pci_add_resource_offset(&sys->resources, &pre_mem, sys->mem_offset); @@ -249,6 +262,7 @@ int __init pci_versatile_setup(int nr, struct pci_sys_data *sys)  	if (nr == 0) {  		sys->mem_offset = 0; +		sys->io_offset = 0;  		ret = pci_versatile_setup_resources(sys);  		if (ret < 0) {  			printk("pci_versatile_setup: resources... oops?\n"); diff --git a/arch/arm/net/bpf_jit_32.c b/arch/arm/net/bpf_jit_32.c index 62135849f48..c641fb68501 100644 --- a/arch/arm/net/bpf_jit_32.c +++ b/arch/arm/net/bpf_jit_32.c @@ -762,6 +762,11 @@ b_epilogue:  			update_on_xread(ctx);  			emit(ARM_MOV_R(r_A, r_X), ctx);  			break; +		case BPF_S_ANC_ALU_XOR_X: +			/* A ^= X */ +			update_on_xread(ctx); +			emit(ARM_EOR_R(r_A, r_A, r_X), ctx); +			break;  		case BPF_S_ANC_PROTOCOL:  			/* A = ntohs(skb->protocol) */  			ctx->seen |= SEEN_SKB; diff --git a/arch/arm/net/bpf_jit_32.h b/arch/arm/net/bpf_jit_32.h index 99ae5e3f46d..7fa2f7d3cb9 100644 --- a/arch/arm/net/bpf_jit_32.h +++ b/arch/arm/net/bpf_jit_32.h @@ -68,6 +68,8 @@  #define ARM_INST_CMP_R		0x01500000  #define ARM_INST_CMP_I		0x03500000 +#define ARM_INST_EOR_R		0x00200000 +  #define ARM_INST_LDRB_I		0x05d00000  #define ARM_INST_LDRB_R		0x07d00000  #define ARM_INST_LDRH_I		0x01d000b0 @@ -132,6 +134,8 @@  #define ARM_CMP_R(rn, rm)	_AL3_R(ARM_INST_CMP, 0, rn, rm)  #define ARM_CMP_I(rn, imm)	_AL3_I(ARM_INST_CMP, 0, rn, imm) +#define ARM_EOR_R(rd, rn, rm)	_AL3_R(ARM_INST_EOR, rd, rn, rm) +  #define ARM_LDR_I(rt, rn, off)	(ARM_INST_LDR_I | (rt) << 12 | (rn) << 16 \  				 | (off))  #define ARM_LDRB_I(rt, rn, off)	(ARM_INST_LDRB_I | (rt) << 12 | (rn) << 16 \ diff --git a/arch/arm/plat-mxc/epit.c b/arch/arm/plat-mxc/epit.c index 9129c9e7d53..88726f4dbbf 100644 --- a/arch/arm/plat-mxc/epit.c +++ b/arch/arm/plat-mxc/epit.c @@ -50,6 +50,7 @@  #include <linux/irq.h>  #include <linux/clockchips.h>  #include <linux/clk.h> +#include <linux/err.h>  #include <mach/hardware.h>  #include <asm/mach/time.h> @@ -201,8 +202,16 @@ static int __init epit_clockevent_init(struct clk *timer_clk)  	return 0;  } -void __init epit_timer_init(struct clk *timer_clk, void __iomem *base, int irq) +void __init epit_timer_init(void __iomem *base, int irq)  { +	struct clk *timer_clk; + +	timer_clk = clk_get_sys("imx-epit.0", NULL); +	if (IS_ERR(timer_clk)) { +		pr_err("i.MX epit: unable to get clk\n"); +		return; +	} +  	clk_prepare_enable(timer_clk);  	timer_base = base; diff --git a/arch/arm/plat-mxc/include/mach/common.h b/arch/arm/plat-mxc/include/mach/common.h index cf663d84e7c..e429ca1b814 100644 --- a/arch/arm/plat-mxc/include/mach/common.h +++ b/arch/arm/plat-mxc/include/mach/common.h @@ -54,8 +54,8 @@ extern void imx50_soc_init(void);  extern void imx51_soc_init(void);  extern void imx53_soc_init(void);  extern void imx51_init_late(void); -extern void epit_timer_init(struct clk *timer_clk, void __iomem *base, int irq); -extern void mxc_timer_init(struct clk *timer_clk, void __iomem *, int); +extern void epit_timer_init(void __iomem *base, int irq); +extern void mxc_timer_init(void __iomem *, int);  extern int mx1_clocks_init(unsigned long fref);  extern int mx21_clocks_init(unsigned long lref, unsigned long fref);  extern int mx25_clocks_init(void); diff --git a/arch/arm/plat-mxc/time.c b/arch/arm/plat-mxc/time.c index 99f958ca6cb..00e8e659e66 100644 --- a/arch/arm/plat-mxc/time.c +++ b/arch/arm/plat-mxc/time.c @@ -58,6 +58,7 @@  /* MX31, MX35, MX25, MX5 */  #define V2_TCTL_WAITEN		(1 << 3) /* Wait enable mode */  #define V2_TCTL_CLK_IPG		(1 << 6) +#define V2_TCTL_CLK_PER		(2 << 6)  #define V2_TCTL_FRR		(1 << 9)  #define V2_IR			0x0c  #define V2_TSTAT		0x08 @@ -280,23 +281,22 @@ static int __init mxc_clockevent_init(struct clk *timer_clk)  	return 0;  } -void __init mxc_timer_init(struct clk *timer_clk, void __iomem *base, int irq) +void __init mxc_timer_init(void __iomem *base, int irq)  {  	uint32_t tctl_val; +	struct clk *timer_clk;  	struct clk *timer_ipg_clk; -	if (!timer_clk) { -		timer_clk = clk_get_sys("imx-gpt.0", "per"); -		if (IS_ERR(timer_clk)) { -			pr_err("i.MX timer: unable to get clk\n"); -			return; -		} - -		timer_ipg_clk = clk_get_sys("imx-gpt.0", "ipg"); -		if (!IS_ERR(timer_ipg_clk)) -			clk_prepare_enable(timer_ipg_clk); +	timer_clk = clk_get_sys("imx-gpt.0", "per"); +	if (IS_ERR(timer_clk)) { +		pr_err("i.MX timer: unable to get clk\n"); +		return;  	} +	timer_ipg_clk = clk_get_sys("imx-gpt.0", "ipg"); +	if (!IS_ERR(timer_ipg_clk)) +		clk_prepare_enable(timer_ipg_clk); +  	clk_prepare_enable(timer_clk);  	timer_base = base; @@ -309,7 +309,7 @@ void __init mxc_timer_init(struct clk *timer_clk, void __iomem *base, int irq)  	__raw_writel(0, timer_base + MXC_TPRER); /* see datasheet note */  	if (timer_is_v2()) -		tctl_val = V2_TCTL_CLK_IPG | V2_TCTL_FRR | V2_TCTL_WAITEN | MXC_TCTL_TEN; +		tctl_val = V2_TCTL_CLK_PER | V2_TCTL_FRR | V2_TCTL_WAITEN | MXC_TCTL_TEN;  	else  		tctl_val = MX1_2_TCTL_FRR | MX1_2_TCTL_CLK_PCLK1 | MXC_TCTL_TEN; diff --git a/arch/arm/plat-omap/clock.c b/arch/arm/plat-omap/clock.c index 62ec5c45279..706b7e29397 100644 --- a/arch/arm/plat-omap/clock.c +++ b/arch/arm/plat-omap/clock.c @@ -461,6 +461,7 @@ static int clk_dbg_show_summary(struct seq_file *s, void *unused)  	struct clk *c;  	struct clk *pa; +	mutex_lock(&clocks_mutex);  	seq_printf(s, "%-30s %-30s %-10s %s\n",  		"clock-name", "parent-name", "rate", "use-count"); @@ -469,6 +470,7 @@ static int clk_dbg_show_summary(struct seq_file *s, void *unused)  		seq_printf(s, "%-30s %-30s %-10lu %d\n",  			c->name, pa ? pa->name : "none", c->rate, c->usecount);  	} +	mutex_unlock(&clocks_mutex);  	return 0;  } diff --git a/arch/arm/plat-omap/include/plat/cpu.h b/arch/arm/plat-omap/include/plat/cpu.h index e79e913d95d..430081ac0c4 100644 --- a/arch/arm/plat-omap/include/plat/cpu.h +++ b/arch/arm/plat-omap/include/plat/cpu.h @@ -250,8 +250,6 @@ IS_AM_SUBCLASS(335x, 0x335)   * cpu_is_omap2423():	True for OMAP2423   * cpu_is_omap2430():	True for OMAP2430   * cpu_is_omap3430():	True for OMAP3430 - * cpu_is_omap3505():	True for OMAP3505 - * cpu_is_omap3517():	True for OMAP3517   */  #define GET_OMAP_TYPE	((omap_rev() >> 16) & 0xffff) @@ -273,8 +271,6 @@ IS_OMAP_TYPE(2422, 0x2422)  IS_OMAP_TYPE(2423, 0x2423)  IS_OMAP_TYPE(2430, 0x2430)  IS_OMAP_TYPE(3430, 0x3430) -IS_OMAP_TYPE(3505, 0x3517) -IS_OMAP_TYPE(3517, 0x3517)  #define cpu_is_omap310()		0  #define cpu_is_omap1510()		0 @@ -287,12 +283,6 @@ IS_OMAP_TYPE(3517, 0x3517)  #define cpu_is_omap2422()		0  #define cpu_is_omap2423()		0  #define cpu_is_omap2430()		0 -#define cpu_is_omap3503()		0 -#define cpu_is_omap3515()		0 -#define cpu_is_omap3525()		0 -#define cpu_is_omap3530()		0 -#define cpu_is_omap3505()		0 -#define cpu_is_omap3517()		0  #define cpu_is_omap3430()		0  #define cpu_is_omap3630()		0 @@ -334,12 +324,6 @@ IS_OMAP_TYPE(3517, 0x3517)  #if defined(CONFIG_ARCH_OMAP3)  # undef cpu_is_omap3430 -# undef cpu_is_omap3503 -# undef cpu_is_omap3515 -# undef cpu_is_omap3525 -# undef cpu_is_omap3530 -# undef cpu_is_omap3505 -# undef cpu_is_omap3517  # undef cpu_is_ti81xx  # undef cpu_is_ti816x  # undef cpu_is_ti814x @@ -347,19 +331,6 @@ IS_OMAP_TYPE(3517, 0x3517)  # undef cpu_is_am33xx  # undef cpu_is_am335x  # define cpu_is_omap3430()		is_omap3430() -# define cpu_is_omap3503()		(cpu_is_omap3430() &&		\ -						(!omap3_has_iva()) &&	\ -						(!omap3_has_sgx())) -# define cpu_is_omap3515()		(cpu_is_omap3430() &&		\ -						(!omap3_has_iva()) &&	\ -						(omap3_has_sgx())) -# define cpu_is_omap3525()		(cpu_is_omap3430() &&		\ -						(!omap3_has_sgx()) &&	\ -						(omap3_has_iva())) -# define cpu_is_omap3530()		(cpu_is_omap3430()) -# define cpu_is_omap3517()		is_omap3517() -# define cpu_is_omap3505()		(cpu_is_omap3517() &&		\ -						!omap3_has_sgx())  # undef cpu_is_omap3630  # define cpu_is_omap3630()		is_omap363x()  # define cpu_is_ti81xx()		is_ti81xx() @@ -408,10 +379,6 @@ IS_OMAP_TYPE(3517, 0x3517)  #define OMAP3630_REV_ES1_1	(OMAP363X_CLASS | (0x1 << 8))  #define OMAP3630_REV_ES1_2	(OMAP363X_CLASS | (0x2 << 8)) -#define OMAP3517_CLASS		0x35170034 -#define OMAP3517_REV_ES1_0	OMAP3517_CLASS -#define OMAP3517_REV_ES1_1	(OMAP3517_CLASS | (0x1 << 8)) -  #define TI816X_CLASS		0x81600034  #define TI8168_REV_ES1_0	TI816X_CLASS  #define TI8168_REV_ES1_1	(TI816X_CLASS | (0x1 << 8)) diff --git a/arch/arm/plat-omap/include/plat/mmc.h b/arch/arm/plat-omap/include/plat/mmc.h index a7754a886d4..5493bd95da5 100644 --- a/arch/arm/plat-omap/include/plat/mmc.h +++ b/arch/arm/plat-omap/include/plat/mmc.h @@ -172,8 +172,7 @@ struct omap_mmc_platform_data {  extern void omap_mmc_notify_cover_event(struct device *dev, int slot,  					int is_closed); -#if	defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) || \ -	defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE) +#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE)  void omap1_init_mmc(struct omap_mmc_platform_data **mmc_data,  				int nr_controllers);  void omap242x_init_mmc(struct omap_mmc_platform_data **mmc_data); @@ -185,7 +184,6 @@ static inline void omap1_init_mmc(struct omap_mmc_platform_data **mmc_data,  static inline void omap242x_init_mmc(struct omap_mmc_platform_data **mmc_data)  {  } -  #endif  extern int omap_msdi_reset(struct omap_hwmod *oh); diff --git a/arch/arm/plat-orion/common.c b/arch/arm/plat-orion/common.c index 61fd837624a..c1793786aea 100644 --- a/arch/arm/plat-orion/common.c +++ b/arch/arm/plat-orion/common.c @@ -582,7 +582,7 @@ void __init orion_spi_1_init(unsigned long mapbase)   * Watchdog   ****************************************************************************/  static struct resource orion_wdt_resource = -		DEFINE_RES_MEM(TIMER_VIRT_BASE, 0x28); +		DEFINE_RES_MEM(TIMER_PHYS_BASE, 0x28);  static struct platform_device orion_wdt_device = {  	.name		= "orion_wdt", diff --git a/arch/arm/plat-pxa/ssp.c b/arch/arm/plat-pxa/ssp.c index 58b79809d20..584c9bf8ed2 100644 --- a/arch/arm/plat-pxa/ssp.c +++ b/arch/arm/plat-pxa/ssp.c @@ -193,6 +193,7 @@ static const struct platform_device_id ssp_id_table[] = {  	{ "pxa25x-nssp",	PXA25x_NSSP },  	{ "pxa27x-ssp",		PXA27x_SSP },  	{ "pxa168-ssp",		PXA168_SSP }, +	{ "pxa910-ssp",		PXA910_SSP },  	{ },  }; diff --git a/arch/arm/plat-spear/include/plat/debug-macro.S b/arch/arm/plat-spear/include/plat/debug-macro.S index ab3de721c5d..75b05ad0fba 100644 --- a/arch/arm/plat-spear/include/plat/debug-macro.S +++ b/arch/arm/plat-spear/include/plat/debug-macro.S @@ -4,7 +4,7 @@   * Debugging macro include header for spear platform   *   * Copyright (C) 2009 ST Microelectronics - * Viresh Kumar<viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/plat-spear/include/plat/pl080.h b/arch/arm/plat-spear/include/plat/pl080.h index e14a3e4932f..2bc6b54460a 100644 --- a/arch/arm/plat-spear/include/plat/pl080.h +++ b/arch/arm/plat-spear/include/plat/pl080.h @@ -4,7 +4,7 @@   * DMAC pl080 definitions for SPEAr platform   *   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/plat-spear/include/plat/shirq.h b/arch/arm/plat-spear/include/plat/shirq.h index 03ed8b585dc..88a7fbd2479 100644 --- a/arch/arm/plat-spear/include/plat/shirq.h +++ b/arch/arm/plat-spear/include/plat/shirq.h @@ -4,7 +4,7 @@   * SPEAr platform shared irq layer header file   *   * Copyright (C) 2009 ST Microelectronics - * Viresh Kumar<viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/plat-spear/include/plat/timex.h b/arch/arm/plat-spear/include/plat/timex.h index 914d09dd50f..ef95e5b780b 100644 --- a/arch/arm/plat-spear/include/plat/timex.h +++ b/arch/arm/plat-spear/include/plat/timex.h @@ -4,7 +4,7 @@   * SPEAr platform specific timex definitions   *   * Copyright (C) 2009 ST Microelectronics - * Viresh Kumar<viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/plat-spear/include/plat/uncompress.h b/arch/arm/plat-spear/include/plat/uncompress.h index 6dd455bafdf..2ce6cb17a98 100644 --- a/arch/arm/plat-spear/include/plat/uncompress.h +++ b/arch/arm/plat-spear/include/plat/uncompress.h @@ -4,7 +4,7 @@   * Serial port stubs for kernel decompress status messages   *   * Copyright (C) 2009 ST Microelectronics - * Viresh Kumar<viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/plat-spear/pl080.c b/arch/arm/plat-spear/pl080.c index a56a067717c..12cf27f935f 100644 --- a/arch/arm/plat-spear/pl080.c +++ b/arch/arm/plat-spear/pl080.c @@ -4,7 +4,7 @@   * DMAC pl080 definitions for SPEAr platform   *   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/plat-spear/restart.c b/arch/arm/plat-spear/restart.c index ea0a61302b7..4f990115b1b 100644 --- a/arch/arm/plat-spear/restart.c +++ b/arch/arm/plat-spear/restart.c @@ -4,7 +4,7 @@   * SPEAr platform specific restart functions   *   * Copyright (C) 2009 ST Microelectronics - * Viresh Kumar<viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/arm/plat-spear/shirq.c b/arch/arm/plat-spear/shirq.c index 961fb726124..853e891e118 100644 --- a/arch/arm/plat-spear/shirq.c +++ b/arch/arm/plat-spear/shirq.c @@ -4,7 +4,7 @@   * SPEAr platform shared irq layer source file   *   * Copyright (C) 2009 ST Microelectronics - * Viresh Kumar<viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/arch/h8300/kernel/setup.c b/arch/h8300/kernel/setup.c index 68d651081bd..d0b1607f271 100644 --- a/arch/h8300/kernel/setup.c +++ b/arch/h8300/kernel/setup.c @@ -35,6 +35,7 @@  #include <asm/setup.h>  #include <asm/irq.h>  #include <asm/pgtable.h> +#include <asm/sections.h>  #if defined(__H8300H__)  #define CPU "H8/300H" @@ -54,7 +55,6 @@ unsigned long memory_end;  char __initdata command_line[COMMAND_LINE_SIZE]; -extern int _stext, _etext, _sdata, _edata, _sbss, _ebss, _end;  extern int _ramstart, _ramend;  extern char _target_name[];  extern void h8300_gpio_init(void); @@ -119,9 +119,9 @@ void __init setup_arch(char **cmdline_p)  	    memory_end = CONFIG_BLKDEV_RESERVE_ADDRESS;   #endif -	init_mm.start_code = (unsigned long) &_stext; -	init_mm.end_code = (unsigned long) &_etext; -	init_mm.end_data = (unsigned long) &_edata; +	init_mm.start_code = (unsigned long) _stext; +	init_mm.end_code = (unsigned long) _etext; +	init_mm.end_data = (unsigned long) _edata;  	init_mm.brk = (unsigned long) 0;   #if (defined(CONFIG_H8300H_SIM) || defined(CONFIG_H8S_SIM)) && defined(CONFIG_GDB_MAGICPRINT) @@ -134,15 +134,12 @@ void __init setup_arch(char **cmdline_p)  	printk(KERN_INFO "H8/300 series support by Yoshinori Sato <ysato@users.sourceforge.jp>\n");  #ifdef DEBUG -	printk(KERN_DEBUG "KERNEL -> TEXT=0x%06x-0x%06x DATA=0x%06x-0x%06x " -		"BSS=0x%06x-0x%06x\n", (int) &_stext, (int) &_etext, -		(int) &_sdata, (int) &_edata, -		(int) &_sbss, (int) &_ebss); -	printk(KERN_DEBUG "KERNEL -> ROMFS=0x%06x-0x%06x MEM=0x%06x-0x%06x " -		"STACK=0x%06x-0x%06x\n", -	       (int) &_ebss, (int) memory_start, -		(int) memory_start, (int) memory_end, -		(int) memory_end, (int) &_ramend); +	printk(KERN_DEBUG "KERNEL -> TEXT=0x%p-0x%p DATA=0x%p-0x%p " +		"BSS=0x%p-0x%p\n", _stext, _etext, _sdata, _edata, __bss_start, +		__bss_stop); +	printk(KERN_DEBUG "KERNEL -> ROMFS=0x%p-0x%06lx MEM=0x%06lx-0x%06lx " +		"STACK=0x%06lx-0x%p\n", __bss_stop, memory_start, memory_start, +		memory_end, memory_end, &_ramend);  #endif  #ifdef CONFIG_DEFAULT_CMDLINE diff --git a/arch/h8300/mm/init.c b/arch/h8300/mm/init.c index 973369c32a9..981e25094b1 100644 --- a/arch/h8300/mm/init.c +++ b/arch/h8300/mm/init.c @@ -36,6 +36,7 @@  #include <asm/segment.h>  #include <asm/page.h>  #include <asm/pgtable.h> +#include <asm/sections.h>  #undef DEBUG @@ -123,7 +124,6 @@ void __init mem_init(void)  	int codek = 0, datak = 0, initk = 0;  	/* DAVIDM look at setup memory map generically with reserved area */  	unsigned long tmp; -	extern char _etext, _stext, _sdata, _ebss, __init_begin, __init_end;  	extern unsigned long  _ramend, _ramstart;  	unsigned long len = &_ramend - &_ramstart;  	unsigned long start_mem = memory_start; /* DAVIDM - these must start at end of kernel */ @@ -142,9 +142,9 @@ void __init mem_init(void)  	/* this will put all memory onto the freelists */  	totalram_pages = free_all_bootmem(); -	codek = (&_etext - &_stext) >> 10; -	datak = (&_ebss - &_sdata) >> 10; -	initk = (&__init_begin - &__init_end) >> 10; +	codek = (_etext - _stext) >> 10; +	datak = (__bss_stop - _sdata) >> 10; +	initk = (__init_begin - __init_end) >> 10;  	tmp = nr_free_pages() << PAGE_SHIFT;  	printk(KERN_INFO "Memory available: %luk/%luk RAM, %luk/%luk ROM (%dk kernel code, %dk data)\n", @@ -178,22 +178,21 @@ free_initmem(void)  {  #ifdef CONFIG_RAMKERNEL  	unsigned long addr; -	extern char __init_begin, __init_end;  /*   *	the following code should be cool even if these sections   *	are not page aligned.   */ -	addr = PAGE_ALIGN((unsigned long)(&__init_begin)); +	addr = PAGE_ALIGN((unsigned long)(__init_begin));  	/* next to check that the page we free is not a partial page */ -	for (; addr + PAGE_SIZE < (unsigned long)(&__init_end); addr +=PAGE_SIZE) { +	for (; addr + PAGE_SIZE < (unsigned long)__init_end; addr +=PAGE_SIZE) {  		ClearPageReserved(virt_to_page(addr));  		init_page_count(virt_to_page(addr));  		free_page(addr);  		totalram_pages++;  	}  	printk(KERN_INFO "Freeing unused kernel memory: %ldk freed (0x%x - 0x%x)\n", -			(addr - PAGE_ALIGN((long) &__init_begin)) >> 10, -			(int)(PAGE_ALIGN((unsigned long)(&__init_begin))), +			(addr - PAGE_ALIGN((long) __init_begin)) >> 10, +			(int)(PAGE_ALIGN((unsigned long)__init_begin)),  			(int)(addr - PAGE_SIZE));  #endif  } diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c index c6af1d62383..3abe1b86e58 100644 --- a/arch/powerpc/kvm/book3s_hv.c +++ b/arch/powerpc/kvm/book3s_hv.c @@ -268,24 +268,45 @@ static unsigned long do_h_register_vpa(struct kvm_vcpu *vcpu,  	return err;  } -static void kvmppc_update_vpa(struct kvm *kvm, struct kvmppc_vpa *vpap) +static void kvmppc_update_vpa(struct kvm_vcpu *vcpu, struct kvmppc_vpa *vpap)  { +	struct kvm *kvm = vcpu->kvm;  	void *va;  	unsigned long nb; +	unsigned long gpa; -	vpap->update_pending = 0; -	va = NULL; -	if (vpap->next_gpa) { -		va = kvmppc_pin_guest_page(kvm, vpap->next_gpa, &nb); -		if (nb < vpap->len) { -			/* -			 * If it's now too short, it must be that userspace -			 * has changed the mappings underlying guest memory, -			 * so unregister the region. -			 */ +	/* +	 * We need to pin the page pointed to by vpap->next_gpa, +	 * but we can't call kvmppc_pin_guest_page under the lock +	 * as it does get_user_pages() and down_read().  So we +	 * have to drop the lock, pin the page, then get the lock +	 * again and check that a new area didn't get registered +	 * in the meantime. +	 */ +	for (;;) { +		gpa = vpap->next_gpa; +		spin_unlock(&vcpu->arch.vpa_update_lock); +		va = NULL; +		nb = 0; +		if (gpa) +			va = kvmppc_pin_guest_page(kvm, vpap->next_gpa, &nb); +		spin_lock(&vcpu->arch.vpa_update_lock); +		if (gpa == vpap->next_gpa) +			break; +		/* sigh... unpin that one and try again */ +		if (va)  			kvmppc_unpin_guest_page(kvm, va); -			va = NULL; -		} +	} + +	vpap->update_pending = 0; +	if (va && nb < vpap->len) { +		/* +		 * If it's now too short, it must be that userspace +		 * has changed the mappings underlying guest memory, +		 * so unregister the region. +		 */ +		kvmppc_unpin_guest_page(kvm, va); +		va = NULL;  	}  	if (vpap->pinned_addr)  		kvmppc_unpin_guest_page(kvm, vpap->pinned_addr); @@ -296,20 +317,18 @@ static void kvmppc_update_vpa(struct kvm *kvm, struct kvmppc_vpa *vpap)  static void kvmppc_update_vpas(struct kvm_vcpu *vcpu)  { -	struct kvm *kvm = vcpu->kvm; -  	spin_lock(&vcpu->arch.vpa_update_lock);  	if (vcpu->arch.vpa.update_pending) { -		kvmppc_update_vpa(kvm, &vcpu->arch.vpa); +		kvmppc_update_vpa(vcpu, &vcpu->arch.vpa);  		init_vpa(vcpu, vcpu->arch.vpa.pinned_addr);  	}  	if (vcpu->arch.dtl.update_pending) { -		kvmppc_update_vpa(kvm, &vcpu->arch.dtl); +		kvmppc_update_vpa(vcpu, &vcpu->arch.dtl);  		vcpu->arch.dtl_ptr = vcpu->arch.dtl.pinned_addr;  		vcpu->arch.dtl_index = 0;  	}  	if (vcpu->arch.slb_shadow.update_pending) -		kvmppc_update_vpa(kvm, &vcpu->arch.slb_shadow); +		kvmppc_update_vpa(vcpu, &vcpu->arch.slb_shadow);  	spin_unlock(&vcpu->arch.vpa_update_lock);  } @@ -800,12 +819,39 @@ static int kvmppc_run_core(struct kvmppc_vcore *vc)  	struct kvm_vcpu *vcpu, *vcpu0, *vnext;  	long ret;  	u64 now; -	int ptid, i; +	int ptid, i, need_vpa_update;  	/* don't start if any threads have a signal pending */ -	list_for_each_entry(vcpu, &vc->runnable_threads, arch.run_list) +	need_vpa_update = 0; +	list_for_each_entry(vcpu, &vc->runnable_threads, arch.run_list) {  		if (signal_pending(vcpu->arch.run_task))  			return 0; +		need_vpa_update |= vcpu->arch.vpa.update_pending | +			vcpu->arch.slb_shadow.update_pending | +			vcpu->arch.dtl.update_pending; +	} + +	/* +	 * Initialize *vc, in particular vc->vcore_state, so we can +	 * drop the vcore lock if necessary. +	 */ +	vc->n_woken = 0; +	vc->nap_count = 0; +	vc->entry_exit_count = 0; +	vc->vcore_state = VCORE_RUNNING; +	vc->in_guest = 0; +	vc->napping_threads = 0; + +	/* +	 * Updating any of the vpas requires calling kvmppc_pin_guest_page, +	 * which can't be called with any spinlocks held. +	 */ +	if (need_vpa_update) { +		spin_unlock(&vc->lock); +		list_for_each_entry(vcpu, &vc->runnable_threads, arch.run_list) +			kvmppc_update_vpas(vcpu); +		spin_lock(&vc->lock); +	}  	/*  	 * Make sure we are running on thread 0, and that @@ -838,20 +884,10 @@ static int kvmppc_run_core(struct kvmppc_vcore *vc)  		if (vcpu->arch.ceded)  			vcpu->arch.ptid = ptid++; -	vc->n_woken = 0; -	vc->nap_count = 0; -	vc->entry_exit_count = 0; -	vc->vcore_state = VCORE_RUNNING;  	vc->stolen_tb += mftb() - vc->preempt_tb; -	vc->in_guest = 0;  	vc->pcpu = smp_processor_id(); -	vc->napping_threads = 0;  	list_for_each_entry(vcpu, &vc->runnable_threads, arch.run_list) {  		kvmppc_start_thread(vcpu); -		if (vcpu->arch.vpa.update_pending || -		    vcpu->arch.slb_shadow.update_pending || -		    vcpu->arch.dtl.update_pending) -			kvmppc_update_vpas(vcpu);  		kvmppc_create_dtl_entry(vcpu, vc);  	}  	/* Grab any remaining hw threads so they can't go into the kernel */ diff --git a/arch/powerpc/platforms/pseries/nvram.c b/arch/powerpc/platforms/pseries/nvram.c index 36f957f3184..8733a86ad52 100644 --- a/arch/powerpc/platforms/pseries/nvram.c +++ b/arch/powerpc/platforms/pseries/nvram.c @@ -68,9 +68,7 @@ static const char *pseries_nvram_os_partitions[] = {  };  static void oops_to_nvram(struct kmsg_dumper *dumper, -		enum kmsg_dump_reason reason, -		const char *old_msgs, unsigned long old_len, -		const char *new_msgs, unsigned long new_len); +			  enum kmsg_dump_reason reason);  static struct kmsg_dumper nvram_kmsg_dumper = {  	.dump = oops_to_nvram @@ -504,28 +502,6 @@ int __init pSeries_nvram_init(void)  }  /* - * Try to capture the last capture_len bytes of the printk buffer.  Return - * the amount actually captured. - */ -static size_t capture_last_msgs(const char *old_msgs, size_t old_len, -				const char *new_msgs, size_t new_len, -				char *captured, size_t capture_len) -{ -	if (new_len >= capture_len) { -		memcpy(captured, new_msgs + (new_len - capture_len), -								capture_len); -		return capture_len; -	} else { -		/* Grab the end of old_msgs. */ -		size_t old_tail_len = min(old_len, capture_len - new_len); -		memcpy(captured, old_msgs + (old_len - old_tail_len), -								old_tail_len); -		memcpy(captured + old_tail_len, new_msgs, new_len); -		return old_tail_len + new_len; -	} -} - -/*   * Are we using the ibm,rtas-log for oops/panic reports?  And if so,   * would logging this oops/panic overwrite an RTAS event that rtas_errd   * hasn't had a chance to read and process?  Return 1 if so, else 0. @@ -541,27 +517,6 @@ static int clobbering_unread_rtas_event(void)  						NVRAM_RTAS_READ_TIMEOUT);  } -/* Squeeze out each line's <n> severity prefix. */ -static size_t elide_severities(char *buf, size_t len) -{ -	char *in, *out, *buf_end = buf + len; -	/* Assume a <n> at the very beginning marks the start of a line. */ -	int newline = 1; - -	in = out = buf; -	while (in < buf_end) { -		if (newline && in+3 <= buf_end && -				*in == '<' && isdigit(in[1]) && in[2] == '>') { -			in += 3; -			newline = 0; -		} else { -			newline = (*in == '\n'); -			*out++ = *in++; -		} -	} -	return out - buf; -} -  /* Derived from logfs_compress() */  static int nvram_compress(const void *in, void *out, size_t inlen,  							size_t outlen) @@ -619,9 +574,7 @@ static int zip_oops(size_t text_len)   * partition.  If that's too much, go back and capture uncompressed text.   */  static void oops_to_nvram(struct kmsg_dumper *dumper, -		enum kmsg_dump_reason reason, -		const char *old_msgs, unsigned long old_len, -		const char *new_msgs, unsigned long new_len) +			  enum kmsg_dump_reason reason)  {  	static unsigned int oops_count = 0;  	static bool panicking = false; @@ -660,14 +613,14 @@ static void oops_to_nvram(struct kmsg_dumper *dumper,  		return;  	if (big_oops_buf) { -		text_len = capture_last_msgs(old_msgs, old_len, -			new_msgs, new_len, big_oops_buf, big_oops_buf_sz); -		text_len = elide_severities(big_oops_buf, text_len); +		kmsg_dump_get_buffer(dumper, false, +				     big_oops_buf, big_oops_buf_sz, &text_len);  		rc = zip_oops(text_len);  	}  	if (rc != 0) { -		text_len = capture_last_msgs(old_msgs, old_len, -				new_msgs, new_len, oops_data, oops_data_sz); +		kmsg_dump_rewind(dumper); +		kmsg_dump_get_buffer(dumper, true, +				     oops_data, oops_data_sz, &text_len);  		err_type = ERR_TYPE_KERNEL_PANIC;  		*oops_len = (u16) text_len;  	} diff --git a/arch/sparc/kernel/vio.c b/arch/sparc/kernel/vio.c index 5cffdc55f07..3e244f31e56 100644 --- a/arch/sparc/kernel/vio.c +++ b/arch/sparc/kernel/vio.c @@ -443,7 +443,7 @@ static int __init vio_init(void)  	root_vdev = vio_create_one(hp, root, NULL);  	err = -ENODEV;  	if (!root_vdev) { -		printk(KERN_ERR "VIO: Coult not create root device.\n"); +		printk(KERN_ERR "VIO: Could not create root device.\n");  		goto out_release;  	} diff --git a/arch/x86/include/asm/pgtable-3level.h b/arch/x86/include/asm/pgtable-3level.h index 43876f16caf..cb00ccc7d57 100644 --- a/arch/x86/include/asm/pgtable-3level.h +++ b/arch/x86/include/asm/pgtable-3level.h @@ -47,16 +47,26 @@ static inline void native_set_pte(pte_t *ptep, pte_t pte)   * they can run pmd_offset_map_lock or pmd_trans_huge or other pmd   * operations.   * - * Without THP if the mmap_sem is hold for reading, the - * pmd can only transition from null to not null while pmd_read_atomic runs. - * So there's no need of literally reading it atomically. + * Without THP if the mmap_sem is hold for reading, the pmd can only + * transition from null to not null while pmd_read_atomic runs. So + * we can always return atomic pmd values with this function.   *   * With THP if the mmap_sem is hold for reading, the pmd can become - * THP or null or point to a pte (and in turn become "stable") at any - * time under pmd_read_atomic, so it's mandatory to read it atomically - * with cmpxchg8b. + * trans_huge or none or point to a pte (and in turn become "stable") + * at any time under pmd_read_atomic. We could read it really + * atomically here with a atomic64_read for the THP enabled case (and + * it would be a whole lot simpler), but to avoid using cmpxchg8b we + * only return an atomic pmdval if the low part of the pmdval is later + * found stable (i.e. pointing to a pte). And we're returning a none + * pmdval if the low part of the pmd is none. In some cases the high + * and low part of the pmdval returned may not be consistent if THP is + * enabled (the low part may point to previously mapped hugepage, + * while the high part may point to a more recently mapped hugepage), + * but pmd_none_or_trans_huge_or_clear_bad() only needs the low part + * of the pmd to be read atomically to decide if the pmd is unstable + * or not, with the only exception of when the low part of the pmd is + * zero in which case we return a none pmd.   */ -#ifndef CONFIG_TRANSPARENT_HUGEPAGE  static inline pmd_t pmd_read_atomic(pmd_t *pmdp)  {  	pmdval_t ret; @@ -74,12 +84,6 @@ static inline pmd_t pmd_read_atomic(pmd_t *pmdp)  	return (pmd_t) { ret };  } -#else /* CONFIG_TRANSPARENT_HUGEPAGE */ -static inline pmd_t pmd_read_atomic(pmd_t *pmdp) -{ -	return (pmd_t) { atomic64_read((atomic64_t *)pmdp) }; -} -#endif /* CONFIG_TRANSPARENT_HUGEPAGE */  static inline void native_set_pte_atomic(pte_t *ptep, pte_t pte)  { diff --git a/arch/x86/platform/mrst/early_printk_mrst.c b/arch/x86/platform/mrst/early_printk_mrst.c index 3c6e328483c..028454f0c3a 100644 --- a/arch/x86/platform/mrst/early_printk_mrst.c +++ b/arch/x86/platform/mrst/early_printk_mrst.c @@ -110,19 +110,16 @@ static struct kmsg_dumper dw_dumper;  static int dumper_registered;  static void dw_kmsg_dump(struct kmsg_dumper *dumper, -			enum kmsg_dump_reason reason, -			const char *s1, unsigned long l1, -			const char *s2, unsigned long l2) +			 enum kmsg_dump_reason reason)  { -	int i; +	static char line[1024]; +	size_t len;  	/* When run to this, we'd better re-init the HW */  	mrst_early_console_init(); -	for (i = 0; i < l1; i++) -		early_mrst_console.write(&early_mrst_console, s1 + i, 1); -	for (i = 0; i < l2; i++) -		early_mrst_console.write(&early_mrst_console, s2 + i, 1); +	while (kmsg_dump_get_line(dumper, true, line, sizeof(line), &len)) +		early_mrst_console.write(&early_mrst_console, line, len);  }  /* Set the ratio rate to 115200, 8n1, IRQ disabled */ diff --git a/arch/xtensa/Makefile b/arch/xtensa/Makefile index 7608559de93..f973754ddf9 100644 --- a/arch/xtensa/Makefile +++ b/arch/xtensa/Makefile @@ -68,8 +68,8 @@ endif  # Only build variant and/or platform if it includes a Makefile -buildvar := $(shell test -a $(srctree)/arch/xtensa/variants/$(VARIANT)/Makefile && echo arch/xtensa/variants/$(VARIANT)/) -buildplf := $(shell test -a $(srctree)/arch/xtensa/platforms/$(PLATFORM)/Makefile && echo arch/xtensa/platforms/$(PLATFORM)/) +buildvar := $(shell test -e $(srctree)/arch/xtensa/variants/$(VARIANT)/Makefile && echo arch/xtensa/variants/$(VARIANT)/) +buildplf := $(shell test -e $(srctree)/arch/xtensa/platforms/$(PLATFORM)/Makefile && echo arch/xtensa/platforms/$(PLATFORM)/)  # Find libgcc.a diff --git a/arch/xtensa/kernel/vmlinux.lds.S b/arch/xtensa/kernel/vmlinux.lds.S index 88ecea3facb..ee2e2089483 100644 --- a/arch/xtensa/kernel/vmlinux.lds.S +++ b/arch/xtensa/kernel/vmlinux.lds.S @@ -83,7 +83,6 @@ SECTIONS    _text = .;    _stext = .; -  _ftext = .;    .text :    { @@ -112,7 +111,7 @@ SECTIONS    EXCEPTION_TABLE(16)    /* Data section */ -  _fdata = .; +  _sdata = .;    RW_DATA_SECTION(XCHAL_ICACHE_LINESIZE, PAGE_SIZE, THREAD_SIZE)    _edata = .; diff --git a/arch/xtensa/mm/init.c b/arch/xtensa/mm/init.c index ba150e5de2e..db955179da2 100644 --- a/arch/xtensa/mm/init.c +++ b/arch/xtensa/mm/init.c @@ -26,11 +26,7 @@  #include <asm/bootparam.h>  #include <asm/page.h> - -/* References to section boundaries */ - -extern char _ftext, _etext, _fdata, _edata, _rodata_end; -extern char __init_begin, __init_end; +#include <asm/sections.h>  /*   * mem_reserve(start, end, must_exist) @@ -197,9 +193,9 @@ void __init mem_init(void)  			reservedpages++;  	} -	codesize =  (unsigned long) &_etext - (unsigned long) &_ftext; -	datasize =  (unsigned long) &_edata - (unsigned long) &_fdata; -	initsize =  (unsigned long) &__init_end - (unsigned long) &__init_begin; +	codesize =  (unsigned long) _etext - (unsigned long) _stext; +	datasize =  (unsigned long) _edata - (unsigned long) _sdata; +	initsize =  (unsigned long) __init_end - (unsigned long) __init_begin;  	printk("Memory: %luk/%luk available (%ldk kernel code, %ldk reserved, "  	       "%ldk data, %ldk init %ldk highmem)\n", @@ -237,7 +233,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)  void free_initmem(void)  { -	free_reserved_mem(&__init_begin, &__init_end); -	printk("Freeing unused kernel memory: %dk freed\n", -	       (&__init_end - &__init_begin) >> 10); +	free_reserved_mem(__init_begin, __init_end); +	printk("Freeing unused kernel memory: %zuk freed\n", +	       (__init_end - __init_begin) >> 10);  } diff --git a/drivers/ata/pata_arasan_cf.c b/drivers/ata/pata_arasan_cf.c index 3239517f4d9..ac6a5beb28f 100644 --- a/drivers/ata/pata_arasan_cf.c +++ b/drivers/ata/pata_arasan_cf.c @@ -4,7 +4,7 @@   * Arasan Compact Flash host controller source file   *   * Copyright (C) 2011 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any @@ -959,7 +959,7 @@ static struct platform_driver arasan_cf_driver = {  module_platform_driver(arasan_cf_driver); -MODULE_AUTHOR("Viresh Kumar <viresh.kumar@st.com>"); +MODULE_AUTHOR("Viresh Kumar <viresh.linux@gmail.com>");  MODULE_DESCRIPTION("Arasan ATA Compact Flash driver");  MODULE_LICENSE("GPL");  MODULE_ALIAS("platform:" DRIVER_NAME); diff --git a/drivers/base/dd.c b/drivers/base/dd.c index 1b1cbb571d3..dcb8a6e4869 100644 --- a/drivers/base/dd.c +++ b/drivers/base/dd.c @@ -100,7 +100,7 @@ static void driver_deferred_probe_add(struct device *dev)  	mutex_lock(&deferred_probe_mutex);  	if (list_empty(&dev->p->deferred_probe)) {  		dev_dbg(dev, "Added to deferred list\n"); -		list_add(&dev->p->deferred_probe, &deferred_probe_pending_list); +		list_add_tail(&dev->p->deferred_probe, &deferred_probe_pending_list);  	}  	mutex_unlock(&deferred_probe_mutex);  } diff --git a/drivers/char/hw_random/atmel-rng.c b/drivers/char/hw_random/atmel-rng.c index 6289f0eee24..731c9046cf7 100644 --- a/drivers/char/hw_random/atmel-rng.c +++ b/drivers/char/hw_random/atmel-rng.c @@ -34,7 +34,7 @@ static int atmel_trng_read(struct hwrng *rng, void *buf, size_t max,  	u32 *data = buf;  	/* data ready? */ -	if (readl(trng->base + TRNG_ODATA) & 1) { +	if (readl(trng->base + TRNG_ISR) & 1) {  		*data = readl(trng->base + TRNG_ODATA);  		/*  		  ensure data ready is only set again AFTER the next data diff --git a/drivers/clk/spear/clk-aux-synth.c b/drivers/clk/spear/clk-aux-synth.c index af34074e702..6756e7c3bc0 100644 --- a/drivers/clk/spear/clk-aux-synth.c +++ b/drivers/clk/spear/clk-aux-synth.c @@ -1,6 +1,6 @@  /*   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/drivers/clk/spear/clk-frac-synth.c b/drivers/clk/spear/clk-frac-synth.c index 4dbdb3fe18e..958aa3ad1d6 100644 --- a/drivers/clk/spear/clk-frac-synth.c +++ b/drivers/clk/spear/clk-frac-synth.c @@ -1,6 +1,6 @@  /*   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/drivers/clk/spear/clk-gpt-synth.c b/drivers/clk/spear/clk-gpt-synth.c index b471c9762a9..1afc18c4eff 100644 --- a/drivers/clk/spear/clk-gpt-synth.c +++ b/drivers/clk/spear/clk-gpt-synth.c @@ -1,6 +1,6 @@  /*   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/drivers/clk/spear/clk-vco-pll.c b/drivers/clk/spear/clk-vco-pll.c index dcd4bdf4b0d..5f1b6badeb1 100644 --- a/drivers/clk/spear/clk-vco-pll.c +++ b/drivers/clk/spear/clk-vco-pll.c @@ -1,6 +1,6 @@  /*   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/drivers/clk/spear/clk.c b/drivers/clk/spear/clk.c index 376d4e5ff32..7cd63788d54 100644 --- a/drivers/clk/spear/clk.c +++ b/drivers/clk/spear/clk.c @@ -1,6 +1,6 @@  /*   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/drivers/clk/spear/clk.h b/drivers/clk/spear/clk.h index 3321c46a071..931737677df 100644 --- a/drivers/clk/spear/clk.h +++ b/drivers/clk/spear/clk.h @@ -2,7 +2,7 @@   * Clock framework definitions for SPEAr platform   *   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/drivers/clk/spear/spear1310_clock.c b/drivers/clk/spear/spear1310_clock.c index 42b68df9aee..8f05652d53e 100644 --- a/drivers/clk/spear/spear1310_clock.c +++ b/drivers/clk/spear/spear1310_clock.c @@ -4,7 +4,7 @@   * SPEAr1310 machine clock framework source file   *   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/drivers/clk/spear/spear1340_clock.c b/drivers/clk/spear/spear1340_clock.c index f130919d5bf..e3ea7216223 100644 --- a/drivers/clk/spear/spear1340_clock.c +++ b/drivers/clk/spear/spear1340_clock.c @@ -4,7 +4,7 @@   * SPEAr1340 machine clock framework source file   *   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/drivers/clk/spear/spear3xx_clock.c b/drivers/clk/spear/spear3xx_clock.c index 440bb3e4c97..01dd6daff2a 100644 --- a/drivers/clk/spear/spear3xx_clock.c +++ b/drivers/clk/spear/spear3xx_clock.c @@ -2,7 +2,7 @@   * SPEAr3xx machines clock framework source file   *   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/drivers/clk/spear/spear6xx_clock.c b/drivers/clk/spear/spear6xx_clock.c index f9a20b38230..554d64b062a 100644 --- a/drivers/clk/spear/spear6xx_clock.c +++ b/drivers/clk/spear/spear6xx_clock.c @@ -2,7 +2,7 @@   * SPEAr6xx machines clock framework source file   *   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c index e23dc82d43a..72129615757 100644 --- a/drivers/dma/dw_dmac.c +++ b/drivers/dma/dw_dmac.c @@ -1626,4 +1626,4 @@ module_exit(dw_exit);  MODULE_LICENSE("GPL v2");  MODULE_DESCRIPTION("Synopsys DesignWare DMA Controller driver");  MODULE_AUTHOR("Haavard Skinnemoen (Atmel)"); -MODULE_AUTHOR("Viresh Kumar <viresh.kumar@st.com>"); +MODULE_AUTHOR("Viresh Kumar <viresh.linux@gmail.com>"); diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c index fb4f4990f5e..1dc2a4ad002 100644 --- a/drivers/dma/imx-sdma.c +++ b/drivers/dma/imx-sdma.c @@ -815,8 +815,6 @@ static int sdma_request_channel(struct sdma_channel *sdmac)  	init_completion(&sdmac->done); -	sdmac->buf_tail = 0; -  	return 0;  out: @@ -927,6 +925,8 @@ static struct dma_async_tx_descriptor *sdma_prep_slave_sg(  	sdmac->flags = 0; +	sdmac->buf_tail = 0; +  	dev_dbg(sdma->dev, "setting up %d entries for channel %d.\n",  			sg_len, channel); @@ -1027,6 +1027,8 @@ static struct dma_async_tx_descriptor *sdma_prep_dma_cyclic(  	sdmac->status = DMA_IN_PROGRESS; +	sdmac->buf_tail = 0; +  	sdmac->flags |= IMX_DMA_SG_LOOP;  	sdmac->direction = direction;  	ret = sdma_load_context(sdmac); diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c index cbcc28e79be..e4feba6b03c 100644 --- a/drivers/dma/pl330.c +++ b/drivers/dma/pl330.c @@ -392,6 +392,8 @@ struct pl330_req {  	struct pl330_reqcfg *cfg;  	/* Pointer to first xfer in the request. */  	struct pl330_xfer *x; +	/* Hook to attach to DMAC's list of reqs with due callback */ +	struct list_head rqd;  };  /* @@ -461,8 +463,6 @@ struct _pl330_req {  	/* Number of bytes taken to setup MC for the req */  	u32 mc_len;  	struct pl330_req *r; -	/* Hook to attach to DMAC's list of reqs with due callback */ -	struct list_head rqd;  };  /* ToBeDone for tasklet */ @@ -1683,7 +1683,7 @@ static void pl330_dotask(unsigned long data)  /* Returns 1 if state was updated, 0 otherwise */  static int pl330_update(const struct pl330_info *pi)  { -	struct _pl330_req *rqdone; +	struct pl330_req *rqdone, *tmp;  	struct pl330_dmac *pl330;  	unsigned long flags;  	void __iomem *regs; @@ -1750,7 +1750,10 @@ static int pl330_update(const struct pl330_info *pi)  			if (active == -1) /* Aborted */  				continue; -			rqdone = &thrd->req[active]; +			/* Detach the req */ +			rqdone = thrd->req[active].r; +			thrd->req[active].r = NULL; +  			mark_free(thrd, active);  			/* Get going again ASAP */ @@ -1762,20 +1765,11 @@ static int pl330_update(const struct pl330_info *pi)  	}  	/* Now that we are in no hurry, do the callbacks */ -	while (!list_empty(&pl330->req_done)) { -		struct pl330_req *r; - -		rqdone = container_of(pl330->req_done.next, -					struct _pl330_req, rqd); - -		list_del_init(&rqdone->rqd); - -		/* Detach the req */ -		r = rqdone->r; -		rqdone->r = NULL; +	list_for_each_entry_safe(rqdone, tmp, &pl330->req_done, rqd) { +		list_del(&rqdone->rqd);  		spin_unlock_irqrestore(&pl330->lock, flags); -		_callback(r, PL330_ERR_NONE); +		_callback(rqdone, PL330_ERR_NONE);  		spin_lock_irqsave(&pl330->lock, flags);  	} @@ -2321,7 +2315,7 @@ static void pl330_tasklet(unsigned long data)  	/* Pick up ripe tomatoes */  	list_for_each_entry_safe(desc, _dt, &pch->work_list, node)  		if (desc->status == DONE) { -			if (pch->cyclic) +			if (!pch->cyclic)  				dma_cookie_complete(&desc->txd);  			list_move_tail(&desc->node, &list);  		} @@ -2539,7 +2533,7 @@ static inline void _init_desc(struct dma_pl330_desc *desc)  }  /* Returns the number of descriptors added to the DMAC pool */ -int add_desc(struct dma_pl330_dmac *pdmac, gfp_t flg, int count) +static int add_desc(struct dma_pl330_dmac *pdmac, gfp_t flg, int count)  {  	struct dma_pl330_desc *desc;  	unsigned long flags; diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c index 10f375032e9..de5ba86e8b8 100644 --- a/drivers/edac/edac_mc.c +++ b/drivers/edac/edac_mc.c @@ -164,7 +164,7 @@ void *edac_align_ptr(void **p, unsigned size, int n_elems)  	else  		return (char *)ptr; -	r = size % align; +	r = (unsigned long)p % align;  	if (r == 0)  		return (char *)ptr; diff --git a/drivers/edac/i7core_edac.c b/drivers/edac/i7core_edac.c index d27778f65a5..a499c7ed820 100644 --- a/drivers/edac/i7core_edac.c +++ b/drivers/edac/i7core_edac.c @@ -1814,12 +1814,6 @@ static int i7core_mce_check_error(struct notifier_block *nb, unsigned long val,  	if (mce->bank != 8)  		return NOTIFY_DONE; -#ifdef CONFIG_SMP -	/* Only handle if it is the right mc controller */ -	if (mce->socketid != pvt->i7core_dev->socket) -		return NOTIFY_DONE; -#endif -  	smp_rmb();  	if ((pvt->mce_out + 1) % MCE_LOG_LEN == pvt->mce_in) {  		smp_wmb(); @@ -2116,8 +2110,6 @@ static void i7core_unregister_mci(struct i7core_dev *i7core_dev)  	if (pvt->enable_scrub)  		disable_sdram_scrub_setting(mci); -	mce_unregister_decode_chain(&i7_mce_dec); -  	/* Disable EDAC polling */  	i7core_pci_ctl_release(pvt); @@ -2222,8 +2214,6 @@ static int i7core_register_mci(struct i7core_dev *i7core_dev)  	/* DCLK for scrub rate setting */  	pvt->dclk_freq = get_dclk_freq(); -	mce_register_decode_chain(&i7_mce_dec); -  	return 0;  fail0: @@ -2367,8 +2357,10 @@ static int __init i7core_init(void)  	pci_rc = pci_register_driver(&i7core_driver); -	if (pci_rc >= 0) +	if (pci_rc >= 0) { +		mce_register_decode_chain(&i7_mce_dec);  		return 0; +	}  	i7core_printk(KERN_ERR, "Failed to register device with error %d.\n",  		      pci_rc); @@ -2384,6 +2376,7 @@ static void __exit i7core_exit(void)  {  	debugf2("MC: " __FILE__ ": %s()\n", __func__);  	pci_unregister_driver(&i7core_driver); +	mce_unregister_decode_chain(&i7_mce_dec);  }  module_init(i7core_init); diff --git a/drivers/edac/mpc85xx_edac.c b/drivers/edac/mpc85xx_edac.c index 4c402353ba9..0e374625f6f 100644 --- a/drivers/edac/mpc85xx_edac.c +++ b/drivers/edac/mpc85xx_edac.c @@ -980,7 +980,8 @@ static int __devinit mpc85xx_mc_err_probe(struct platform_device *op)  	layers[1].type = EDAC_MC_LAYER_CHANNEL;  	layers[1].size = 1;  	layers[1].is_virt_csrow = false; -	mci = edac_mc_alloc(edac_mc_idx, ARRAY_SIZE(layers), sizeof(*pdata)); +	mci = edac_mc_alloc(edac_mc_idx, ARRAY_SIZE(layers), layers, +			    sizeof(*pdata));  	if (!mci) {  		devres_release_group(&op->dev, mpc85xx_mc_err_probe);  		return -ENOMEM; diff --git a/drivers/edac/sb_edac.c b/drivers/edac/sb_edac.c index 4adaf4b7da9..36ad17e79d6 100644 --- a/drivers/edac/sb_edac.c +++ b/drivers/edac/sb_edac.c @@ -555,7 +555,7 @@ static int get_dimm_config(struct mem_ctl_info *mci)  		pvt->is_close_pg = false;  	} -	pci_read_config_dword(pvt->pci_ta, RANK_CFG_A, ®); +	pci_read_config_dword(pvt->pci_ddrio, RANK_CFG_A, ®);  	if (IS_RDIMM_ENABLED(reg)) {  		/* FIXME: Can also be LRDIMM */  		debugf0("Memory is registered\n"); @@ -1604,8 +1604,6 @@ static void sbridge_unregister_mci(struct sbridge_dev *sbridge_dev)  	debugf0("MC: " __FILE__ ": %s(): mci = %p, dev = %p\n",  		__func__, mci, &sbridge_dev->pdev[0]->dev); -	mce_unregister_decode_chain(&sbridge_mce_dec); -  	/* Remove MC sysfs nodes */  	edac_mc_del_mc(mci->dev); @@ -1682,7 +1680,6 @@ static int sbridge_register_mci(struct sbridge_dev *sbridge_dev)  		goto fail0;  	} -	mce_register_decode_chain(&sbridge_mce_dec);  	return 0;  fail0: @@ -1811,8 +1808,10 @@ static int __init sbridge_init(void)  	pci_rc = pci_register_driver(&sbridge_driver); -	if (pci_rc >= 0) +	if (pci_rc >= 0) { +		mce_register_decode_chain(&sbridge_mce_dec);  		return 0; +	}  	sbridge_printk(KERN_ERR, "Failed to register device with error %d.\n",  		      pci_rc); @@ -1828,6 +1827,7 @@ static void __exit sbridge_exit(void)  {  	debugf2("MC: " __FILE__ ": %s()\n", __func__);  	pci_unregister_driver(&sbridge_driver); +	mce_unregister_decode_chain(&sbridge_mce_dec);  }  module_init(sbridge_init); diff --git a/drivers/extcon/extcon-max8997.c b/drivers/extcon/extcon-max8997.c index 23416e44376..a4ed30bd9a4 100644 --- a/drivers/extcon/extcon-max8997.c +++ b/drivers/extcon/extcon-max8997.c @@ -116,8 +116,8 @@ const char *max8997_extcon_cable[] = {  	[5] = "Charge-downstream",  	[6] = "MHL",  	[7] = "Dock-desk", -	[7] = "Dock-card", -	[8] = "JIG", +	[8] = "Dock-card", +	[9] = "JIG",  	NULL,  }; @@ -514,6 +514,7 @@ static int __devexit max8997_muic_remove(struct platform_device *pdev)  	extcon_dev_unregister(info->edev); +	kfree(info->edev);  	kfree(info);  	return 0; diff --git a/drivers/extcon/extcon_class.c b/drivers/extcon/extcon_class.c index f598a700ec1..159aeb07b3b 100644 --- a/drivers/extcon/extcon_class.c +++ b/drivers/extcon/extcon_class.c @@ -762,7 +762,7 @@ int extcon_dev_register(struct extcon_dev *edev, struct device *dev)  #if defined(CONFIG_ANDROID)  	if (switch_class)  		ret = class_compat_create_link(switch_class, edev->dev, -					       dev); +					       NULL);  #endif /* CONFIG_ANDROID */  	spin_lock_init(&edev->lock); diff --git a/drivers/extcon/extcon_gpio.c b/drivers/extcon/extcon_gpio.c index fe7a07b4733..8a0dcc11c7c 100644 --- a/drivers/extcon/extcon_gpio.c +++ b/drivers/extcon/extcon_gpio.c @@ -125,6 +125,7 @@ static int __devinit gpio_extcon_probe(struct platform_device *pdev)  	if (ret < 0)  		goto err_request_irq; +	platform_set_drvdata(pdev, extcon_data);  	/* Perform initial detection */  	gpio_extcon_work(&extcon_data->work.work); @@ -146,6 +147,7 @@ static int __devexit gpio_extcon_remove(struct platform_device *pdev)  	struct gpio_extcon_data *extcon_data = platform_get_drvdata(pdev);  	cancel_delayed_work_sync(&extcon_data->work); +	free_irq(extcon_data->irq, extcon_data);  	gpio_free(extcon_data->gpio);  	extcon_dev_unregister(&extcon_data->edev);  	devm_kfree(&pdev->dev, extcon_data); diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index eb92fe257a3..5873e481e5d 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -610,7 +610,7 @@ static bool  drm_monitor_supports_rb(struct edid *edid)  {  	if (edid->revision >= 4) { -		bool ret; +		bool ret = false;  		drm_for_each_detailed_block((u8 *)edid, is_rb, &ret);  		return ret;  	} diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index e0aa064def3..a7c727d0c10 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -6558,7 +6558,7 @@ static void intel_setup_outputs(struct drm_device *dev)  		if (I915_READ(HDMIC) & PORT_DETECTED)  			intel_hdmi_init(dev, HDMIC); -		if (I915_READ(HDMID) & PORT_DETECTED) +		if (!dpd_is_edp && I915_READ(HDMID) & PORT_DETECTED)  			intel_hdmi_init(dev, HDMID);  		if (I915_READ(PCH_DP_C) & DP_DETECTED) diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 296cfc201a8..c0449324143 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c @@ -32,6 +32,7 @@  #include "drm.h"  #include "drm_crtc.h"  #include "drm_crtc_helper.h" +#include "drm_edid.h"  #include "intel_drv.h"  #include "i915_drm.h"  #include "i915_drv.h" @@ -67,6 +68,8 @@ struct intel_dp {  	struct drm_display_mode *panel_fixed_mode;  /* for eDP */  	struct delayed_work panel_vdd_work;  	bool want_panel_vdd; +	struct edid *edid; /* cached EDID for eDP */ +	int edid_mode_count;  };  /** @@ -371,7 +374,7 @@ intel_dp_aux_ch(struct intel_dp *intel_dp,  	int recv_bytes;  	uint32_t status;  	uint32_t aux_clock_divider; -	int try, precharge = 5; +	int try, precharge;  	intel_dp_check_edp(intel_dp);  	/* The clock divider is based off the hrawclk, @@ -391,6 +394,11 @@ intel_dp_aux_ch(struct intel_dp *intel_dp,  	else  		aux_clock_divider = intel_hrawclk(dev) / 2; +	if (IS_GEN6(dev)) +		precharge = 3; +	else +		precharge = 5; +  	/* Try to wait for any previous AUX channel activity */  	for (try = 0; try < 3; try++) {  		status = I915_READ(ch_ctl); @@ -1973,6 +1981,8 @@ intel_dp_probe_oui(struct intel_dp *intel_dp)  	if (!(intel_dp->dpcd[DP_DOWN_STREAM_PORT_COUNT] & DP_OUI_SUPPORT))  		return; +	ironlake_edp_panel_vdd_on(intel_dp); +  	if (intel_dp_aux_native_read_retry(intel_dp, DP_SINK_OUI, buf, 3))  		DRM_DEBUG_KMS("Sink OUI: %02hx%02hx%02hx\n",  			      buf[0], buf[1], buf[2]); @@ -1980,6 +1990,8 @@ intel_dp_probe_oui(struct intel_dp *intel_dp)  	if (intel_dp_aux_native_read_retry(intel_dp, DP_BRANCH_OUI, buf, 3))  		DRM_DEBUG_KMS("Branch OUI: %02hx%02hx%02hx\n",  			      buf[0], buf[1], buf[2]); + +	ironlake_edp_panel_vdd_off(intel_dp, false);  }  static bool @@ -2116,10 +2128,22 @@ intel_dp_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter)  {  	struct intel_dp *intel_dp = intel_attached_dp(connector);  	struct edid	*edid; +	int size; + +	if (is_edp(intel_dp)) { +		if (!intel_dp->edid) +			return NULL; + +		size = (intel_dp->edid->extensions + 1) * EDID_LENGTH; +		edid = kmalloc(size, GFP_KERNEL); +		if (!edid) +			return NULL; + +		memcpy(edid, intel_dp->edid, size); +		return edid; +	} -	ironlake_edp_panel_vdd_on(intel_dp);  	edid = drm_get_edid(connector, adapter); -	ironlake_edp_panel_vdd_off(intel_dp, false);  	return edid;  } @@ -2129,9 +2153,17 @@ intel_dp_get_edid_modes(struct drm_connector *connector, struct i2c_adapter *ada  	struct intel_dp *intel_dp = intel_attached_dp(connector);  	int	ret; -	ironlake_edp_panel_vdd_on(intel_dp); +	if (is_edp(intel_dp)) { +		drm_mode_connector_update_edid_property(connector, +							intel_dp->edid); +		ret = drm_add_edid_modes(connector, intel_dp->edid); +		drm_edid_to_eld(connector, +				intel_dp->edid); +		connector->display_info.raw_edid = NULL; +		return intel_dp->edid_mode_count; +	} +  	ret = intel_ddc_get_modes(connector, adapter); -	ironlake_edp_panel_vdd_off(intel_dp, false);  	return ret;  } @@ -2321,6 +2353,7 @@ static void intel_dp_encoder_destroy(struct drm_encoder *encoder)  	i2c_del_adapter(&intel_dp->adapter);  	drm_encoder_cleanup(encoder);  	if (is_edp(intel_dp)) { +		kfree(intel_dp->edid);  		cancel_delayed_work_sync(&intel_dp->panel_vdd_work);  		ironlake_panel_vdd_off_sync(intel_dp);  	} @@ -2504,11 +2537,14 @@ intel_dp_init(struct drm_device *dev, int output_reg)  			break;  	} +	intel_dp_i2c_init(intel_dp, intel_connector, name); +  	/* Cache some DPCD data in the eDP case */  	if (is_edp(intel_dp)) {  		bool ret;  		struct edp_power_seq	cur, vbt;  		u32 pp_on, pp_off, pp_div; +		struct edid *edid;  		pp_on = I915_READ(PCH_PP_ON_DELAYS);  		pp_off = I915_READ(PCH_PP_OFF_DELAYS); @@ -2576,9 +2612,19 @@ intel_dp_init(struct drm_device *dev, int output_reg)  			intel_dp_destroy(&intel_connector->base);  			return;  		} -	} -	intel_dp_i2c_init(intel_dp, intel_connector, name); +		ironlake_edp_panel_vdd_on(intel_dp); +		edid = drm_get_edid(connector, &intel_dp->adapter); +		if (edid) { +			drm_mode_connector_update_edid_property(connector, +								edid); +			intel_dp->edid_mode_count = +				drm_add_edid_modes(connector, edid); +			drm_edid_to_eld(connector, edid); +			intel_dp->edid = edid; +		} +		ironlake_edp_panel_vdd_off(intel_dp, false); +	}  	intel_encoder->hot_plug = intel_dp_hot_plug; diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index 01d77d1554f..3904d7964a4 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c @@ -1149,7 +1149,9 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,  	}  	if (tiling_flags & RADEON_TILING_MACRO) { -		if (rdev->family >= CHIP_CAYMAN) +		if (rdev->family >= CHIP_TAHITI) +			tmp = rdev->config.si.tile_config; +		else if (rdev->family >= CHIP_CAYMAN)  			tmp = rdev->config.cayman.tile_config;  		else  			tmp = rdev->config.evergreen.tile_config; @@ -1177,6 +1179,12 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,  	} else if (tiling_flags & RADEON_TILING_MICRO)  		fb_format |= EVERGREEN_GRPH_ARRAY_MODE(EVERGREEN_GRPH_ARRAY_1D_TILED_THIN1); +	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) +		fb_format |= SI_GRPH_PIPE_CONFIG(SI_ADDR_SURF_P4_8x16); +  	switch (radeon_crtc->crtc_id) {  	case 0:  		WREG32(AVIVO_D1VGA_CONTROL, 0); diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c index e7b1ec5ae8c..486ccdf4aac 100644 --- a/drivers/gpu/drm/radeon/atombios_encoders.c +++ b/drivers/gpu/drm/radeon/atombios_encoders.c @@ -1926,7 +1926,9 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder,  	if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI) {  		r600_hdmi_enable(encoder); -		if (ASIC_IS_DCE4(rdev)) +		if (ASIC_IS_DCE6(rdev)) +			; /* TODO (use pointers instead of if-s?) */ +		else if (ASIC_IS_DCE4(rdev))  			evergreen_hdmi_setmode(encoder, adjusted_mode);  		else  			r600_hdmi_setmode(encoder, adjusted_mode); diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 01550d05e27..7fb3d2e0434 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c @@ -1932,6 +1932,9 @@ static void evergreen_gpu_init(struct radeon_device *rdev)  	smx_dc_ctl0 |= NUMBER_OF_SETS(rdev->config.evergreen.sx_num_of_sets);  	WREG32(SMX_DC_CTL0, smx_dc_ctl0); +	if (rdev->family <= CHIP_SUMO2) +		WREG32(SMX_SAR_CTL0, 0x00010000); +  	WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_size / 4) - 1) |  					POSITION_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_pos_size / 4) - 1) |  					SMX_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_smx_size / 4) - 1))); diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c index a51f880985f..65c54160028 100644 --- a/drivers/gpu/drm/radeon/evergreen_hdmi.c +++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c @@ -156,9 +156,6 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode  	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;  	uint32_t offset; -	if (ASIC_IS_DCE5(rdev)) -		return; -  	/* Silent, r600_hdmi_enable will raise WARN for us */  	if (!dig->afmt->enabled)  		return; diff --git a/drivers/gpu/drm/radeon/evergreend.h b/drivers/gpu/drm/radeon/evergreend.h index 2773039b490..b50b15c7049 100644 --- a/drivers/gpu/drm/radeon/evergreend.h +++ b/drivers/gpu/drm/radeon/evergreend.h @@ -503,6 +503,7 @@  #define	SCRATCH_UMSK					0x8540  #define	SCRATCH_ADDR					0x8544 +#define	SMX_SAR_CTL0					0xA008  #define	SMX_DC_CTL0					0xA020  #define		USE_HASH_FUNCTION				(1 << 0)  #define		NUMBER_OF_SETS(x)				((x) << 1) diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c index 3186522a445..b7bf18e4021 100644 --- a/drivers/gpu/drm/radeon/ni.c +++ b/drivers/gpu/drm/radeon/ni.c @@ -1303,6 +1303,10 @@ static int cayman_startup(struct radeon_device *rdev)  	if (r)  		return r; +	r = r600_audio_init(rdev); +	if (r) +		return r; +  	return 0;  } @@ -1329,6 +1333,7 @@ int cayman_resume(struct radeon_device *rdev)  int cayman_suspend(struct radeon_device *rdev)  { +	r600_audio_fini(rdev);  	/* FIXME: we should wait for ring to be empty */  	radeon_ib_pool_suspend(rdev);  	radeon_vm_manager_suspend(rdev); diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index f30dc95f83b..bff62729381 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c @@ -1839,6 +1839,7 @@ void r600_gpu_init(struct radeon_device *rdev)  	WREG32(PA_CL_ENHANCE, (CLIP_VTX_REORDER_ENA |  			       NUM_CLIP_SEQ(3)));  	WREG32(PA_SC_ENHANCE, FORCE_EOV_MAX_CLK_CNT(4095)); +	WREG32(VC_ENHANCE, 0);  } diff --git a/drivers/gpu/drm/radeon/r600_audio.c b/drivers/gpu/drm/radeon/r600_audio.c index 7479a5c503e..79b55916cf9 100644 --- a/drivers/gpu/drm/radeon/r600_audio.c +++ b/drivers/gpu/drm/radeon/r600_audio.c @@ -57,7 +57,7 @@ static bool radeon_dig_encoder(struct drm_encoder *encoder)   */  static int r600_audio_chipset_supported(struct radeon_device *rdev)  { -	return (rdev->family >= CHIP_R600 && !ASIC_IS_DCE5(rdev)) +	return (rdev->family >= CHIP_R600 && !ASIC_IS_DCE6(rdev))  		|| rdev->family == CHIP_RS600  		|| rdev->family == CHIP_RS690  		|| rdev->family == CHIP_RS740; diff --git a/drivers/gpu/drm/radeon/r600_cs.c b/drivers/gpu/drm/radeon/r600_cs.c index 0133f5f09bd..ca87f7afaf2 100644 --- a/drivers/gpu/drm/radeon/r600_cs.c +++ b/drivers/gpu/drm/radeon/r600_cs.c @@ -2079,6 +2079,48 @@ static int r600_packet3_check(struct radeon_cs_parser *p,  			return -EINVAL;  		}  		break; +	case PACKET3_STRMOUT_BASE_UPDATE: +		if (p->family < CHIP_RV770) { +			DRM_ERROR("STRMOUT_BASE_UPDATE only supported on 7xx\n"); +			return -EINVAL; +		} +		if (pkt->count != 1) { +			DRM_ERROR("bad STRMOUT_BASE_UPDATE packet count\n"); +			return -EINVAL; +		} +		if (idx_value > 3) { +			DRM_ERROR("bad STRMOUT_BASE_UPDATE index\n"); +			return -EINVAL; +		} +		{ +			u64 offset; + +			r = r600_cs_packet_next_reloc(p, &reloc); +			if (r) { +				DRM_ERROR("bad STRMOUT_BASE_UPDATE reloc\n"); +				return -EINVAL; +			} + +			if (reloc->robj != track->vgt_strmout_bo[idx_value]) { +				DRM_ERROR("bad STRMOUT_BASE_UPDATE, bo does not match\n"); +				return -EINVAL; +			} + +			offset = radeon_get_ib_value(p, idx+1) << 8; +			if (offset != track->vgt_strmout_bo_offset[idx_value]) { +				DRM_ERROR("bad STRMOUT_BASE_UPDATE, bo offset does not match: 0x%llx, 0x%x\n", +					  offset, track->vgt_strmout_bo_offset[idx_value]); +				return -EINVAL; +			} + +			if ((offset + 4) > radeon_bo_size(reloc->robj)) { +				DRM_ERROR("bad STRMOUT_BASE_UPDATE bo too small: 0x%llx, 0x%lx\n", +					  offset + 4, radeon_bo_size(reloc->robj)); +				return -EINVAL; +			} +			ib[idx+1] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); +		} +		break;  	case PACKET3_SURFACE_BASE_UPDATE:  		if (p->family >= CHIP_RV770 || p->family == CHIP_R600) {  			DRM_ERROR("bad SURFACE_BASE_UPDATE\n"); diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c index 969c27529df..82a0a4c919c 100644 --- a/drivers/gpu/drm/radeon/r600_hdmi.c +++ b/drivers/gpu/drm/radeon/r600_hdmi.c @@ -322,9 +322,6 @@ void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mod  	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;  	uint32_t offset; -	if (ASIC_IS_DCE5(rdev)) -		return; -  	/* Silent, r600_hdmi_enable will raise WARN for us */  	if (!dig->afmt->enabled)  		return; @@ -483,7 +480,7 @@ void r600_hdmi_enable(struct drm_encoder *encoder)  	uint32_t offset;  	u32 hdmi; -	if (ASIC_IS_DCE5(rdev)) +	if (ASIC_IS_DCE6(rdev))  		return;  	/* Silent, r600_hdmi_enable will raise WARN for us */ @@ -543,7 +540,7 @@ void r600_hdmi_disable(struct drm_encoder *encoder)  	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;  	uint32_t offset; -	if (ASIC_IS_DCE5(rdev)) +	if (ASIC_IS_DCE6(rdev))  		return;  	/* Called for ATOM_ENCODER_MODE_HDMI only */ diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h index a0dbf1fe6a4..025fd5b6c08 100644 --- a/drivers/gpu/drm/radeon/r600d.h +++ b/drivers/gpu/drm/radeon/r600d.h @@ -485,6 +485,7 @@  #define		TC_L2_SIZE(x)					((x)<<5)  #define		L2_DISABLE_LATE_HIT				(1<<9) +#define	VC_ENHANCE					0x9714  #define	VGT_CACHE_INVALIDATION				0x88C4  #define		CACHE_INVALIDATION(x)				((x)<<0) @@ -1163,6 +1164,7 @@  #define	PACKET3_SET_CTL_CONST				0x6F  #define		PACKET3_SET_CTL_CONST_OFFSET			0x0003cff0  #define		PACKET3_SET_CTL_CONST_END			0x0003e200 +#define	PACKET3_STRMOUT_BASE_UPDATE			0x72 /* r7xx */  #define	PACKET3_SURFACE_BASE_UPDATE			0x73 diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c index 03e5f5df40f..2c4d53fd20c 100644 --- a/drivers/gpu/drm/radeon/radeon_drv.c +++ b/drivers/gpu/drm/radeon/radeon_drv.c @@ -58,9 +58,10 @@   *   2.14.0 - add evergreen tiling informations   *   2.15.0 - add max_pipes query   *   2.16.0 - fix evergreen 2D tiled surface calculation + *   2.17.0 - add STRMOUT_BASE_UPDATE for r7xx   */  #define KMS_DRIVER_MAJOR	2 -#define KMS_DRIVER_MINOR	16 +#define KMS_DRIVER_MINOR	17  #define KMS_DRIVER_PATCHLEVEL	0  int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags);  int radeon_driver_unload_kms(struct drm_device *dev); diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index 08825548ee6..5b37e283ec3 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c @@ -801,9 +801,13 @@ static void radeon_dynpm_idle_work_handler(struct work_struct *work)  		int i;  		for (i = 0; i < RADEON_NUM_RINGS; ++i) { -			not_processed += radeon_fence_count_emitted(rdev, i); -			if (not_processed >= 3) -				break; +			struct radeon_ring *ring = &rdev->ring[i]; + +			if (ring->ready) { +				not_processed += radeon_fence_count_emitted(rdev, i); +				if (not_processed >= 3) +					break; +			}  		}  		if (not_processed >= 3) { /* should upclock */ diff --git a/drivers/gpu/drm/radeon/radeon_prime.c b/drivers/gpu/drm/radeon/radeon_prime.c index 8ddab4c7671..6bef46ace83 100644 --- a/drivers/gpu/drm/radeon/radeon_prime.c +++ b/drivers/gpu/drm/radeon/radeon_prime.c @@ -169,11 +169,17 @@ struct dma_buf *radeon_gem_prime_export(struct drm_device *dev,  	struct radeon_bo *bo = gem_to_radeon_bo(obj);  	int ret = 0; +	ret = radeon_bo_reserve(bo, false); +	if (unlikely(ret != 0)) +		return ERR_PTR(ret); +  	/* pin buffer into GTT */  	ret = radeon_bo_pin(bo, RADEON_GEM_DOMAIN_GTT, NULL); -	if (ret) +	if (ret) { +		radeon_bo_unreserve(bo);  		return ERR_PTR(ret); - +	} +	radeon_bo_unreserve(bo);  	return dma_buf_export(bo, &radeon_dmabuf_ops, obj->size, flags);  } diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index 4ad0281fdc3..b4f51c569c3 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c @@ -616,6 +616,9 @@ static void rv770_gpu_init(struct radeon_device *rdev)  				       ACK_FLUSH_CTL(3) |  				       SYNC_FLUSH_CTL)); +	if (rdev->family != CHIP_RV770) +		WREG32(SMX_SAR_CTL0, 0x00003f3f); +  	db_debug3 = RREG32(DB_DEBUG3);  	db_debug3 &= ~DB_CLK_OFF_DELAY(0x1f);  	switch (rdev->family) { @@ -792,7 +795,7 @@ static void rv770_gpu_init(struct radeon_device *rdev)  	WREG32(PA_CL_ENHANCE, (CLIP_VTX_REORDER_ENA |  					  NUM_CLIP_SEQ(3))); - +	WREG32(VC_ENHANCE, 0);  }  void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc) diff --git a/drivers/gpu/drm/radeon/rv770d.h b/drivers/gpu/drm/radeon/rv770d.h index fdc08989601..b0adfc595d7 100644 --- a/drivers/gpu/drm/radeon/rv770d.h +++ b/drivers/gpu/drm/radeon/rv770d.h @@ -211,6 +211,7 @@  #define	SCRATCH_UMSK					0x8540  #define	SCRATCH_ADDR					0x8544 +#define	SMX_SAR_CTL0					0xA008  #define	SMX_DC_CTL0					0xA020  #define		USE_HASH_FUNCTION				(1 << 0)  #define		CACHE_DEPTH(x)					((x) << 1) @@ -310,6 +311,8 @@  #define	TCP_CNTL					0x9610  #define	TCP_CHAN_STEER					0x9614 +#define	VC_ENHANCE					0x9714 +  #define	VGT_CACHE_INVALIDATION				0x88C4  #define		CACHE_INVALIDATION(x)				((x)<<0)  #define			VC_ONLY						0 diff --git a/drivers/gpu/drm/radeon/si_reg.h b/drivers/gpu/drm/radeon/si_reg.h index eda938a7cb6..501f9d431d5 100644 --- a/drivers/gpu/drm/radeon/si_reg.h +++ b/drivers/gpu/drm/radeon/si_reg.h @@ -30,4 +30,76 @@  #define SI_DC_GPIO_HPD_EN                        0x65b8  #define SI_DC_GPIO_HPD_Y                         0x65bc +#define SI_GRPH_CONTROL                          0x6804 +#       define SI_GRPH_DEPTH(x)                  (((x) & 0x3) << 0) +#       define SI_GRPH_DEPTH_8BPP                0 +#       define SI_GRPH_DEPTH_16BPP               1 +#       define SI_GRPH_DEPTH_32BPP               2 +#       define SI_GRPH_NUM_BANKS(x)              (((x) & 0x3) << 2) +#       define SI_ADDR_SURF_2_BANK               0 +#       define SI_ADDR_SURF_4_BANK               1 +#       define SI_ADDR_SURF_8_BANK               2 +#       define SI_ADDR_SURF_16_BANK              3 +#       define SI_GRPH_Z(x)                      (((x) & 0x3) << 4) +#       define SI_GRPH_BANK_WIDTH(x)             (((x) & 0x3) << 6) +#       define SI_ADDR_SURF_BANK_WIDTH_1         0 +#       define SI_ADDR_SURF_BANK_WIDTH_2         1 +#       define SI_ADDR_SURF_BANK_WIDTH_4         2 +#       define SI_ADDR_SURF_BANK_WIDTH_8         3 +#       define SI_GRPH_FORMAT(x)                 (((x) & 0x7) << 8) +/* 8 BPP */ +#       define SI_GRPH_FORMAT_INDEXED            0 +/* 16 BPP */ +#       define SI_GRPH_FORMAT_ARGB1555           0 +#       define SI_GRPH_FORMAT_ARGB565            1 +#       define SI_GRPH_FORMAT_ARGB4444           2 +#       define SI_GRPH_FORMAT_AI88               3 +#       define SI_GRPH_FORMAT_MONO16             4 +#       define SI_GRPH_FORMAT_BGRA5551           5 +/* 32 BPP */ +#       define SI_GRPH_FORMAT_ARGB8888           0 +#       define SI_GRPH_FORMAT_ARGB2101010        1 +#       define SI_GRPH_FORMAT_32BPP_DIG          2 +#       define SI_GRPH_FORMAT_8B_ARGB2101010     3 +#       define SI_GRPH_FORMAT_BGRA1010102        4 +#       define SI_GRPH_FORMAT_8B_BGRA1010102     5 +#       define SI_GRPH_FORMAT_RGB111110          6 +#       define SI_GRPH_FORMAT_BGR101111          7 +#       define SI_GRPH_BANK_HEIGHT(x)            (((x) & 0x3) << 11) +#       define SI_ADDR_SURF_BANK_HEIGHT_1        0 +#       define SI_ADDR_SURF_BANK_HEIGHT_2        1 +#       define SI_ADDR_SURF_BANK_HEIGHT_4        2 +#       define SI_ADDR_SURF_BANK_HEIGHT_8        3 +#       define SI_GRPH_TILE_SPLIT(x)             (((x) & 0x7) << 13) +#       define SI_ADDR_SURF_TILE_SPLIT_64B       0 +#       define SI_ADDR_SURF_TILE_SPLIT_128B      1 +#       define SI_ADDR_SURF_TILE_SPLIT_256B      2 +#       define SI_ADDR_SURF_TILE_SPLIT_512B      3 +#       define SI_ADDR_SURF_TILE_SPLIT_1KB       4 +#       define SI_ADDR_SURF_TILE_SPLIT_2KB       5 +#       define SI_ADDR_SURF_TILE_SPLIT_4KB       6 +#       define SI_GRPH_MACRO_TILE_ASPECT(x)      (((x) & 0x3) << 18) +#       define SI_ADDR_SURF_MACRO_TILE_ASPECT_1  0 +#       define SI_ADDR_SURF_MACRO_TILE_ASPECT_2  1 +#       define SI_ADDR_SURF_MACRO_TILE_ASPECT_4  2 +#       define SI_ADDR_SURF_MACRO_TILE_ASPECT_8  3 +#       define SI_GRPH_ARRAY_MODE(x)             (((x) & 0x7) << 20) +#       define SI_GRPH_ARRAY_LINEAR_GENERAL      0 +#       define SI_GRPH_ARRAY_LINEAR_ALIGNED      1 +#       define SI_GRPH_ARRAY_1D_TILED_THIN1      2 +#       define SI_GRPH_ARRAY_2D_TILED_THIN1      4 +#       define SI_GRPH_PIPE_CONFIG(x)		 (((x) & 0x1f) << 24) +#       define SI_ADDR_SURF_P2			 0 +#       define SI_ADDR_SURF_P4_8x16		 4 +#       define SI_ADDR_SURF_P4_16x16		 5 +#       define SI_ADDR_SURF_P4_16x32		 6 +#       define SI_ADDR_SURF_P4_32x32		 7 +#       define SI_ADDR_SURF_P8_16x16_8x16	 8 +#       define SI_ADDR_SURF_P8_16x32_8x16	 9 +#       define SI_ADDR_SURF_P8_32x32_8x16	 10 +#       define SI_ADDR_SURF_P8_16x32_16x16	 11 +#       define SI_ADDR_SURF_P8_32x32_16x16	 12 +#       define SI_ADDR_SURF_P8_32x32_16x32	 13 +#       define SI_ADDR_SURF_P8_32x64_32x32	 14 +  #endif diff --git a/drivers/gpu/drm/sis/sis_drv.c b/drivers/gpu/drm/sis/sis_drv.c index 30d98d14b5c..dd14cd1a003 100644 --- a/drivers/gpu/drm/sis/sis_drv.c +++ b/drivers/gpu/drm/sis/sis_drv.c @@ -47,9 +47,9 @@ static int sis_driver_load(struct drm_device *dev, unsigned long chipset)  	if (dev_priv == NULL)  		return -ENOMEM; +	idr_init(&dev_priv->object_idr);  	dev->dev_private = (void *)dev_priv;  	dev_priv->chipset = chipset; -	idr_init(&dev->object_name_idr);  	return 0;  } diff --git a/drivers/gpu/drm/udl/udl_drv.c b/drivers/gpu/drm/udl/udl_drv.c index 4d02c46a942..6e52069894b 100644 --- a/drivers/gpu/drm/udl/udl_drv.c +++ b/drivers/gpu/drm/udl/udl_drv.c @@ -13,8 +13,21 @@  static struct drm_driver driver; +/* + * There are many DisplayLink-based graphics products, all with unique PIDs. + * So we match on DisplayLink's VID + Vendor-Defined Interface Class (0xff) + * We also require a match on SubClass (0x00) and Protocol (0x00), + * which is compatible with all known USB 2.0 era graphics chips and firmware, + * but allows DisplayLink to increment those for any future incompatible chips + */  static struct usb_device_id id_table[] = { -	{.idVendor = 0x17e9, .match_flags = USB_DEVICE_ID_MATCH_VENDOR,}, +	{.idVendor = 0x17e9, .bInterfaceClass = 0xff, +	 .bInterfaceSubClass = 0x00, +	 .bInterfaceProtocol = 0x00, +	 .match_flags = USB_DEVICE_ID_MATCH_VENDOR | +			USB_DEVICE_ID_MATCH_INT_CLASS | +			USB_DEVICE_ID_MATCH_INT_SUBCLASS | +			USB_DEVICE_ID_MATCH_INT_PROTOCOL,},  	{},  };  MODULE_DEVICE_TABLE(usb, id_table); diff --git a/drivers/gpu/drm/via/via_map.c b/drivers/gpu/drm/via/via_map.c index 1f182254e81..c126182ac07 100644 --- a/drivers/gpu/drm/via/via_map.c +++ b/drivers/gpu/drm/via/via_map.c @@ -100,12 +100,11 @@ int via_driver_load(struct drm_device *dev, unsigned long chipset)  	if (dev_priv == NULL)  		return -ENOMEM; +	idr_init(&dev_priv->object_idr);  	dev->dev_private = (void *)dev_priv;  	dev_priv->chipset = chipset; -	idr_init(&dev->object_name_idr); -  	pci_set_master(dev->pdev);  	ret = drm_vblank_init(dev, 1); diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c index f082e48ab11..70d62f5bc90 100644 --- a/drivers/hwmon/applesmc.c +++ b/drivers/hwmon/applesmc.c @@ -215,7 +215,7 @@ static int read_smc(u8 cmd, const char *key, u8 *buffer, u8 len)  	int i;  	if (send_command(cmd) || send_argument(key)) { -		pr_warn("%s: read arg fail\n", key); +		pr_warn("%.4s: read arg fail\n", key);  		return -EIO;  	} @@ -223,7 +223,7 @@ static int read_smc(u8 cmd, const char *key, u8 *buffer, u8 len)  	for (i = 0; i < len; i++) {  		if (__wait_status(0x05)) { -			pr_warn("%s: read data fail\n", key); +			pr_warn("%.4s: read data fail\n", key);  			return -EIO;  		}  		buffer[i] = inb(APPLESMC_DATA_PORT); diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c index b9d512331ed..7f1feb2f467 100644 --- a/drivers/hwmon/coretemp.c +++ b/drivers/hwmon/coretemp.c @@ -191,6 +191,24 @@ static ssize_t show_temp(struct device *dev,  	return tdata->valid ? sprintf(buf, "%d\n", tdata->temp) : -EAGAIN;  } +struct tjmax { +	char const *id; +	int tjmax; +}; + +static struct tjmax __cpuinitconst tjmax_table[] = { +	{ "CPU D410", 100000 }, +	{ "CPU D425", 100000 }, +	{ "CPU D510", 100000 }, +	{ "CPU D525", 100000 }, +	{ "CPU N450", 100000 }, +	{ "CPU N455", 100000 }, +	{ "CPU N470", 100000 }, +	{ "CPU N475", 100000 }, +	{ "CPU  230", 100000 }, +	{ "CPU  330", 125000 }, +}; +  static int __cpuinit adjust_tjmax(struct cpuinfo_x86 *c, u32 id,  				  struct device *dev)  { @@ -202,6 +220,13 @@ static int __cpuinit adjust_tjmax(struct cpuinfo_x86 *c, u32 id,  	int err;  	u32 eax, edx;  	struct pci_dev *host_bridge; +	int i; + +	/* explicit tjmax table entries override heuristics */ +	for (i = 0; i < ARRAY_SIZE(tjmax_table); i++) { +		if (strstr(c->x86_model_id, tjmax_table[i].id)) +			return tjmax_table[i].tjmax; +	}  	/* Early chips have no MSR for TjMax */ @@ -210,7 +235,8 @@ static int __cpuinit adjust_tjmax(struct cpuinfo_x86 *c, u32 id,  	/* Atom CPUs */ -	if (c->x86_model == 0x1c) { +	if (c->x86_model == 0x1c || c->x86_model == 0x26 +	    || c->x86_model == 0x27) {  		usemsr_ee = 0;  		host_bridge = pci_get_bus_and_slot(0, PCI_DEVFN(0, 0)); @@ -223,6 +249,9 @@ static int __cpuinit adjust_tjmax(struct cpuinfo_x86 *c, u32 id,  			tjmax = 90000;  		pci_dev_put(host_bridge); +	} else if (c->x86_model == 0x36) { +		usemsr_ee = 0; +		tjmax = 100000;  	}  	if (c->x86_model > 0xe && usemsr_ee) { @@ -772,7 +801,7 @@ MODULE_DEVICE_TABLE(x86cpu, coretemp_ids);  static int __init coretemp_init(void)  { -	int i, err = -ENODEV; +	int i, err;  	/*  	 * CPUID.06H.EAX[0] indicates whether the CPU has thermal diff --git a/drivers/hwmon/emc2103.c b/drivers/hwmon/emc2103.c index 9691f664c76..e7d234b5931 100644 --- a/drivers/hwmon/emc2103.c +++ b/drivers/hwmon/emc2103.c @@ -451,11 +451,15 @@ static ssize_t set_pwm_enable(struct device *dev, struct device_attribute *da,  		data->fan_rpm_control = true;  		break;  	default: -		mutex_unlock(&data->update_lock); -		return -EINVAL; +		count = -EINVAL; +		goto err;  	} -	read_u8_from_i2c(client, REG_FAN_CONF1, &conf_reg); +	result = read_u8_from_i2c(client, REG_FAN_CONF1, &conf_reg); +	if (result) { +		count = result; +		goto err; +	}  	if (data->fan_rpm_control)  		conf_reg |= 0x80; @@ -463,7 +467,7 @@ static ssize_t set_pwm_enable(struct device *dev, struct device_attribute *da,  		conf_reg &= ~0x80;  	i2c_smbus_write_byte_data(client, REG_FAN_CONF1, conf_reg); - +err:  	mutex_unlock(&data->update_lock);  	return count;  } diff --git a/drivers/iio/Kconfig b/drivers/iio/Kconfig index 56eecefcec7..2ec93da41e2 100644 --- a/drivers/iio/Kconfig +++ b/drivers/iio/Kconfig @@ -8,8 +8,7 @@ menuconfig IIO  	help  	  The industrial I/O subsystem provides a unified framework for  	  drivers for many different types of embedded sensors using a -	  number of different physical interfaces (i2c, spi, etc). See -	  Documentation/iio for more information. +	  number of different physical interfaces (i2c, spi, etc).  if IIO diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c index 1ddd8861c71..4f947e4377e 100644 --- a/drivers/iio/industrialio-core.c +++ b/drivers/iio/industrialio-core.c @@ -661,7 +661,6 @@ static int iio_device_register_sysfs(struct iio_dev *indio_dev)  	 * New channel registration method - relies on the fact a group does  	 * not need to be initialized if it is name is NULL.  	 */ -	INIT_LIST_HEAD(&indio_dev->channel_attr_list);  	if (indio_dev->channels)  		for (i = 0; i < indio_dev->num_channels; i++) {  			ret = iio_device_add_channel_sysfs(indio_dev, @@ -725,12 +724,16 @@ static void iio_device_unregister_sysfs(struct iio_dev *indio_dev)  static void iio_dev_release(struct device *device)  {  	struct iio_dev *indio_dev = dev_to_iio_dev(device); -	cdev_del(&indio_dev->chrdev); +	if (indio_dev->chrdev.dev) +		cdev_del(&indio_dev->chrdev);  	if (indio_dev->modes & INDIO_BUFFER_TRIGGERED)  		iio_device_unregister_trigger_consumer(indio_dev);  	iio_device_unregister_eventset(indio_dev);  	iio_device_unregister_sysfs(indio_dev);  	iio_device_unregister_debugfs(indio_dev); + +	ida_simple_remove(&iio_ida, indio_dev->id); +	kfree(indio_dev);  }  static struct device_type iio_dev_type = { @@ -761,6 +764,7 @@ struct iio_dev *iio_device_alloc(int sizeof_priv)  		dev_set_drvdata(&dev->dev, (void *)dev);  		mutex_init(&dev->mlock);  		mutex_init(&dev->info_exist_lock); +		INIT_LIST_HEAD(&dev->channel_attr_list);  		dev->id = ida_simple_get(&iio_ida, 0, 0, GFP_KERNEL);  		if (dev->id < 0) { @@ -778,10 +782,8 @@ EXPORT_SYMBOL(iio_device_alloc);  void iio_device_free(struct iio_dev *dev)  { -	if (dev) { -		ida_simple_remove(&iio_ida, dev->id); -		kfree(dev); -	} +	if (dev) +		put_device(&dev->dev);  }  EXPORT_SYMBOL(iio_device_free); @@ -902,7 +904,7 @@ void iio_device_unregister(struct iio_dev *indio_dev)  	mutex_lock(&indio_dev->info_exist_lock);  	indio_dev->info = NULL;  	mutex_unlock(&indio_dev->info_exist_lock); -	device_unregister(&indio_dev->dev); +	device_del(&indio_dev->dev);  }  EXPORT_SYMBOL(iio_device_unregister);  subsys_initcall(iio_init); diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c index 55d5642eb10..2e826f9702c 100644 --- a/drivers/infiniband/core/cma.c +++ b/drivers/infiniband/core/cma.c @@ -1184,7 +1184,7 @@ static void cma_set_req_event_data(struct rdma_cm_event *event,  static int cma_check_req_qp_type(struct rdma_cm_id *id, struct ib_cm_event *ib_event)  { -	return (((ib_event->event == IB_CM_REQ_RECEIVED) || +	return (((ib_event->event == IB_CM_REQ_RECEIVED) &&  		 (ib_event->param.req_rcvd.qp_type == id->qp_type)) ||  		((ib_event->event == IB_CM_SIDR_REQ_RECEIVED) &&  		 (id->qp_type == IB_QPT_UD)) || diff --git a/drivers/infiniband/hw/ocrdma/ocrdma.h b/drivers/infiniband/hw/ocrdma/ocrdma.h index 037f5cea85b..48970af2367 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma.h +++ b/drivers/infiniband/hw/ocrdma/ocrdma.h @@ -61,6 +61,7 @@ struct ocrdma_dev_attr {  	u32 max_inline_data;  	int max_send_sge;  	int max_recv_sge; +	int max_srq_sge;  	int max_mr;  	u64 max_mr_size;  	u32 max_num_mr_pbl; diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c index 9343a152297..71942af4fce 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c +++ b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c @@ -990,8 +990,6 @@ static void ocrdma_get_attr(struct ocrdma_dev *dev,  			      struct ocrdma_dev_attr *attr,  			      struct ocrdma_mbx_query_config *rsp)  { -	int max_q_mem; -  	attr->max_pd =  	    (rsp->max_pd_ca_ack_delay & OCRDMA_MBX_QUERY_CFG_MAX_PD_MASK) >>  	    OCRDMA_MBX_QUERY_CFG_MAX_PD_SHIFT; @@ -1004,6 +1002,9 @@ static void ocrdma_get_attr(struct ocrdma_dev *dev,  	attr->max_recv_sge = (rsp->max_write_send_sge &  			      OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_MASK) >>  	    OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_SHIFT; +	attr->max_srq_sge = (rsp->max_srq_rqe_sge & +			      OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_MASK) >> +	    OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_OFFSET;  	attr->max_ord_per_qp = (rsp->max_ird_ord_per_qp &  				OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_MASK) >>  	    OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_SHIFT; @@ -1037,18 +1038,15 @@ static void ocrdma_get_attr(struct ocrdma_dev *dev,  	attr->max_inline_data =  	    attr->wqe_size - (sizeof(struct ocrdma_hdr_wqe) +  			      sizeof(struct ocrdma_sge)); -	max_q_mem = OCRDMA_Q_PAGE_BASE_SIZE << (OCRDMA_MAX_Q_PAGE_SIZE_CNT - 1); -	/* hw can queue one less then the configured size, -	 * so publish less by one to stack. -	 */  	if (dev->nic_info.dev_family == OCRDMA_GEN2_FAMILY) { -		dev->attr.max_wqe = max_q_mem / dev->attr.wqe_size;  		attr->ird = 1;  		attr->ird_page_size = OCRDMA_MIN_Q_PAGE_SIZE;  		attr->num_ird_pages = MAX_OCRDMA_IRD_PAGES; -	} else -		dev->attr.max_wqe = (max_q_mem / dev->attr.wqe_size) - 1; -	dev->attr.max_rqe = (max_q_mem / dev->attr.rqe_size) - 1; +	} +	dev->attr.max_wqe = rsp->max_wqes_rqes_per_q >> +		 OCRDMA_MBX_QUERY_CFG_MAX_WQES_PER_WQ_OFFSET; +	dev->attr.max_rqe = rsp->max_wqes_rqes_per_q & +		OCRDMA_MBX_QUERY_CFG_MAX_RQES_PER_RQ_MASK;  }  static int ocrdma_check_fw_config(struct ocrdma_dev *dev, diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_main.c b/drivers/infiniband/hw/ocrdma/ocrdma_main.c index 04fef3de6d7..b050e629e9c 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma_main.c +++ b/drivers/infiniband/hw/ocrdma/ocrdma_main.c @@ -97,13 +97,11 @@ static void ocrdma_build_sgid_mac(union ib_gid *sgid, unsigned char *mac_addr,  	sgid->raw[15] = mac_addr[5];  } -static void ocrdma_add_sgid(struct ocrdma_dev *dev, unsigned char *mac_addr, +static bool ocrdma_add_sgid(struct ocrdma_dev *dev, unsigned char *mac_addr,  			    bool is_vlan, u16 vlan_id)  {  	int i; -	bool found = false;  	union ib_gid new_sgid; -	int free_idx = OCRDMA_MAX_SGID;  	unsigned long flags;  	memset(&ocrdma_zero_sgid, 0, sizeof(union ib_gid)); @@ -115,23 +113,19 @@ static void ocrdma_add_sgid(struct ocrdma_dev *dev, unsigned char *mac_addr,  		if (!memcmp(&dev->sgid_tbl[i], &ocrdma_zero_sgid,  			    sizeof(union ib_gid))) {  			/* found free entry */ -			if (!found) { -				free_idx = i; -				found = true; -				break; -			} +			memcpy(&dev->sgid_tbl[i], &new_sgid, +			       sizeof(union ib_gid)); +			spin_unlock_irqrestore(&dev->sgid_lock, flags); +			return true;  		} else if (!memcmp(&dev->sgid_tbl[i], &new_sgid,  				   sizeof(union ib_gid))) {  			/* entry already present, no addition is required. */  			spin_unlock_irqrestore(&dev->sgid_lock, flags); -			return; +			return false;  		}  	} -	/* if entry doesn't exist and if table has some space, add entry */ -	if (found) -		memcpy(&dev->sgid_tbl[free_idx], &new_sgid, -		       sizeof(union ib_gid));  	spin_unlock_irqrestore(&dev->sgid_lock, flags); +	return false;  }  static bool ocrdma_del_sgid(struct ocrdma_dev *dev, unsigned char *mac_addr, @@ -167,7 +161,8 @@ static void ocrdma_add_default_sgid(struct ocrdma_dev *dev)  	ocrdma_get_guid(dev, &sgid->raw[8]);  } -static int ocrdma_build_sgid_tbl(struct ocrdma_dev *dev) +#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) +static void ocrdma_add_vlan_sgids(struct ocrdma_dev *dev)  {  	struct net_device *netdev, *tmp;  	u16 vlan_id; @@ -175,8 +170,6 @@ static int ocrdma_build_sgid_tbl(struct ocrdma_dev *dev)  	netdev = dev->nic_info.netdev; -	ocrdma_add_default_sgid(dev); -  	rcu_read_lock();  	for_each_netdev_rcu(&init_net, tmp) {  		if (netdev == tmp || vlan_dev_real_dev(tmp) == netdev) { @@ -194,10 +187,23 @@ static int ocrdma_build_sgid_tbl(struct ocrdma_dev *dev)  		}  	}  	rcu_read_unlock(); +} +#else +static void ocrdma_add_vlan_sgids(struct ocrdma_dev *dev) +{ + +} +#endif /* VLAN */ + +static int ocrdma_build_sgid_tbl(struct ocrdma_dev *dev) +{ +	ocrdma_add_default_sgid(dev); +	ocrdma_add_vlan_sgids(dev);  	return 0;  } -#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) || \ +defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)  static int ocrdma_inet6addr_event(struct notifier_block *notifier,  				  unsigned long event, void *ptr) @@ -208,6 +214,7 @@ static int ocrdma_inet6addr_event(struct notifier_block *notifier,  	struct ib_event gid_event;  	struct ocrdma_dev *dev;  	bool found = false; +	bool updated = false;  	bool is_vlan = false;  	u16 vid = 0; @@ -233,23 +240,21 @@ static int ocrdma_inet6addr_event(struct notifier_block *notifier,  	mutex_lock(&dev->dev_lock);  	switch (event) {  	case NETDEV_UP: -		ocrdma_add_sgid(dev, netdev->dev_addr, is_vlan, vid); +		updated = ocrdma_add_sgid(dev, netdev->dev_addr, is_vlan, vid);  		break;  	case NETDEV_DOWN: -		found = ocrdma_del_sgid(dev, netdev->dev_addr, is_vlan, vid); -		if (found) { -			/* found the matching entry, notify -			 * the consumers about it -			 */ -			gid_event.device = &dev->ibdev; -			gid_event.element.port_num = 1; -			gid_event.event = IB_EVENT_GID_CHANGE; -			ib_dispatch_event(&gid_event); -		} +		updated = ocrdma_del_sgid(dev, netdev->dev_addr, is_vlan, vid);  		break;  	default:  		break;  	} +	if (updated) { +		/* GID table updated, notify the consumers about it */ +		gid_event.device = &dev->ibdev; +		gid_event.element.port_num = 1; +		gid_event.event = IB_EVENT_GID_CHANGE; +		ib_dispatch_event(&gid_event); +	}  	mutex_unlock(&dev->dev_lock);  	return NOTIFY_OK;  } @@ -258,7 +263,7 @@ static struct notifier_block ocrdma_inet6addr_notifier = {  	.notifier_call = ocrdma_inet6addr_event  }; -#endif /* IPV6 */ +#endif /* IPV6 and VLAN */  static enum rdma_link_layer ocrdma_link_layer(struct ib_device *device,  					      u8 port_num) diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_sli.h b/drivers/infiniband/hw/ocrdma/ocrdma_sli.h index 7fd80cc0f03..c75cbdfa87e 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma_sli.h +++ b/drivers/infiniband/hw/ocrdma/ocrdma_sli.h @@ -418,6 +418,9 @@ enum {  	OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_SHIFT		= 0,  	OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_MASK		= 0xFFFF, +	OCRDMA_MBX_QUERY_CFG_MAX_WRITE_SGE_SHIFT	= 16, +	OCRDMA_MBX_QUERY_CFG_MAX_WRITE_SGE_MASK		= 0xFFFF << +				OCRDMA_MBX_QUERY_CFG_MAX_WRITE_SGE_SHIFT,  	OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_SHIFT	= 0,  	OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_MASK	= 0xFFFF, @@ -458,7 +461,7 @@ enum {  				OCRDMA_MBX_QUERY_CFG_MAX_WQES_PER_WQ_OFFSET,  	OCRDMA_MBX_QUERY_CFG_MAX_RQES_PER_RQ_OFFSET	= 0,  	OCRDMA_MBX_QUERY_CFG_MAX_RQES_PER_RQ_MASK	= 0xFFFF << -				OCRDMA_MBX_QUERY_CFG_MAX_WQES_PER_WQ_OFFSET, +				OCRDMA_MBX_QUERY_CFG_MAX_RQES_PER_RQ_OFFSET,  	OCRDMA_MBX_QUERY_CFG_MAX_CQ_OFFSET		= 16,  	OCRDMA_MBX_QUERY_CFG_MAX_CQ_MASK		= 0xFFFF << diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c index d16d172b6b6..2e2e7aecc99 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c +++ b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c @@ -53,7 +53,7 @@ int ocrdma_query_gid(struct ib_device *ibdev, u8 port,  	dev = get_ocrdma_dev(ibdev);  	memset(sgid, 0, sizeof(*sgid)); -	if (index > OCRDMA_MAX_SGID) +	if (index >= OCRDMA_MAX_SGID)  		return -EINVAL;  	memcpy(sgid, &dev->sgid_tbl[index], sizeof(*sgid)); @@ -83,8 +83,8 @@ int ocrdma_query_device(struct ib_device *ibdev, struct ib_device_attr *attr)  					IB_DEVICE_SHUTDOWN_PORT |  					IB_DEVICE_SYS_IMAGE_GUID |  					IB_DEVICE_LOCAL_DMA_LKEY; -	attr->max_sge = dev->attr.max_send_sge; -	attr->max_sge_rd = dev->attr.max_send_sge; +	attr->max_sge = min(dev->attr.max_send_sge, dev->attr.max_srq_sge); +	attr->max_sge_rd = 0;  	attr->max_cq = dev->attr.max_cq;  	attr->max_cqe = dev->attr.max_cqe;  	attr->max_mr = dev->attr.max_mr; @@ -97,7 +97,7 @@ int ocrdma_query_device(struct ib_device *ibdev, struct ib_device_attr *attr)  	    min(dev->attr.max_ord_per_qp, dev->attr.max_ird_per_qp);  	attr->max_qp_init_rd_atom = dev->attr.max_ord_per_qp;  	attr->max_srq = (dev->attr.max_qp - 1); -	attr->max_srq_sge = attr->max_sge; +	attr->max_srq_sge = attr->max_srq_sge;  	attr->max_srq_wr = dev->attr.max_rqe;  	attr->local_ca_ack_delay = dev->attr.local_ca_ack_delay;  	attr->max_fast_reg_page_list_len = 0; @@ -2301,8 +2301,10 @@ static bool ocrdma_poll_err_rcqe(struct ocrdma_qp *qp, struct ocrdma_cqe *cqe,  			*stop = true;  			expand = false;  		} -	} else +	} else { +		*polled = true;  		expand = ocrdma_update_err_rcqe(ibwc, cqe, qp, status); +	}  	return expand;  } diff --git a/drivers/media/video/pms.c b/drivers/media/video/pms.c index af2d9086d7e..c370c2d87c1 100644 --- a/drivers/media/video/pms.c +++ b/drivers/media/video/pms.c @@ -29,6 +29,7 @@  #include <linux/ioport.h>  #include <linux/init.h>  #include <linux/mutex.h> +#include <linux/slab.h>  #include <linux/uaccess.h>  #include <linux/isa.h>  #include <asm/io.h> diff --git a/drivers/mfd/stmpe-i2c.c b/drivers/mfd/stmpe-i2c.c index 373f423b118..947a06a1845 100644 --- a/drivers/mfd/stmpe-i2c.c +++ b/drivers/mfd/stmpe-i2c.c @@ -6,7 +6,7 @@   *   * License Terms: GNU General Public License, version 2   * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson - * Author: Viresh Kumar <viresh.kumar@st.com> for ST Microelectronics + * Author: Viresh Kumar <viresh.linux@gmail.com> for ST Microelectronics   */  #include <linux/i2c.h> diff --git a/drivers/mfd/stmpe-spi.c b/drivers/mfd/stmpe-spi.c index afd459013ec..9edfe864cc0 100644 --- a/drivers/mfd/stmpe-spi.c +++ b/drivers/mfd/stmpe-spi.c @@ -4,7 +4,7 @@   * Copyright (C) ST Microelectronics SA 2011   *   * License Terms: GNU General Public License, version 2 - * Author: Viresh Kumar <viresh.kumar@st.com> for ST Microelectronics + * Author: Viresh Kumar <viresh.linux@gmail.com> for ST Microelectronics   */  #include <linux/spi/spi.h> @@ -146,4 +146,4 @@ module_exit(stmpe_exit);  MODULE_LICENSE("GPL v2");  MODULE_DESCRIPTION("STMPE MFD SPI Interface Driver"); -MODULE_AUTHOR("Viresh Kumar <viresh.kumar@st.com>"); +MODULE_AUTHOR("Viresh Kumar <viresh.linux@gmail.com>"); diff --git a/drivers/misc/mei/interrupt.c b/drivers/misc/mei/interrupt.c index 93936f1b75e..23f5463d4ca 100644 --- a/drivers/misc/mei/interrupt.c +++ b/drivers/misc/mei/interrupt.c @@ -835,7 +835,7 @@ static int _mei_irq_thread_read(struct mei_device *dev,	s32 *slots,  			struct mei_cl *cl,  			struct mei_io_list *cmpl_list)  { -	if ((*slots * sizeof(u32)) >= (sizeof(struct mei_msg_hdr) + +	if ((*slots * sizeof(u32)) < (sizeof(struct mei_msg_hdr) +  			sizeof(struct hbm_flow_control))) {  		/* return the cancel routine */  		list_del(&cb_pos->cb_list); diff --git a/drivers/misc/mei/main.c b/drivers/misc/mei/main.c index c7033322833..7de13891e49 100644 --- a/drivers/misc/mei/main.c +++ b/drivers/misc/mei/main.c @@ -982,7 +982,7 @@ static int __devinit mei_probe(struct pci_dev *pdev,  		err = request_threaded_irq(pdev->irq,  			NULL,  			mei_interrupt_thread_handler, -			0, mei_driver_name, dev); +			IRQF_ONESHOT, mei_driver_name, dev);  	else  		err = request_threaded_irq(pdev->irq,  			mei_interrupt_quick_handler, @@ -992,7 +992,7 @@ static int __devinit mei_probe(struct pci_dev *pdev,  	if (err) {  		dev_err(&pdev->dev, "request_threaded_irq failure. irq = %d\n",  		       pdev->irq); -		goto unmap_memory; +		goto disable_msi;  	}  	INIT_DELAYED_WORK(&dev->timer_work, mei_timer);  	if (mei_hw_init(dev)) { @@ -1023,8 +1023,8 @@ release_irq:  	mei_disable_interrupts(dev);  	flush_scheduled_work();  	free_irq(pdev->irq, dev); +disable_msi:  	pci_disable_msi(pdev); -unmap_memory:  	pci_iounmap(pdev, dev->mem_addr);  free_device:  	kfree(dev); @@ -1101,6 +1101,8 @@ static void __devexit mei_remove(struct pci_dev *pdev)  	pci_release_regions(pdev);  	pci_disable_device(pdev); + +	misc_deregister(&mei_misc_device);  }  #ifdef CONFIG_PM  static int mei_pci_suspend(struct device *device) @@ -1216,7 +1218,6 @@ module_init(mei_init_module);   */  static void __exit mei_exit_module(void)  { -	misc_deregister(&mei_misc_device);  	pci_unregister_driver(&mei_driver);  	pr_debug("unloaded successfully.\n"); diff --git a/drivers/misc/mei/wd.c b/drivers/misc/mei/wd.c index 6be5605707b..e2ec0505eb5 100644 --- a/drivers/misc/mei/wd.c +++ b/drivers/misc/mei/wd.c @@ -341,7 +341,7 @@ static const struct watchdog_ops wd_ops = {  };  static const struct watchdog_info wd_info = {  		.identity = INTEL_AMT_WATCHDOG_ID, -		.options = WDIOF_KEEPALIVEPING, +		.options = WDIOF_KEEPALIVEPING | WDIOF_ALARMONLY,  };  static struct watchdog_device amt_wd_dev = { diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 2d4a4b74675..258b203397a 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -1326,7 +1326,7 @@ static int mmc_suspend(struct mmc_host *host)  		if (!err)  			mmc_card_set_sleep(host->card);  	} else if (!mmc_host_is_spi(host)) -		mmc_deselect_cards(host); +		err = mmc_deselect_cards(host);  	host->card->state &= ~(MMC_STATE_HIGHSPEED | MMC_STATE_HIGHSPEED_200);  	mmc_release_host(host); diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c index c272c6868ec..b2b43f624b9 100644 --- a/drivers/mmc/core/sd.c +++ b/drivers/mmc/core/sd.c @@ -1075,16 +1075,18 @@ static void mmc_sd_detect(struct mmc_host *host)   */  static int mmc_sd_suspend(struct mmc_host *host)  { +	int err = 0; +  	BUG_ON(!host);  	BUG_ON(!host->card);  	mmc_claim_host(host);  	if (!mmc_host_is_spi(host)) -		mmc_deselect_cards(host); +		err = mmc_deselect_cards(host);  	host->card->state &= ~MMC_STATE_HIGHSPEED;  	mmc_release_host(host); -	return 0; +	return err;  }  /* diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c index 13d0e95380a..41c5fd8848f 100644 --- a/drivers/mmc/core/sdio.c +++ b/drivers/mmc/core/sdio.c @@ -218,6 +218,12 @@ static int sdio_enable_wide(struct mmc_card *card)  	if (ret)  		return ret; +	if ((ctrl & SDIO_BUS_WIDTH_MASK) == SDIO_BUS_WIDTH_RESERVED) +		pr_warning("%s: SDIO_CCCR_IF is invalid: 0x%02x\n", +			   mmc_hostname(card->host), ctrl); + +	/* set as 4-bit bus width */ +	ctrl &= ~SDIO_BUS_WIDTH_MASK;  	ctrl |= SDIO_BUS_WIDTH_4BIT;  	ret = mmc_io_rw_direct(card, 1, 0, SDIO_CCCR_IF, ctrl, NULL); diff --git a/drivers/mmc/host/atmel-mci-regs.h b/drivers/mmc/host/atmel-mci-regs.h index 787aba1682b..ab56f7db531 100644 --- a/drivers/mmc/host/atmel-mci-regs.h +++ b/drivers/mmc/host/atmel-mci-regs.h @@ -140,4 +140,18 @@  #define atmci_writel(port,reg,value)			\  	__raw_writel((value), (port)->regs + reg) +/* + * Fix sconfig's burst size according to atmel MCI. We need to convert them as: + * 1 -> 0, 4 -> 1, 8 -> 2, 16 -> 3. + * + * This can be done by finding most significant bit set. + */ +static inline unsigned int atmci_convert_chksize(unsigned int maxburst) +{ +	if (maxburst > 1) +		return fls(maxburst) - 2; +	else +		return 0; +} +  #endif /* __DRIVERS_MMC_ATMEL_MCI_H__ */ diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c index 420aca642b1..f2c115e0643 100644 --- a/drivers/mmc/host/atmel-mci.c +++ b/drivers/mmc/host/atmel-mci.c @@ -910,6 +910,7 @@ atmci_prepare_data_dma(struct atmel_mci *host, struct mmc_data *data)  	enum dma_data_direction		direction;  	enum dma_transfer_direction	slave_dirn;  	unsigned int			sglen; +	u32				maxburst;  	u32 iflags;  	data->error = -EINPROGRESS; @@ -943,17 +944,18 @@ atmci_prepare_data_dma(struct atmel_mci *host, struct mmc_data *data)  	if (!chan)  		return -ENODEV; -	if (host->caps.has_dma) -		atmci_writel(host, ATMCI_DMA, ATMCI_DMA_CHKSIZE(3) | ATMCI_DMAEN); -  	if (data->flags & MMC_DATA_READ) {  		direction = DMA_FROM_DEVICE;  		host->dma_conf.direction = slave_dirn = DMA_DEV_TO_MEM; +		maxburst = atmci_convert_chksize(host->dma_conf.src_maxburst);  	} else {  		direction = DMA_TO_DEVICE;  		host->dma_conf.direction = slave_dirn = DMA_MEM_TO_DEV; +		maxburst = atmci_convert_chksize(host->dma_conf.dst_maxburst);  	} +	atmci_writel(host, ATMCI_DMA, ATMCI_DMA_CHKSIZE(maxburst) | ATMCI_DMAEN); +  	sglen = dma_map_sg(chan->device->dev, data->sg,  			data->sg_len, direction); @@ -2314,6 +2316,8 @@ static int __init atmci_probe(struct platform_device *pdev)  	platform_set_drvdata(pdev, host); +	setup_timer(&host->timer, atmci_timeout_timer, (unsigned long)host); +  	/* We need at least one slot to succeed */  	nr_slots = 0;  	ret = -ENODEV; @@ -2352,8 +2356,6 @@ static int __init atmci_probe(struct platform_device *pdev)  		}  	} -	setup_timer(&host->timer, atmci_timeout_timer, (unsigned long)host); -  	dev_info(&pdev->dev,  			"Atmel MCI controller at 0x%08lx irq %d, %u slots\n",  			host->mapbase, irq, nr_slots); diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index 9bbf45f8c53..1ca5e72ceb6 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c @@ -418,6 +418,8 @@ static int dw_mci_idmac_init(struct dw_mci *host)  	p->des3 = host->sg_dma;  	p->des0 = IDMAC_DES0_ER; +	mci_writel(host, BMOD, SDMMC_IDMAC_SWRESET); +  	/* Mask out interrupts - get Tx & Rx complete only */  	mci_writel(host, IDINTEN, SDMMC_IDMAC_INT_NI | SDMMC_IDMAC_INT_RI |  		   SDMMC_IDMAC_INT_TI); @@ -615,14 +617,15 @@ static void dw_mci_setup_bus(struct dw_mci_slot *slot)  	u32 div;  	if (slot->clock != host->current_speed) { -		if (host->bus_hz % slot->clock) +		div = host->bus_hz / slot->clock; +		if (host->bus_hz % slot->clock && host->bus_hz > slot->clock)  			/*  			 * move the + 1 after the divide to prevent  			 * over-clocking the card.  			 */ -			div = ((host->bus_hz / slot->clock) >> 1) + 1; -		else -			div = (host->bus_hz  / slot->clock) >> 1; +			div += 1; + +		div = (host->bus_hz != slot->clock) ? DIV_ROUND_UP(div, 2) : 0;  		dev_info(&slot->mmc->class_dev,  			 "Bus speed (slot %d) = %dHz (slot req %dHz, actual %dHZ" @@ -939,8 +942,8 @@ static void dw_mci_command_complete(struct dw_mci *host, struct mmc_command *cmd  			mdelay(20);  		if (cmd->data) { -			host->data = NULL;  			dw_mci_stop_dma(host); +			host->data = NULL;  		}  	}  } @@ -1623,7 +1626,6 @@ static irqreturn_t dw_mci_interrupt(int irq, void *dev_id)  	if (pending & (SDMMC_IDMAC_INT_TI | SDMMC_IDMAC_INT_RI)) {  		mci_writel(host, IDSTS, SDMMC_IDMAC_INT_TI | SDMMC_IDMAC_INT_RI);  		mci_writel(host, IDSTS, SDMMC_IDMAC_INT_NI); -		set_bit(EVENT_DATA_COMPLETE, &host->pending_events);  		host->dma_ops->complete(host);  	}  #endif @@ -1725,7 +1727,8 @@ static void dw_mci_work_routine_card(struct work_struct *work)  #ifdef CONFIG_MMC_DW_IDMAC  				ctrl = mci_readl(host, BMOD); -				ctrl |= 0x01; /* Software reset of DMA */ +				/* Software reset of DMA */ +				ctrl |= SDMMC_IDMAC_SWRESET;  				mci_writel(host, BMOD, ctrl);  #endif @@ -1950,10 +1953,6 @@ int dw_mci_probe(struct dw_mci *host)  	spin_lock_init(&host->lock);  	INIT_LIST_HEAD(&host->queue); - -	host->dma_ops = host->pdata->dma_ops; -	dw_mci_init_dma(host); -  	/*  	 * Get the host data width - this assumes that HCON has been set with  	 * the correct values. @@ -1981,10 +1980,11 @@ int dw_mci_probe(struct dw_mci *host)  	}  	/* Reset all blocks */ -	if (!mci_wait_reset(&host->dev, host)) { -		ret = -ENODEV; -		goto err_dmaunmap; -	} +	if (!mci_wait_reset(&host->dev, host)) +		return -ENODEV; + +	host->dma_ops = host->pdata->dma_ops; +	dw_mci_init_dma(host);  	/* Clear the interrupts for the host controller */  	mci_writel(host, RINTSTS, 0xFFFFFFFF); @@ -2170,14 +2170,14 @@ int dw_mci_resume(struct dw_mci *host)  	if (host->vmmc)  		regulator_enable(host->vmmc); -	if (host->dma_ops->init) -		host->dma_ops->init(host); -  	if (!mci_wait_reset(&host->dev, host)) {  		ret = -ENODEV;  		return ret;  	} +	if (host->dma_ops->init) +		host->dma_ops->init(host); +  	/* Restore the old value at FIFOTH register */  	mci_writel(host, FIFOTH, host->fifoth_val); diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c index f0fcce40cd8..50ff19a6236 100644 --- a/drivers/mmc/host/mmci.c +++ b/drivers/mmc/host/mmci.c @@ -1216,12 +1216,7 @@ static void mmci_dt_populate_generic_pdata(struct device_node *np,  	int bus_width = 0;  	pdata->gpio_wp = of_get_named_gpio(np, "wp-gpios", 0); -	if (!pdata->gpio_wp) -		pdata->gpio_wp = -1; -  	pdata->gpio_cd = of_get_named_gpio(np, "cd-gpios", 0); -	if (!pdata->gpio_cd) -		pdata->gpio_cd = -1;  	if (of_get_property(np, "cd-inverted", NULL))  		pdata->cd_invert = true; @@ -1276,6 +1271,12 @@ static int __devinit mmci_probe(struct amba_device *dev,  		return -EINVAL;  	} +	if (!plat) { +		plat = devm_kzalloc(&dev->dev, sizeof(*plat), GFP_KERNEL); +		if (!plat) +			return -ENOMEM; +	} +  	if (np)  		mmci_dt_populate_generic_pdata(np, plat); @@ -1424,6 +1425,10 @@ static int __devinit mmci_probe(struct amba_device *dev,  	writel(0, host->base + MMCIMASK1);  	writel(0xfff, host->base + MMCICLEAR); +	if (plat->gpio_cd == -EPROBE_DEFER) { +		ret = -EPROBE_DEFER; +		goto err_gpio_cd; +	}  	if (gpio_is_valid(plat->gpio_cd)) {  		ret = gpio_request(plat->gpio_cd, DRIVER_NAME " (cd)");  		if (ret == 0) @@ -1447,6 +1452,10 @@ static int __devinit mmci_probe(struct amba_device *dev,  		if (ret >= 0)  			host->gpio_cd_irq = gpio_to_irq(plat->gpio_cd);  	} +	if (plat->gpio_wp == -EPROBE_DEFER) { +		ret = -EPROBE_DEFER; +		goto err_gpio_wp; +	}  	if (gpio_is_valid(plat->gpio_wp)) {  		ret = gpio_request(plat->gpio_wp, DRIVER_NAME " (wp)");  		if (ret == 0) diff --git a/drivers/mmc/host/mxs-mmc.c b/drivers/mmc/host/mxs-mmc.c index 34a90266ab1..277161d279b 100644 --- a/drivers/mmc/host/mxs-mmc.c +++ b/drivers/mmc/host/mxs-mmc.c @@ -894,8 +894,8 @@ static struct platform_driver mxs_mmc_driver = {  		.owner	= THIS_MODULE,  #ifdef CONFIG_PM  		.pm	= &mxs_mmc_pm_ops, -		.of_match_table = mxs_mmc_dt_ids,  #endif +		.of_match_table = mxs_mmc_dt_ids,  	},  }; diff --git a/drivers/mmc/host/omap.c b/drivers/mmc/host/omap.c index 552196c764d..3e8dcf8d2e0 100644 --- a/drivers/mmc/host/omap.c +++ b/drivers/mmc/host/omap.c @@ -1300,7 +1300,7 @@ static const struct mmc_host_ops mmc_omap_ops = {  	.set_ios	= mmc_omap_set_ios,  }; -static int __init mmc_omap_new_slot(struct mmc_omap_host *host, int id) +static int __devinit mmc_omap_new_slot(struct mmc_omap_host *host, int id)  {  	struct mmc_omap_slot *slot = NULL;  	struct mmc_host *mmc; @@ -1485,24 +1485,26 @@ static int __devinit mmc_omap_probe(struct platform_device *pdev)  	}  	host->nr_slots = pdata->nr_slots; +	host->reg_shift = (cpu_is_omap7xx() ? 1 : 2); + +	host->mmc_omap_wq = alloc_workqueue("mmc_omap", 0, 0); +	if (!host->mmc_omap_wq) +		goto err_plat_cleanup; +  	for (i = 0; i < pdata->nr_slots; i++) {  		ret = mmc_omap_new_slot(host, i);  		if (ret < 0) {  			while (--i >= 0)  				mmc_omap_remove_slot(host->slots[i]); -			goto err_plat_cleanup; +			goto err_destroy_wq;  		}  	} -	host->reg_shift = (cpu_is_omap7xx() ? 1 : 2); - -	host->mmc_omap_wq = alloc_workqueue("mmc_omap", 0, 0); -	if (!host->mmc_omap_wq) -		goto err_plat_cleanup; -  	return 0; +err_destroy_wq: +	destroy_workqueue(host->mmc_omap_wq);  err_plat_cleanup:  	if (pdata->cleanup)  		pdata->cleanup(&pdev->dev); diff --git a/drivers/mmc/host/sdhci-s3c.c b/drivers/mmc/host/sdhci-s3c.c index 55a164fcaa1..a50c205ea20 100644 --- a/drivers/mmc/host/sdhci-s3c.c +++ b/drivers/mmc/host/sdhci-s3c.c @@ -404,7 +404,7 @@ static void sdhci_s3c_setup_card_detect_gpio(struct sdhci_s3c *sc)  		if (sc->ext_cd_irq &&  		    request_threaded_irq(sc->ext_cd_irq, NULL,  					 sdhci_s3c_gpio_card_detect_thread, -					 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, +					 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_ONESHOT,  					 dev_name(dev), sc) == 0) {  			int status = gpio_get_value(sc->ext_cd_gpio);  			if (pdata->ext_cd_gpio_invert) diff --git a/drivers/mmc/host/sdhci-spear.c b/drivers/mmc/host/sdhci-spear.c index 1fe32dfa7cd..423da8194cd 100644 --- a/drivers/mmc/host/sdhci-spear.c +++ b/drivers/mmc/host/sdhci-spear.c @@ -4,7 +4,7 @@   * Support of SDHCI platform devices for spear soc family   *   * Copyright (C) 2010 ST Microelectronics - * Viresh Kumar<viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * Inspired by sdhci-pltfm.c   * @@ -289,5 +289,5 @@ static struct platform_driver sdhci_driver = {  module_platform_driver(sdhci_driver);  MODULE_DESCRIPTION("SPEAr Secure Digital Host Controller Interface driver"); -MODULE_AUTHOR("Viresh Kumar <viresh.kumar@st.com>"); +MODULE_AUTHOR("Viresh Kumar <viresh.linux@gmail.com>");  MODULE_LICENSE("GPL v2"); diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index e626732aff7..f4b8b4db3a9 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -680,8 +680,8 @@ static u8 sdhci_calc_timeout(struct sdhci_host *host, struct mmc_command *cmd)  	}  	if (count >= 0xF) { -		pr_warning("%s: Too large timeout 0x%x requested for CMD%d!\n", -			   mmc_hostname(host->mmc), count, cmd->opcode); +		DBG("%s: Too large timeout 0x%x requested for CMD%d!\n", +		    mmc_hostname(host->mmc), count, cmd->opcode);  		count = 0xE;  	} diff --git a/drivers/mtd/mtdoops.c b/drivers/mtd/mtdoops.c index ae36d7e1e91..551e316e445 100644 --- a/drivers/mtd/mtdoops.c +++ b/drivers/mtd/mtdoops.c @@ -304,32 +304,17 @@ static void find_next_position(struct mtdoops_context *cxt)  }  static void mtdoops_do_dump(struct kmsg_dumper *dumper, -		enum kmsg_dump_reason reason, const char *s1, unsigned long l1, -		const char *s2, unsigned long l2) +			    enum kmsg_dump_reason reason)  {  	struct mtdoops_context *cxt = container_of(dumper,  			struct mtdoops_context, dump); -	unsigned long s1_start, s2_start; -	unsigned long l1_cpy, l2_cpy; -	char *dst; - -	if (reason != KMSG_DUMP_OOPS && -	    reason != KMSG_DUMP_PANIC) -		return;  	/* Only dump oopses if dump_oops is set */  	if (reason == KMSG_DUMP_OOPS && !dump_oops)  		return; -	dst = cxt->oops_buf + MTDOOPS_HEADER_SIZE; /* Skip the header */ -	l2_cpy = min(l2, record_size - MTDOOPS_HEADER_SIZE); -	l1_cpy = min(l1, record_size - MTDOOPS_HEADER_SIZE - l2_cpy); - -	s2_start = l2 - l2_cpy; -	s1_start = l1 - l1_cpy; - -	memcpy(dst, s1 + s1_start, l1_cpy); -	memcpy(dst + l1_cpy, s2 + s2_start, l2_cpy); +	kmsg_dump_get_buffer(dumper, true, cxt->oops_buf + MTDOOPS_HEADER_SIZE, +			     record_size - MTDOOPS_HEADER_SIZE, NULL);  	/* Panics must be written immediately */  	if (reason != KMSG_DUMP_OOPS) @@ -375,6 +360,7 @@ static void mtdoops_notify_add(struct mtd_info *mtd)  		return;  	} +	cxt->dump.max_reason = KMSG_DUMP_OOPS;  	cxt->dump.dump = mtdoops_do_dump;  	err = kmsg_dump_register(&cxt->dump);  	if (err) { diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index acd03a4f973..1b988f26bdf 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c @@ -3767,7 +3767,7 @@ static int b43_switch_band(struct b43_wl *wl, struct ieee80211_channel *chan)  	if (prev_status >= B43_STAT_STARTED) {  		err = b43_wireless_core_start(up_dev);  		if (err) { -			b43err(wl, "Fatal: Coult not start device for " +			b43err(wl, "Fatal: Could not start device for "  			       "selected %s-GHz band\n",  			       band_to_string(chan->band));  			b43_wireless_core_exit(up_dev); diff --git a/drivers/net/wireless/b43legacy/main.c b/drivers/net/wireless/b43legacy/main.c index cd9c9bc186d..eae691e2f7d 100644 --- a/drivers/net/wireless/b43legacy/main.c +++ b/drivers/net/wireless/b43legacy/main.c @@ -2633,7 +2633,7 @@ static int b43legacy_switch_phymode(struct b43legacy_wl *wl,  	if (prev_status >= B43legacy_STAT_STARTED) {  		err = b43legacy_wireless_core_start(up_dev);  		if (err) { -			b43legacyerr(wl, "Fatal: Coult not start device for " +			b43legacyerr(wl, "Fatal: Could not start device for "  			       "newly selected %s-PHY mode\n",  			       phymode_to_string(new_mode));  			b43legacy_wireless_core_exit(up_dev); diff --git a/drivers/pinctrl/pinctrl-mxs.c b/drivers/pinctrl/pinctrl-mxs.c index afb50ee6459..4ba4636b6a4 100644 --- a/drivers/pinctrl/pinctrl-mxs.c +++ b/drivers/pinctrl/pinctrl-mxs.c @@ -137,7 +137,7 @@ static int mxs_dt_node_to_map(struct pinctrl_dev *pctldev,  free_group:  	if (!purecfg) -		free(group); +		kfree(group);  free:  	kfree(new_map);  	return ret; diff --git a/drivers/pinctrl/pinctrl-nomadik.c b/drivers/pinctrl/pinctrl-nomadik.c index e8937e7e499..3e7e47d6b38 100644 --- a/drivers/pinctrl/pinctrl-nomadik.c +++ b/drivers/pinctrl/pinctrl-nomadik.c @@ -1438,7 +1438,27 @@ static int nmk_pmx_enable(struct pinctrl_dev *pctldev, unsigned function,  	dev_dbg(npct->dev, "enable group %s, %u pins\n", g->name, g->npins); -	/* Handle this special glitch on altfunction C */ +	/* +	 * If we're setting altfunc C by setting both AFSLA and AFSLB to 1, +	 * we may pass through an undesired state. In this case we take +	 * some extra care. +	 * +	 * Safe sequence used to switch IOs between GPIO and Alternate-C mode: +	 *  - Save SLPM registers (since we have a shadow register in the +	 *    nmk_chip we're using that as backup) +	 *  - Set SLPM=0 for the IOs you want to switch and others to 1 +	 *  - Configure the GPIO registers for the IOs that are being switched +	 *  - Set IOFORCE=1 +	 *  - Modify the AFLSA/B registers for the IOs that are being switched +	 *  - Set IOFORCE=0 +	 *  - Restore SLPM registers +	 *  - Any spurious wake up event during switch sequence to be ignored +	 *    and cleared +	 * +	 * We REALLY need to save ALL slpm registers, because the external +	 * IOFORCE will switch *all* ports to their sleepmode setting to as +	 * to avoid glitches. (Not just one port!) +	 */  	glitch = (g->altsetting == NMK_GPIO_ALT_C);  	if (glitch) { diff --git a/drivers/pinctrl/spear/pinctrl-spear.c b/drivers/pinctrl/spear/pinctrl-spear.c index 5ae50aadf88..b3f6b2873fd 100644 --- a/drivers/pinctrl/spear/pinctrl-spear.c +++ b/drivers/pinctrl/spear/pinctrl-spear.c @@ -2,7 +2,7 @@   * Driver for the ST Microelectronics SPEAr pinmux   *   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * Inspired from:   * - U300 Pinctl drivers diff --git a/drivers/pinctrl/spear/pinctrl-spear.h b/drivers/pinctrl/spear/pinctrl-spear.h index 9155783bb47..d950eb78d93 100644 --- a/drivers/pinctrl/spear/pinctrl-spear.h +++ b/drivers/pinctrl/spear/pinctrl-spear.h @@ -2,7 +2,7 @@   * Driver header file for the ST Microelectronics SPEAr pinmux   *   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/drivers/pinctrl/spear/pinctrl-spear1310.c b/drivers/pinctrl/spear/pinctrl-spear1310.c index fff168be7f0..d6cca8c81b9 100644 --- a/drivers/pinctrl/spear/pinctrl-spear1310.c +++ b/drivers/pinctrl/spear/pinctrl-spear1310.c @@ -2,7 +2,7 @@   * Driver for the ST Microelectronics SPEAr1310 pinmux   *   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any @@ -2192,7 +2192,7 @@ static void __exit spear1310_pinctrl_exit(void)  }  module_exit(spear1310_pinctrl_exit); -MODULE_AUTHOR("Viresh Kumar <viresh.kumar@st.com>"); +MODULE_AUTHOR("Viresh Kumar <viresh.linux@gmail.com>");  MODULE_DESCRIPTION("ST Microelectronics SPEAr1310 pinctrl driver");  MODULE_LICENSE("GPL v2");  MODULE_DEVICE_TABLE(of, spear1310_pinctrl_of_match); diff --git a/drivers/pinctrl/spear/pinctrl-spear1340.c b/drivers/pinctrl/spear/pinctrl-spear1340.c index a8ab2a6f51b..a0eb057e55b 100644 --- a/drivers/pinctrl/spear/pinctrl-spear1340.c +++ b/drivers/pinctrl/spear/pinctrl-spear1340.c @@ -2,7 +2,7 @@   * Driver for the ST Microelectronics SPEAr1340 pinmux   *   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any @@ -1983,7 +1983,7 @@ static void __exit spear1340_pinctrl_exit(void)  }  module_exit(spear1340_pinctrl_exit); -MODULE_AUTHOR("Viresh Kumar <viresh.kumar@st.com>"); +MODULE_AUTHOR("Viresh Kumar <viresh.linux@gmail.com>");  MODULE_DESCRIPTION("ST Microelectronics SPEAr1340 pinctrl driver");  MODULE_LICENSE("GPL v2");  MODULE_DEVICE_TABLE(of, spear1340_pinctrl_of_match); diff --git a/drivers/pinctrl/spear/pinctrl-spear300.c b/drivers/pinctrl/spear/pinctrl-spear300.c index 9c82a35e4e7..4dfc2849b17 100644 --- a/drivers/pinctrl/spear/pinctrl-spear300.c +++ b/drivers/pinctrl/spear/pinctrl-spear300.c @@ -2,7 +2,7 @@   * Driver for the ST Microelectronics SPEAr300 pinmux   *   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any @@ -702,7 +702,7 @@ static void __exit spear300_pinctrl_exit(void)  }  module_exit(spear300_pinctrl_exit); -MODULE_AUTHOR("Viresh Kumar <viresh.kumar@st.com>"); +MODULE_AUTHOR("Viresh Kumar <viresh.linux@gmail.com>");  MODULE_DESCRIPTION("ST Microelectronics SPEAr300 pinctrl driver");  MODULE_LICENSE("GPL v2");  MODULE_DEVICE_TABLE(of, spear300_pinctrl_of_match); diff --git a/drivers/pinctrl/spear/pinctrl-spear310.c b/drivers/pinctrl/spear/pinctrl-spear310.c index 1a970760512..96883693fb7 100644 --- a/drivers/pinctrl/spear/pinctrl-spear310.c +++ b/drivers/pinctrl/spear/pinctrl-spear310.c @@ -2,7 +2,7 @@   * Driver for the ST Microelectronics SPEAr310 pinmux   *   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any @@ -425,7 +425,7 @@ static void __exit spear310_pinctrl_exit(void)  }  module_exit(spear310_pinctrl_exit); -MODULE_AUTHOR("Viresh Kumar <viresh.kumar@st.com>"); +MODULE_AUTHOR("Viresh Kumar <viresh.linux@gmail.com>");  MODULE_DESCRIPTION("ST Microelectronics SPEAr310 pinctrl driver");  MODULE_LICENSE("GPL v2");  MODULE_DEVICE_TABLE(of, SPEAr310_pinctrl_of_match); diff --git a/drivers/pinctrl/spear/pinctrl-spear320.c b/drivers/pinctrl/spear/pinctrl-spear320.c index de726e6c283..020b1e0bdb3 100644 --- a/drivers/pinctrl/spear/pinctrl-spear320.c +++ b/drivers/pinctrl/spear/pinctrl-spear320.c @@ -2,7 +2,7 @@   * Driver for the ST Microelectronics SPEAr320 pinmux   *   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any @@ -3462,7 +3462,7 @@ static void __exit spear320_pinctrl_exit(void)  }  module_exit(spear320_pinctrl_exit); -MODULE_AUTHOR("Viresh Kumar <viresh.kumar@st.com>"); +MODULE_AUTHOR("Viresh Kumar <viresh.linux@gmail.com>");  MODULE_DESCRIPTION("ST Microelectronics SPEAr320 pinctrl driver");  MODULE_LICENSE("GPL v2");  MODULE_DEVICE_TABLE(of, spear320_pinctrl_of_match); diff --git a/drivers/pinctrl/spear/pinctrl-spear3xx.c b/drivers/pinctrl/spear/pinctrl-spear3xx.c index 91c883bc46a..0242378f7cb 100644 --- a/drivers/pinctrl/spear/pinctrl-spear3xx.c +++ b/drivers/pinctrl/spear/pinctrl-spear3xx.c @@ -2,7 +2,7 @@   * Driver for the ST Microelectronics SPEAr3xx pinmux   *   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/drivers/pinctrl/spear/pinctrl-spear3xx.h b/drivers/pinctrl/spear/pinctrl-spear3xx.h index 5d5fdd8df7b..31f44347f17 100644 --- a/drivers/pinctrl/spear/pinctrl-spear3xx.h +++ b/drivers/pinctrl/spear/pinctrl-spear3xx.h @@ -2,7 +2,7 @@   * Header file for the ST Microelectronics SPEAr3xx pinmux   *   * Copyright (C) 2012 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/drivers/regulator/ab8500.c b/drivers/regulator/ab8500.c index e1b8c54ace5..a739f5ca936 100644 --- a/drivers/regulator/ab8500.c +++ b/drivers/regulator/ab8500.c @@ -794,17 +794,17 @@ static __devinit int ab8500_regulator_register(struct platform_device *pdev,  }  static struct of_regulator_match ab8500_regulator_matches[] = { -	{ .name	= "LDO-AUX1",    .driver_data = (void *) AB8500_LDO_AUX1, }, -	{ .name	= "LDO-AUX2",    .driver_data = (void *) AB8500_LDO_AUX2, }, -	{ .name	= "LDO-AUX3",    .driver_data = (void *) AB8500_LDO_AUX3, }, -	{ .name	= "LDO-INTCORE", .driver_data = (void *) AB8500_LDO_INTCORE, }, -	{ .name	= "LDO-TVOUT",   .driver_data = (void *) AB8500_LDO_TVOUT, }, -	{ .name = "LDO-USB",     .driver_data = (void *) AB8500_LDO_USB, }, -	{ .name = "LDO-AUDIO",   .driver_data = (void *) AB8500_LDO_AUDIO, }, -	{ .name	= "LDO-ANAMIC1", .driver_data = (void *) AB8500_LDO_ANAMIC1, }, -	{ .name	= "LDO-ANAMIC2", .driver_data = (void *) AB8500_LDO_ANAMIC2, }, -	{ .name	= "LDO-DMIC",    .driver_data = (void *) AB8500_LDO_DMIC, }, -	{ .name	= "LDO-ANA",     .driver_data = (void *) AB8500_LDO_ANA, }, +	{ .name	= "ab8500_ldo_aux1",    .driver_data = (void *) AB8500_LDO_AUX1, }, +	{ .name	= "ab8500_ldo_aux2",    .driver_data = (void *) AB8500_LDO_AUX2, }, +	{ .name	= "ab8500_ldo_aux3",    .driver_data = (void *) AB8500_LDO_AUX3, }, +	{ .name	= "ab8500_ldo_intcore", .driver_data = (void *) AB8500_LDO_INTCORE, }, +	{ .name	= "ab8500_ldo_tvout",   .driver_data = (void *) AB8500_LDO_TVOUT, }, +	{ .name = "ab8500_ldo_usb",     .driver_data = (void *) AB8500_LDO_USB, }, +	{ .name = "ab8500_ldo_audio",   .driver_data = (void *) AB8500_LDO_AUDIO, }, +	{ .name	= "ab8500_ldo_anamic1", .driver_data = (void *) AB8500_LDO_ANAMIC1, }, +	{ .name	= "ab8500_ldo_amamic2", .driver_data = (void *) AB8500_LDO_ANAMIC2, }, +	{ .name	= "ab8500_ldo_dmic",    .driver_data = (void *) AB8500_LDO_DMIC, }, +	{ .name	= "ab8500_ldo_ana",     .driver_data = (void *) AB8500_LDO_ANA, },  };  static __devinit int diff --git a/drivers/regulator/db8500-prcmu.c b/drivers/regulator/db8500-prcmu.c index 968f97f3cb3..9dbb491b6ef 100644 --- a/drivers/regulator/db8500-prcmu.c +++ b/drivers/regulator/db8500-prcmu.c @@ -452,26 +452,26 @@ static __devinit int db8500_regulator_register(struct platform_device *pdev,  }  static struct of_regulator_match db8500_regulator_matches[] = { -	{ .name	= "db8500-vape",          .driver_data = (void *) DB8500_REGULATOR_VAPE, }, -	{ .name	= "db8500-varm",          .driver_data = (void *) DB8500_REGULATOR_VARM, }, -	{ .name	= "db8500-vmodem",        .driver_data = (void *) DB8500_REGULATOR_VMODEM, }, -	{ .name	= "db8500-vpll",          .driver_data = (void *) DB8500_REGULATOR_VPLL, }, -	{ .name	= "db8500-vsmps1",        .driver_data = (void *) DB8500_REGULATOR_VSMPS1, }, -	{ .name	= "db8500-vsmps2",        .driver_data = (void *) DB8500_REGULATOR_VSMPS2, }, -	{ .name	= "db8500-vsmps3",        .driver_data = (void *) DB8500_REGULATOR_VSMPS3, }, -	{ .name	= "db8500-vrf1",          .driver_data = (void *) DB8500_REGULATOR_VRF1, }, -	{ .name	= "db8500-sva-mmdsp",     .driver_data = (void *) DB8500_REGULATOR_SWITCH_SVAMMDSP, }, -	{ .name	= "db8500-sva-mmdsp-ret", .driver_data = (void *) DB8500_REGULATOR_SWITCH_SVAMMDSPRET, }, -	{ .name	= "db8500-sva-pipe",      .driver_data = (void *) DB8500_REGULATOR_SWITCH_SVAPIPE, }, -	{ .name	= "db8500-sia-mmdsp",     .driver_data = (void *) DB8500_REGULATOR_SWITCH_SIAMMDSP, }, -	{ .name	= "db8500-sia-mmdsp-ret", .driver_data = (void *) DB8500_REGULATOR_SWITCH_SIAMMDSPRET, }, -	{ .name	= "db8500-sia-pipe",      .driver_data = (void *) DB8500_REGULATOR_SWITCH_SIAPIPE, }, -	{ .name	= "db8500-sga",           .driver_data = (void *) DB8500_REGULATOR_SWITCH_SGA, }, -	{ .name	= "db8500-b2r2-mcde",     .driver_data = (void *) DB8500_REGULATOR_SWITCH_B2R2_MCDE, }, -	{ .name	= "db8500-esram12",       .driver_data = (void *) DB8500_REGULATOR_SWITCH_ESRAM12, }, -	{ .name	= "db8500-esram12-ret",   .driver_data = (void *) DB8500_REGULATOR_SWITCH_ESRAM12RET, }, -	{ .name	= "db8500-esram34",       .driver_data = (void *) DB8500_REGULATOR_SWITCH_ESRAM34, }, -	{ .name	= "db8500-esram34-ret",   .driver_data = (void *) DB8500_REGULATOR_SWITCH_ESRAM34RET, }, +	{ .name	= "db8500_vape",          .driver_data = (void *) DB8500_REGULATOR_VAPE, }, +	{ .name	= "db8500_varm",          .driver_data = (void *) DB8500_REGULATOR_VARM, }, +	{ .name	= "db8500_vmodem",        .driver_data = (void *) DB8500_REGULATOR_VMODEM, }, +	{ .name	= "db8500_vpll",          .driver_data = (void *) DB8500_REGULATOR_VPLL, }, +	{ .name	= "db8500_vsmps1",        .driver_data = (void *) DB8500_REGULATOR_VSMPS1, }, +	{ .name	= "db8500_vsmps2",        .driver_data = (void *) DB8500_REGULATOR_VSMPS2, }, +	{ .name	= "db8500_vsmps3",        .driver_data = (void *) DB8500_REGULATOR_VSMPS3, }, +	{ .name	= "db8500_vrf1",          .driver_data = (void *) DB8500_REGULATOR_VRF1, }, +	{ .name	= "db8500_sva_mmdsp",     .driver_data = (void *) DB8500_REGULATOR_SWITCH_SVAMMDSP, }, +	{ .name	= "db8500_sva_mmdsp_ret", .driver_data = (void *) DB8500_REGULATOR_SWITCH_SVAMMDSPRET, }, +	{ .name	= "db8500_sva_pipe",      .driver_data = (void *) DB8500_REGULATOR_SWITCH_SVAPIPE, }, +	{ .name	= "db8500_sia_mmdsp",     .driver_data = (void *) DB8500_REGULATOR_SWITCH_SIAMMDSP, }, +	{ .name	= "db8500_sia_mmdsp_ret", .driver_data = (void *) DB8500_REGULATOR_SWITCH_SIAMMDSPRET, }, +	{ .name	= "db8500_sia_pipe",      .driver_data = (void *) DB8500_REGULATOR_SWITCH_SIAPIPE, }, +	{ .name	= "db8500_sga",           .driver_data = (void *) DB8500_REGULATOR_SWITCH_SGA, }, +	{ .name	= "db8500_b2r2_mcde",     .driver_data = (void *) DB8500_REGULATOR_SWITCH_B2R2_MCDE, }, +	{ .name	= "db8500_esram12",       .driver_data = (void *) DB8500_REGULATOR_SWITCH_ESRAM12, }, +	{ .name	= "db8500_esram12_ret",   .driver_data = (void *) DB8500_REGULATOR_SWITCH_ESRAM12RET, }, +	{ .name	= "db8500_esram34",       .driver_data = (void *) DB8500_REGULATOR_SWITCH_ESRAM34, }, +	{ .name	= "db8500_esram34_ret",   .driver_data = (void *) DB8500_REGULATOR_SWITCH_ESRAM34RET, },  };  static __devinit int diff --git a/drivers/regulator/s5m8767.c b/drivers/regulator/s5m8767.c index 290d6fc0102..9caadb48217 100644 --- a/drivers/regulator/s5m8767.c +++ b/drivers/regulator/s5m8767.c @@ -451,7 +451,7 @@ static int s5m8767_set_voltage_time_sel(struct regulator_dev *rdev,  	desc = reg_voltage_map[reg_id]; -	if (old_sel < new_sel) +	if ((old_sel < new_sel) && s5m8767->ramp_delay)  		return DIV_ROUND_UP(desc->step * (new_sel - old_sel),  					s5m8767->ramp_delay * 1000);  	return 0; diff --git a/drivers/remoteproc/omap_remoteproc.c b/drivers/remoteproc/omap_remoteproc.c index 69425c4e86f..de138e30d3e 100644 --- a/drivers/remoteproc/omap_remoteproc.c +++ b/drivers/remoteproc/omap_remoteproc.c @@ -182,7 +182,7 @@ static int __devinit omap_rproc_probe(struct platform_device *pdev)  	ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32));  	if (ret) { -		dev_err(pdev->dev.parent, "dma_set_coherent_mask: %d\n", ret); +		dev_err(&pdev->dev, "dma_set_coherent_mask: %d\n", ret);  		return ret;  	} diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c index 8ea7bccc710..66324ee4678 100644 --- a/drivers/remoteproc/remoteproc_core.c +++ b/drivers/remoteproc/remoteproc_core.c @@ -247,7 +247,7 @@ rproc_load_segments(struct rproc *rproc, const u8 *elf_data, size_t len)  		}  		if (offset + filesz > len) { -			dev_err(dev, "truncated fw: need 0x%x avail 0x%x\n", +			dev_err(dev, "truncated fw: need 0x%x avail 0x%zx\n",  					offset + filesz, len);  			ret = -EINVAL;  			break; @@ -934,7 +934,7 @@ static void rproc_resource_cleanup(struct rproc *rproc)  		unmapped = iommu_unmap(rproc->domain, entry->da, entry->len);  		if (unmapped != entry->len) {  			/* nothing much to do besides complaining */ -			dev_err(dev, "failed to unmap %u/%u\n", entry->len, +			dev_err(dev, "failed to unmap %u/%zu\n", entry->len,  								unmapped);  		} @@ -1020,7 +1020,7 @@ static int rproc_fw_boot(struct rproc *rproc, const struct firmware *fw)  	ehdr = (struct elf32_hdr *)fw->data; -	dev_info(dev, "Booting fw image %s, size %d\n", name, fw->size); +	dev_info(dev, "Booting fw image %s, size %zd\n", name, fw->size);  	/*  	 * if enabling an IOMMU isn't relevant for this rproc, this is @@ -1041,8 +1041,10 @@ static int rproc_fw_boot(struct rproc *rproc, const struct firmware *fw)  	/* look for the resource table */  	table = rproc_find_rsc_table(rproc, fw->data, fw->size, &tablesz); -	if (!table) +	if (!table) { +		ret = -EINVAL;  		goto clean_up; +	}  	/* handle fw resources which are required to boot rproc */  	ret = rproc_handle_boot_rsc(rproc, table, tablesz); diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c index 46ef5fe51db..0c73dd4f43a 100644 --- a/drivers/spi/spi-omap2-mcspi.c +++ b/drivers/spi/spi-omap2-mcspi.c @@ -801,7 +801,7 @@ static int omap2_mcspi_setup(struct spi_device *spi)  	mcspi_dma = &mcspi->dma_channels[spi->chip_select];  	if (!cs) { -		cs = devm_kzalloc(&spi->dev , sizeof *cs, GFP_KERNEL); +		cs = kzalloc(sizeof *cs, GFP_KERNEL);  		if (!cs)  			return -ENOMEM;  		cs->base = mcspi->base + spi->chip_select * 0x14; @@ -842,6 +842,7 @@ static void omap2_mcspi_cleanup(struct spi_device *spi)  		cs = spi->controller_state;  		list_del(&cs->node); +		kfree(cs);  	}  	if (spi->chip_select < spi->master->num_chipselect) { diff --git a/drivers/staging/comedi/drivers.c b/drivers/staging/comedi/drivers.c index 1c3d6386ea3..aeac1caba3f 100644 --- a/drivers/staging/comedi/drivers.c +++ b/drivers/staging/comedi/drivers.c @@ -30,6 +30,7 @@  #include <linux/pci.h>  #include <linux/usb.h>  #include <linux/errno.h> +#include <linux/kconfig.h>  #include <linux/kernel.h>  #include <linux/sched.h>  #include <linux/fcntl.h> @@ -981,6 +982,8 @@ void comedi_pci_driver_unregister(struct comedi_driver *comedi_driver,  }  EXPORT_SYMBOL_GPL(comedi_pci_driver_unregister); +#if IS_ENABLED(CONFIG_USB) +  static int comedi_old_usb_auto_config(struct usb_interface *intf,  				      struct comedi_driver *driver)  { @@ -1043,3 +1046,5 @@ void comedi_usb_driver_unregister(struct comedi_driver *comedi_driver,  	comedi_driver_unregister(comedi_driver);  }  EXPORT_SYMBOL_GPL(comedi_usb_driver_unregister); + +#endif diff --git a/drivers/staging/gdm72xx/netlink_k.c b/drivers/staging/gdm72xx/netlink_k.c index 292af0f7f45..51665132c61 100644 --- a/drivers/staging/gdm72xx/netlink_k.c +++ b/drivers/staging/gdm72xx/netlink_k.c @@ -104,7 +104,7 @@ struct sock *netlink_init(int unit, void (*cb)(struct net_device *dev, u16 type,  void netlink_exit(struct sock *sock)  { -	sock_release(sock->sk_socket); +	netlink_kernel_release(sock);  }  int netlink_send(struct sock *sock, int group, u16 type, void *msg, int len) diff --git a/drivers/staging/iio/Documentation/device.txt b/drivers/staging/iio/Documentation/device.txt index 0338c7cd0a8..f03fbd3bb45 100644 --- a/drivers/staging/iio/Documentation/device.txt +++ b/drivers/staging/iio/Documentation/device.txt @@ -29,8 +29,6 @@ Then fill in the following:  	* info->driver_module:  		Set to THIS_MODULE. Used to ensure correct ownership  		of various resources allocate by the core. -	* info->num_interrupt_lines: -		Number of event triggering hardware lines the device has.  	* info->event_attrs:  		Attributes used to enable / disable hardware events.  	* info->attrs: diff --git a/drivers/staging/iio/adc/Kconfig b/drivers/staging/iio/adc/Kconfig index 2490dd25093..8f1b3af02f2 100644 --- a/drivers/staging/iio/adc/Kconfig +++ b/drivers/staging/iio/adc/Kconfig @@ -13,6 +13,7 @@ config AD7291  config AD7298  	tristate "Analog Devices AD7298 ADC driver"  	depends on SPI +	select IIO_KFIFO_BUF if IIO_BUFFER  	help  	  Say yes here to build support for Analog Devices AD7298  	  8 Channel ADC with temperature sensor. diff --git a/drivers/staging/iio/adc/ad7606_core.c b/drivers/staging/iio/adc/ad7606_core.c index 10ab6dc823b..a13afff2dfe 100644 --- a/drivers/staging/iio/adc/ad7606_core.c +++ b/drivers/staging/iio/adc/ad7606_core.c @@ -235,7 +235,8 @@ static const struct attribute_group ad7606_attribute_group_range = {  		.indexed = 1,					\  		.channel = num,					\  		.address = num,					\ -		.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT,	\ +		.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |	\ +				IIO_CHAN_INFO_SCALE_SHARED_BIT, \  		.scan_index = num,				\  		.scan_type = IIO_ST('s', 16, 16, 0),		\  	} diff --git a/drivers/staging/omapdrm/omap_fbdev.c b/drivers/staging/omapdrm/omap_fbdev.c index 11acd4c35ed..8c6ed3b0c6f 100644 --- a/drivers/staging/omapdrm/omap_fbdev.c +++ b/drivers/staging/omapdrm/omap_fbdev.c @@ -208,7 +208,8 @@ static int omap_fbdev_create(struct drm_fb_helper *helper,  	 */  	ret = omap_gem_get_paddr(fbdev->bo, &paddr, true);  	if (ret) { -		dev_err(dev->dev, "could not map (paddr)!\n"); +		dev_err(dev->dev, +			"could not map (paddr)!  Skipping framebuffer alloc\n");  		ret = -ENOMEM;  		goto fail;  	} @@ -388,8 +389,11 @@ void omap_fbdev_free(struct drm_device *dev)  	fbi = helper->fbdev; -	unregister_framebuffer(fbi); -	framebuffer_release(fbi); +	/* only cleanup framebuffer if it is present */ +	if (fbi) { +		unregister_framebuffer(fbi); +		framebuffer_release(fbi); +	}  	drm_fb_helper_fini(helper); diff --git a/drivers/staging/rtl8712/usb_intf.c b/drivers/staging/rtl8712/usb_intf.c index 9bd18e2d051..69f616c6964 100644 --- a/drivers/staging/rtl8712/usb_intf.c +++ b/drivers/staging/rtl8712/usb_intf.c @@ -102,6 +102,8 @@ static struct usb_device_id rtl871x_usb_id_tbl[] = {  	/* - */  	{USB_DEVICE(0x20F4, 0x646B)},  	{USB_DEVICE(0x083A, 0xC512)}, +	{USB_DEVICE(0x25D4, 0x4CA1)}, +	{USB_DEVICE(0x25D4, 0x4CAB)},  /* RTL8191SU */  	/* Realtek */ diff --git a/drivers/tty/serial/8250/8250.c b/drivers/tty/serial/8250/8250.c index 47d061b9ad4..6e1958a325b 100644 --- a/drivers/tty/serial/8250/8250.c +++ b/drivers/tty/serial/8250/8250.c @@ -3113,7 +3113,7 @@ static struct uart_8250_port *serial8250_find_match_or_unused(struct uart_port *  /**   *	serial8250_register_8250_port - register a serial port - *	@port: serial port template + *	@up: serial port template   *   *	Configure the serial port specified by the request. If the   *	port exists and is in use, it is hung up and unregistered diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c index 4ad721fb840..c17923ec6e9 100644 --- a/drivers/tty/serial/amba-pl011.c +++ b/drivers/tty/serial/amba-pl011.c @@ -133,6 +133,10 @@ struct pl011_dmatx_data {  struct uart_amba_port {  	struct uart_port	port;  	struct clk		*clk; +	/* Two optional pin states - default & sleep */ +	struct pinctrl		*pinctrl; +	struct pinctrl_state	*pins_default; +	struct pinctrl_state	*pins_sleep;  	const struct vendor_data *vendor;  	unsigned int		dmacr;		/* dma control reg */  	unsigned int		im;		/* interrupt mask */ @@ -1312,6 +1316,14 @@ static int pl011_startup(struct uart_port *port)  	unsigned int cr;  	int retval; +	/* Optionaly enable pins to be muxed in and configured */ +	if (!IS_ERR(uap->pins_default)) { +		retval = pinctrl_select_state(uap->pinctrl, uap->pins_default); +		if (retval) +			dev_err(port->dev, +				"could not set default pins\n"); +	} +  	retval = clk_prepare(uap->clk);  	if (retval)  		goto out; @@ -1420,6 +1432,7 @@ static void pl011_shutdown(struct uart_port *port)  {  	struct uart_amba_port *uap = (struct uart_amba_port *)port;  	unsigned int cr; +	int retval;  	/*  	 * disable all interrupts @@ -1462,6 +1475,14 @@ static void pl011_shutdown(struct uart_port *port)  	 */  	clk_disable(uap->clk);  	clk_unprepare(uap->clk); +	/* Optionally let pins go into sleep states */ +	if (!IS_ERR(uap->pins_sleep)) { +		retval = pinctrl_select_state(uap->pinctrl, uap->pins_sleep); +		if (retval) +			dev_err(port->dev, +				"could not set pins to sleep state\n"); +	} +  	if (uap->port.dev->platform_data) {  		struct amba_pl011_data *plat; @@ -1792,6 +1813,14 @@ static int __init pl011_console_setup(struct console *co, char *options)  	if (!uap)  		return -ENODEV; +	/* Allow pins to be muxed in and configured */ +	if (!IS_ERR(uap->pins_default)) { +		ret = pinctrl_select_state(uap->pinctrl, uap->pins_default); +		if (ret) +			dev_err(uap->port.dev, +				"could not set default pins\n"); +	} +  	ret = clk_prepare(uap->clk);  	if (ret)  		return ret; @@ -1844,7 +1873,6 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id)  {  	struct uart_amba_port *uap;  	struct vendor_data *vendor = id->data; -	struct pinctrl *pinctrl;  	void __iomem *base;  	int i, ret; @@ -1869,11 +1897,20 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id)  		goto free;  	} -	pinctrl = devm_pinctrl_get_select_default(&dev->dev); -	if (IS_ERR(pinctrl)) { -		ret = PTR_ERR(pinctrl); +	uap->pinctrl = devm_pinctrl_get(&dev->dev); +	if (IS_ERR(uap->pinctrl)) { +		ret = PTR_ERR(uap->pinctrl);  		goto unmap;  	} +	uap->pins_default = pinctrl_lookup_state(uap->pinctrl, +						 PINCTRL_STATE_DEFAULT); +	if (IS_ERR(uap->pins_default)) +		dev_err(&dev->dev, "could not get default pinstate\n"); + +	uap->pins_sleep = pinctrl_lookup_state(uap->pinctrl, +					       PINCTRL_STATE_SLEEP); +	if (IS_ERR(uap->pins_sleep)) +		dev_dbg(&dev->dev, "could not get sleep pinstate\n");  	uap->clk = clk_get(&dev->dev, NULL);  	if (IS_ERR(uap->clk)) { diff --git a/drivers/tty/serial/serial_txx9.c b/drivers/tty/serial/serial_txx9.c index 34bd345da77..6ae2a58d62f 100644 --- a/drivers/tty/serial/serial_txx9.c +++ b/drivers/tty/serial/serial_txx9.c @@ -466,7 +466,7 @@ static void serial_txx9_break_ctl(struct uart_port *port, int break_state)  	spin_unlock_irqrestore(&up->port.lock, flags);  } -#if defined(CONFIG_SERIAL_TXX9_CONSOLE) || (CONFIG_CONSOLE_POLL) +#if defined(CONFIG_SERIAL_TXX9_CONSOLE) || defined(CONFIG_CONSOLE_POLL)  /*   *	Wait for transmitter & holding register to empty   */ diff --git a/drivers/watchdog/sp805_wdt.c b/drivers/watchdog/sp805_wdt.c index afcd1367654..e4841c36798 100644 --- a/drivers/watchdog/sp805_wdt.c +++ b/drivers/watchdog/sp805_wdt.c @@ -4,7 +4,7 @@   * Watchdog driver for ARM SP805 watchdog module   *   * Copyright (C) 2010 ST Microelectronics - * Viresh Kumar<viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2 or later. This program is licensed "as is" without any @@ -331,6 +331,6 @@ static struct amba_driver sp805_wdt_driver = {  module_amba_driver(sp805_wdt_driver); -MODULE_AUTHOR("Viresh Kumar <viresh.kumar@st.com>"); +MODULE_AUTHOR("Viresh Kumar <viresh.linux@gmail.com>");  MODULE_DESCRIPTION("ARM SP805 Watchdog Driver");  MODULE_LICENSE("GPL"); diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c index 8f7d1237b7a..7301cdb4b2c 100644 --- a/fs/btrfs/backref.c +++ b/fs/btrfs/backref.c @@ -179,61 +179,74 @@ static int __add_prelim_ref(struct list_head *head, u64 root_id,  static int add_all_parents(struct btrfs_root *root, struct btrfs_path *path,  				struct ulist *parents, int level, -				struct btrfs_key *key, u64 time_seq, +				struct btrfs_key *key_for_search, u64 time_seq,  				u64 wanted_disk_byte,  				const u64 *extent_item_pos)  { -	int ret; -	int slot = path->slots[level]; -	struct extent_buffer *eb = path->nodes[level]; +	int ret = 0; +	int slot; +	struct extent_buffer *eb; +	struct btrfs_key key;  	struct btrfs_file_extent_item *fi;  	struct extent_inode_elem *eie = NULL;  	u64 disk_byte; -	u64 wanted_objectid = key->objectid; -add_parent: -	if (level == 0 && extent_item_pos) { -		fi = btrfs_item_ptr(eb, slot, struct btrfs_file_extent_item); -		ret = check_extent_in_eb(key, eb, fi, *extent_item_pos, &eie); +	if (level != 0) { +		eb = path->nodes[level]; +		ret = ulist_add(parents, eb->start, 0, GFP_NOFS);  		if (ret < 0)  			return ret; -	} -	ret = ulist_add(parents, eb->start, (unsigned long)eie, GFP_NOFS); -	if (ret < 0) -		return ret; - -	if (level != 0)  		return 0; +	}  	/* -	 * if the current leaf is full with EXTENT_DATA items, we must -	 * check the next one if that holds a reference as well. -	 * ref->count cannot be used to skip this check. -	 * repeat this until we don't find any additional EXTENT_DATA items. +	 * We normally enter this function with the path already pointing to +	 * the first item to check. But sometimes, we may enter it with +	 * slot==nritems. In that case, go to the next leaf before we continue.  	 */ -	while (1) { -		eie = NULL; +	if (path->slots[0] >= btrfs_header_nritems(path->nodes[0]))  		ret = btrfs_next_old_leaf(root, path, time_seq); -		if (ret < 0) -			return ret; -		if (ret) -			return 0; +	while (!ret) {  		eb = path->nodes[0]; -		for (slot = 0; slot < btrfs_header_nritems(eb); ++slot) { -			btrfs_item_key_to_cpu(eb, key, slot); -			if (key->objectid != wanted_objectid || -			    key->type != BTRFS_EXTENT_DATA_KEY) -				return 0; -			fi = btrfs_item_ptr(eb, slot, -						struct btrfs_file_extent_item); -			disk_byte = btrfs_file_extent_disk_bytenr(eb, fi); -			if (disk_byte == wanted_disk_byte) -				goto add_parent; +		slot = path->slots[0]; + +		btrfs_item_key_to_cpu(eb, &key, slot); + +		if (key.objectid != key_for_search->objectid || +		    key.type != BTRFS_EXTENT_DATA_KEY) +			break; + +		fi = btrfs_item_ptr(eb, slot, struct btrfs_file_extent_item); +		disk_byte = btrfs_file_extent_disk_bytenr(eb, fi); + +		if (disk_byte == wanted_disk_byte) { +			eie = NULL; +			if (extent_item_pos) { +				ret = check_extent_in_eb(&key, eb, fi, +						*extent_item_pos, +						&eie); +				if (ret < 0) +					break; +			} +			if (!ret) { +				ret = ulist_add(parents, eb->start, +						(unsigned long)eie, GFP_NOFS); +				if (ret < 0) +					break; +				if (!extent_item_pos) { +					ret = btrfs_next_old_leaf(root, path, +							time_seq); +					continue; +				} +			}  		} +		ret = btrfs_next_old_item(root, path, time_seq);  	} -	return 0; +	if (ret > 0) +		ret = 0; +	return ret;  }  /* @@ -250,7 +263,6 @@ static int __resolve_indirect_ref(struct btrfs_fs_info *fs_info,  	struct btrfs_path *path;  	struct btrfs_root *root;  	struct btrfs_key root_key; -	struct btrfs_key key = {0};  	struct extent_buffer *eb;  	int ret = 0;  	int root_level; @@ -295,11 +307,9 @@ static int __resolve_indirect_ref(struct btrfs_fs_info *fs_info,  		goto out;  	} -	if (level == 0) -		btrfs_item_key_to_cpu(eb, &key, path->slots[0]); - -	ret = add_all_parents(root, path, parents, level, &key, time_seq, -				ref->wanted_disk_byte, extent_item_pos); +	ret = add_all_parents(root, path, parents, level, &ref->key_for_search, +				time_seq, ref->wanted_disk_byte, +				extent_item_pos);  out:  	btrfs_free_path(path);  	return ret; diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 8b73b2d4deb..fa5c45b3907 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h @@ -2755,13 +2755,18 @@ static inline int btrfs_insert_empty_item(struct btrfs_trans_handle *trans,  int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path);  int btrfs_next_old_leaf(struct btrfs_root *root, struct btrfs_path *path,  			u64 time_seq); -static inline int btrfs_next_item(struct btrfs_root *root, struct btrfs_path *p) +static inline int btrfs_next_old_item(struct btrfs_root *root, +				      struct btrfs_path *p, u64 time_seq)  {  	++p->slots[0];  	if (p->slots[0] >= btrfs_header_nritems(p->nodes[0])) -		return btrfs_next_leaf(root, p); +		return btrfs_next_old_leaf(root, p, time_seq);  	return 0;  } +static inline int btrfs_next_item(struct btrfs_root *root, struct btrfs_path *p) +{ +	return btrfs_next_old_item(root, p, 0); +}  int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path);  int btrfs_leaf_free_space(struct btrfs_root *root, struct extent_buffer *leaf);  int __must_check btrfs_drop_snapshot(struct btrfs_root *root, diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index e1890b1d307..7b845ff4af9 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -3426,6 +3426,7 @@ int btrfs_destroy_delayed_refs(struct btrfs_transaction *trans,  				mutex_unlock(&head->mutex);  				btrfs_put_delayed_ref(ref); +				spin_lock(&delayed_refs->lock);  				continue;  			} diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index a4f02501da4..d8bb0dbc494 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -987,7 +987,7 @@ static noinline void async_cow_start(struct btrfs_work *work)  			    async_cow->start, async_cow->end, async_cow,  			    &num_added);  	if (num_added == 0) { -		iput(async_cow->inode); +		btrfs_add_delayed_iput(async_cow->inode);  		async_cow->inode = NULL;  	}  } @@ -1023,7 +1023,7 @@ static noinline void async_cow_free(struct btrfs_work *work)  	struct async_cow *async_cow;  	async_cow = container_of(work, struct async_cow, work);  	if (async_cow->inode) -		iput(async_cow->inode); +		btrfs_add_delayed_iput(async_cow->inode);  	kfree(async_cow);  } diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c index 173b1d22e59..8b67304e4b8 100644 --- a/fs/ceph/addr.c +++ b/fs/ceph/addr.c @@ -54,7 +54,12 @@  	(CONGESTION_ON_THRESH(congestion_kb) -				\  	 (CONGESTION_ON_THRESH(congestion_kb) >> 2)) - +static inline struct ceph_snap_context *page_snap_context(struct page *page) +{ +	if (PagePrivate(page)) +		return (void *)page->private; +	return NULL; +}  /*   * Dirty a page.  Optimistically adjust accounting, on the assumption @@ -142,10 +147,9 @@ static void ceph_invalidatepage(struct page *page, unsigned long offset)  {  	struct inode *inode;  	struct ceph_inode_info *ci; -	struct ceph_snap_context *snapc = (void *)page->private; +	struct ceph_snap_context *snapc = page_snap_context(page);  	BUG_ON(!PageLocked(page)); -	BUG_ON(!page->private);  	BUG_ON(!PagePrivate(page));  	BUG_ON(!page->mapping); @@ -182,7 +186,6 @@ static int ceph_releasepage(struct page *page, gfp_t g)  	struct inode *inode = page->mapping ? page->mapping->host : NULL;  	dout("%p releasepage %p idx %lu\n", inode, page, page->index);  	WARN_ON(PageDirty(page)); -	WARN_ON(page->private);  	WARN_ON(PagePrivate(page));  	return 0;  } @@ -443,7 +446,7 @@ static int writepage_nounlock(struct page *page, struct writeback_control *wbc)  	osdc = &fsc->client->osdc;  	/* verify this is a writeable snap context */ -	snapc = (void *)page->private; +	snapc = page_snap_context(page);  	if (snapc == NULL) {  		dout("writepage %p page %p not dirty?\n", inode, page);  		goto out; @@ -451,7 +454,7 @@ static int writepage_nounlock(struct page *page, struct writeback_control *wbc)  	oldest = get_oldest_context(inode, &snap_size);  	if (snapc->seq > oldest->seq) {  		dout("writepage %p page %p snapc %p not writeable - noop\n", -		     inode, page, (void *)page->private); +		     inode, page, snapc);  		/* we should only noop if called by kswapd */  		WARN_ON((current->flags & PF_MEMALLOC) == 0);  		ceph_put_snap_context(oldest); @@ -591,7 +594,7 @@ static void writepages_finish(struct ceph_osd_request *req,  			clear_bdi_congested(&fsc->backing_dev_info,  					    BLK_RW_ASYNC); -		ceph_put_snap_context((void *)page->private); +		ceph_put_snap_context(page_snap_context(page));  		page->private = 0;  		ClearPagePrivate(page);  		dout("unlocking %d %p\n", i, page); @@ -795,7 +798,7 @@ get_more_pages:  			}  			/* only if matching snap context */ -			pgsnapc = (void *)page->private; +			pgsnapc = page_snap_context(page);  			if (pgsnapc->seq > snapc->seq) {  				dout("page snapc %p %lld > oldest %p %lld\n",  				     pgsnapc, pgsnapc->seq, snapc, snapc->seq); @@ -984,7 +987,7 @@ retry_locked:  	BUG_ON(!ci->i_snap_realm);  	down_read(&mdsc->snap_rwsem);  	BUG_ON(!ci->i_snap_realm->cached_context); -	snapc = (void *)page->private; +	snapc = page_snap_context(page);  	if (snapc && snapc != ci->i_head_snapc) {  		/*  		 * this page is already dirty in another (older) snap diff --git a/fs/exec.c b/fs/exec.c index a79786a8d2c..da27b91ff1e 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -819,10 +819,10 @@ static int exec_mmap(struct mm_struct *mm)  	/* Notify parent that we're no longer interested in the old VM */  	tsk = current;  	old_mm = current->mm; -	sync_mm_rss(old_mm);  	mm_release(tsk, old_mm);  	if (old_mm) { +		sync_mm_rss(old_mm);  		/*  		 * Make sure that if there is a core dump in progress  		 * for the old mm, we get out and die instead of going diff --git a/fs/hfsplus/ioctl.c b/fs/hfsplus/ioctl.c index c640ba57074..09addc8615f 100644 --- a/fs/hfsplus/ioctl.c +++ b/fs/hfsplus/ioctl.c @@ -31,6 +31,7 @@ static int hfsplus_ioctl_bless(struct file *file, int __user *user_flags)  	struct hfsplus_sb_info *sbi = HFSPLUS_SB(inode->i_sb);  	struct hfsplus_vh *vh = sbi->s_vhdr;  	struct hfsplus_vh *bvh = sbi->s_backup_vhdr; +	u32 cnid = (unsigned long)dentry->d_fsdata;  	if (!capable(CAP_SYS_ADMIN))  		return -EPERM; @@ -41,8 +42,12 @@ static int hfsplus_ioctl_bless(struct file *file, int __user *user_flags)  	vh->finder_info[0] = bvh->finder_info[0] =  		cpu_to_be32(parent_ino(dentry)); -	/* Bootloader */ -	vh->finder_info[1] = bvh->finder_info[1] = cpu_to_be32(inode->i_ino); +	/* +	 * Bootloader. Just using the inode here breaks in the case of +	 * hard links - the firmware wants the ID of the hard link file, +	 * but the inode points at the indirect inode +	 */ +	vh->finder_info[1] = bvh->finder_info[1] = cpu_to_be32(cnid);  	/* Per spec, the OS X system folder - same as finder_info[0] here */  	vh->finder_info[5] = bvh->finder_info[5] = diff --git a/fs/hfsplus/wrapper.c b/fs/hfsplus/wrapper.c index 7daf4b852d1..90effcccca9 100644 --- a/fs/hfsplus/wrapper.c +++ b/fs/hfsplus/wrapper.c @@ -56,7 +56,7 @@ int hfsplus_submit_bio(struct super_block *sb, sector_t sector,  	DECLARE_COMPLETION_ONSTACK(wait);  	struct bio *bio;  	int ret = 0; -	unsigned int io_size; +	u64 io_size;  	loff_t start;  	int offset; diff --git a/fs/nfs/client.c b/fs/nfs/client.c index 17ba6b99565..f005b5bebdc 100644 --- a/fs/nfs/client.c +++ b/fs/nfs/client.c @@ -207,7 +207,6 @@ error_0:  static void nfs4_shutdown_session(struct nfs_client *clp)  {  	if (nfs4_has_session(clp)) { -		nfs4_deviceid_purge_client(clp);  		nfs4_destroy_session(clp->cl_session);  		nfs4_destroy_clientid(clp);  	} diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index 3168f6e3d4d..9a4cbfc85d8 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c @@ -490,6 +490,7 @@ static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq)  			dreq->error = -EIO;  			spin_unlock(cinfo.lock);  		} +		nfs_release_request(req);  	}  	nfs_pageio_complete(&desc); diff --git a/fs/nfs/idmap.c b/fs/nfs/idmap.c index b5b86a05059..864c51e4b40 100644 --- a/fs/nfs/idmap.c +++ b/fs/nfs/idmap.c @@ -57,6 +57,11 @@ unsigned int nfs_idmap_cache_timeout = 600;  static const struct cred *id_resolver_cache;  static struct key_type key_type_id_resolver_legacy; +struct idmap { +	struct rpc_pipe		*idmap_pipe; +	struct key_construction	*idmap_key_cons; +	struct mutex		idmap_mutex; +};  /**   * nfs_fattr_init_names - initialise the nfs_fattr owner_name/group_name fields @@ -310,9 +315,11 @@ static ssize_t nfs_idmap_get_key(const char *name, size_t namelen,  					    name, namelen, type, data,  					    data_size, NULL);  	if (ret < 0) { +		mutex_lock(&idmap->idmap_mutex);  		ret = nfs_idmap_request_key(&key_type_id_resolver_legacy,  					    name, namelen, type, data,  					    data_size, idmap); +		mutex_unlock(&idmap->idmap_mutex);  	}  	return ret;  } @@ -354,11 +361,6 @@ static int nfs_idmap_lookup_id(const char *name, size_t namelen, const char *typ  /* idmap classic begins here */  module_param(nfs_idmap_cache_timeout, int, 0644); -struct idmap { -	struct rpc_pipe		*idmap_pipe; -	struct key_construction	*idmap_key_cons; -}; -  enum {  	Opt_find_uid, Opt_find_gid, Opt_find_user, Opt_find_group, Opt_find_err  }; @@ -469,6 +471,7 @@ nfs_idmap_new(struct nfs_client *clp)  		return error;  	}  	idmap->idmap_pipe = pipe; +	mutex_init(&idmap->idmap_mutex);  	clp->cl_idmap = idmap;  	return 0; diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index e605d695dbc..f7296983eba 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -1530,7 +1530,6 @@ static inline void nfs4_init_once(struct nfs_inode *nfsi)  	nfsi->delegation_state = 0;  	init_rwsem(&nfsi->rwsem);  	nfsi->layout = NULL; -	atomic_set(&nfsi->commit_info.rpcs_out, 0);  #endif  } @@ -1545,6 +1544,7 @@ static void init_once(void *foo)  	INIT_LIST_HEAD(&nfsi->commit_info.list);  	nfsi->npages = 0;  	nfsi->commit_info.ncommit = 0; +	atomic_set(&nfsi->commit_info.rpcs_out, 0);  	atomic_set(&nfsi->silly_count, 1);  	INIT_HLIST_HEAD(&nfsi->silly_list);  	init_waitqueue_head(&nfsi->waitqueue); diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c index b8323aa7b54..bbc49caa7a8 100644 --- a/fs/nfs/pnfs.c +++ b/fs/nfs/pnfs.c @@ -70,6 +70,10 @@ find_pnfs_driver(u32 id)  	spin_lock(&pnfs_spinlock);  	local = find_pnfs_driver_locked(id); +	if (local != NULL && !try_module_get(local->owner)) { +		dprintk("%s: Could not grab reference on module\n", __func__); +		local = NULL; +	}  	spin_unlock(&pnfs_spinlock);  	return local;  } @@ -80,6 +84,9 @@ unset_pnfs_layoutdriver(struct nfs_server *nfss)  	if (nfss->pnfs_curr_ld) {  		if (nfss->pnfs_curr_ld->clear_layoutdriver)  			nfss->pnfs_curr_ld->clear_layoutdriver(nfss); +		/* Decrement the MDS count. Purge the deviceid cache if zero */ +		if (atomic_dec_and_test(&nfss->nfs_client->cl_mds_count)) +			nfs4_deviceid_purge_client(nfss->nfs_client);  		module_put(nfss->pnfs_curr_ld->owner);  	}  	nfss->pnfs_curr_ld = NULL; @@ -115,10 +122,6 @@ set_pnfs_layoutdriver(struct nfs_server *server, const struct nfs_fh *mntfh,  			goto out_no_driver;  		}  	} -	if (!try_module_get(ld_type->owner)) { -		dprintk("%s: Could not grab reference on module\n", __func__); -		goto out_no_driver; -	}  	server->pnfs_curr_ld = ld_type;  	if (ld_type->set_layoutdriver  	    && ld_type->set_layoutdriver(server, mntfh)) { @@ -127,6 +130,8 @@ set_pnfs_layoutdriver(struct nfs_server *server, const struct nfs_fh *mntfh,  		module_put(ld_type->owner);  		goto out_no_driver;  	} +	/* Bump the MDS count */ +	atomic_inc(&server->nfs_client->cl_mds_count);  	dprintk("%s: pNFS module for %u set\n", __func__, id);  	return; diff --git a/fs/nilfs2/gcinode.c b/fs/nilfs2/gcinode.c index 08a07a218d2..57ceaf33d17 100644 --- a/fs/nilfs2/gcinode.c +++ b/fs/nilfs2/gcinode.c @@ -191,6 +191,8 @@ void nilfs_remove_all_gcinodes(struct the_nilfs *nilfs)  	while (!list_empty(head)) {  		ii = list_first_entry(head, struct nilfs_inode_info, i_dirty);  		list_del_init(&ii->i_dirty); +		truncate_inode_pages(&ii->vfs_inode.i_data, 0); +		nilfs_btnode_cache_clear(&ii->i_btnode_cache);  		iput(&ii->vfs_inode);  	}  } diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c index 0e72ad6f22a..88e11fb346b 100644 --- a/fs/nilfs2/segment.c +++ b/fs/nilfs2/segment.c @@ -2309,6 +2309,8 @@ nilfs_remove_written_gcinodes(struct the_nilfs *nilfs, struct list_head *head)  		if (!test_bit(NILFS_I_UPDATED, &ii->i_state))  			continue;  		list_del_init(&ii->i_dirty); +		truncate_inode_pages(&ii->vfs_inode.i_data, 0); +		nilfs_btnode_cache_clear(&ii->i_btnode_cache);  		iput(&ii->vfs_inode);  	}  } diff --git a/fs/pstore/inode.c b/fs/pstore/inode.c index aeb19e68e08..11a2aa2a56c 100644 --- a/fs/pstore/inode.c +++ b/fs/pstore/inode.c @@ -258,7 +258,7 @@ fail:  	return rc;  } -int pstore_fill_super(struct super_block *sb, void *data, int silent) +static int pstore_fill_super(struct super_block *sb, void *data, int silent)  {  	struct inode *inode; diff --git a/fs/pstore/platform.c b/fs/pstore/platform.c index 82c585f715e..03ce7a9b81c 100644 --- a/fs/pstore/platform.c +++ b/fs/pstore/platform.c @@ -94,20 +94,15 @@ static const char *get_reason_str(enum kmsg_dump_reason reason)   * as we can from the end of the buffer.   */  static void pstore_dump(struct kmsg_dumper *dumper, -	    enum kmsg_dump_reason reason, -	    const char *s1, unsigned long l1, -	    const char *s2, unsigned long l2) +			enum kmsg_dump_reason reason)  { -	unsigned long	s1_start, s2_start; -	unsigned long	l1_cpy, l2_cpy; -	unsigned long	size, total = 0; -	char		*dst; +	unsigned long	total = 0;  	const char	*why;  	u64		id; -	int		hsize, ret;  	unsigned int	part = 1;  	unsigned long	flags = 0;  	int		is_locked = 0; +	int		ret;  	why = get_reason_str(reason); @@ -119,30 +114,25 @@ static void pstore_dump(struct kmsg_dumper *dumper,  		spin_lock_irqsave(&psinfo->buf_lock, flags);  	oopscount++;  	while (total < kmsg_bytes) { +		char *dst; +		unsigned long size; +		int hsize; +		size_t len; +  		dst = psinfo->buf;  		hsize = sprintf(dst, "%s#%d Part%d\n", why, oopscount, part);  		size = psinfo->bufsize - hsize;  		dst += hsize; -		l2_cpy = min(l2, size); -		l1_cpy = min(l1, size - l2_cpy); - -		if (l1_cpy + l2_cpy == 0) +		if (!kmsg_dump_get_buffer(dumper, true, dst, size, &len))  			break; -		s2_start = l2 - l2_cpy; -		s1_start = l1 - l1_cpy; - -		memcpy(dst, s1 + s1_start, l1_cpy); -		memcpy(dst + l1_cpy, s2 + s2_start, l2_cpy); -  		ret = psinfo->write(PSTORE_TYPE_DMESG, reason, &id, part, -				   hsize + l1_cpy + l2_cpy, psinfo); +				    hsize + len, psinfo);  		if (ret == 0 && reason == KMSG_DUMP_OOPS && pstore_is_mounted())  			pstore_new_entry = 1; -		l1 -= l1_cpy; -		l2 -= l2_cpy; -		total += l1_cpy + l2_cpy; + +		total += hsize + len;  		part++;  	}  	if (in_nmi()) { diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c index 9123cce28c1..453030f9c5b 100644 --- a/fs/pstore/ram.c +++ b/fs/pstore/ram.c @@ -106,6 +106,8 @@ static ssize_t ramoops_pstore_read(u64 *id, enum pstore_type_id *type,  	time->tv_sec = 0;  	time->tv_nsec = 0; +	/* Update old/shadowed buffer. */ +	persistent_ram_save_old(prz);  	size = persistent_ram_old_size(prz);  	*buf = kmalloc(size, GFP_KERNEL);  	if (*buf == NULL) @@ -184,6 +186,7 @@ static int ramoops_pstore_erase(enum pstore_type_id type, u64 id,  		return -EINVAL;  	persistent_ram_free_old(cxt->przs[id]); +	persistent_ram_zap(cxt->przs[id]);  	return 0;  } diff --git a/fs/pstore/ram_core.c b/fs/pstore/ram_core.c index 31f8d184f3a..c5fbdbbf81a 100644 --- a/fs/pstore/ram_core.c +++ b/fs/pstore/ram_core.c @@ -250,23 +250,24 @@ static void notrace persistent_ram_update(struct persistent_ram_zone *prz,  	persistent_ram_update_ecc(prz, start, count);  } -static void __init -persistent_ram_save_old(struct persistent_ram_zone *prz) +void persistent_ram_save_old(struct persistent_ram_zone *prz)  {  	struct persistent_ram_buffer *buffer = prz->buffer;  	size_t size = buffer_size(prz);  	size_t start = buffer_start(prz); -	char *dest; -	persistent_ram_ecc_old(prz); +	if (!size) +		return; -	dest = kmalloc(size, GFP_KERNEL); -	if (dest == NULL) { +	if (!prz->old_log) { +		persistent_ram_ecc_old(prz); +		prz->old_log = kmalloc(size, GFP_KERNEL); +	} +	if (!prz->old_log) {  		pr_err("persistent_ram: failed to allocate buffer\n");  		return;  	} -	prz->old_log = dest;  	prz->old_log_size = size;  	memcpy(prz->old_log, &buffer->data[start], size - start);  	memcpy(prz->old_log + size - start, &buffer->data[0], start); @@ -319,6 +320,13 @@ void persistent_ram_free_old(struct persistent_ram_zone *prz)  	prz->old_log_size = 0;  } +void persistent_ram_zap(struct persistent_ram_zone *prz) +{ +	atomic_set(&prz->buffer->start, 0); +	atomic_set(&prz->buffer->size, 0); +	persistent_ram_update_header_ecc(prz); +} +  static void *persistent_ram_vmap(phys_addr_t start, size_t size)  {  	struct page **pages; @@ -405,6 +413,7 @@ static int __init persistent_ram_post_init(struct persistent_ram_zone *prz, bool  				" size %zu, start %zu\n",  			       buffer_size(prz), buffer_start(prz));  			persistent_ram_save_old(prz); +			return 0;  		}  	} else {  		pr_info("persistent_ram: no valid data in buffer" @@ -412,8 +421,7 @@ static int __init persistent_ram_post_init(struct persistent_ram_zone *prz, bool  	}  	prz->buffer->sig = PERSISTENT_RAM_SIG; -	atomic_set(&prz->buffer->start, 0); -	atomic_set(&prz->buffer->size, 0); +	persistent_ram_zap(prz);  	return 0;  } @@ -448,7 +456,6 @@ struct persistent_ram_zone * __init persistent_ram_new(phys_addr_t start,  		goto err;  	persistent_ram_post_init(prz, ecc); -	persistent_ram_update_header_ecc(prz);  	return prz;  err: diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c index 229641fb8e6..9d1aeb7e273 100644 --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -1080,6 +1080,7 @@ restart:  			goto restart;  		} +		xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);  		trace_xfs_alloc_size_neither(args);  		args->agbno = NULLAGBLOCK;  		return 0; @@ -2441,7 +2442,7 @@ xfs_alloc_vextent(  	DECLARE_COMPLETION_ONSTACK(done);  	args->done = &done; -	INIT_WORK(&args->work, xfs_alloc_vextent_worker); +	INIT_WORK_ONSTACK(&args->work, xfs_alloc_vextent_worker);  	queue_work(xfs_alloc_wq, &args->work);  	wait_for_completion(&done);  	return args->result; diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index ae31c313a79..8dad722c004 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -981,10 +981,15 @@ xfs_vm_writepage(  				imap_valid = 0;  			}  		} else { -			if (PageUptodate(page)) { +			if (PageUptodate(page))  				ASSERT(buffer_mapped(bh)); -				imap_valid = 0; -			} +			/* +			 * This buffer is not uptodate and will not be +			 * written to disk.  Ensure that we will put any +			 * subsequent writeable buffers into a new +			 * ioend. +			 */ +			imap_valid = 0;  			continue;  		} diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 172d3cc8f8c..a4beb421018 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -201,14 +201,7 @@ xfs_buf_alloc(  	bp->b_length = numblks;  	bp->b_io_length = numblks;  	bp->b_flags = flags; - -	/* -	 * We do not set the block number here in the buffer because we have not -	 * finished initialising the buffer. We insert the buffer into the cache -	 * in this state, so this ensures that we are unable to do IO on a -	 * buffer that hasn't been fully initialised. -	 */ -	bp->b_bn = XFS_BUF_DADDR_NULL; +	bp->b_bn = blkno;  	atomic_set(&bp->b_pin_count, 0);  	init_waitqueue_head(&bp->b_waiters); @@ -567,11 +560,6 @@ xfs_buf_get(  	if (bp != new_bp)  		xfs_buf_free(new_bp); -	/* -	 * Now we have a workable buffer, fill in the block number so -	 * that we can do IO on it. -	 */ -	bp->b_bn = blkno;  	bp->b_io_length = bp->b_length;  found: @@ -772,7 +760,7 @@ xfs_buf_get_uncached(  	int			error, i;  	xfs_buf_t		*bp; -	bp = xfs_buf_alloc(target, 0, numblks, 0); +	bp = xfs_buf_alloc(target, XFS_BUF_DADDR_NULL, numblks, 0);  	if (unlikely(bp == NULL))  		goto fail; diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index 6cdbf90c6f7..d041d47d9d8 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -505,6 +505,14 @@ xfs_inode_item_push(  	}  	/* +	 * Stale inode items should force out the iclog. +	 */ +	if (ip->i_flags & XFS_ISTALE) { +		rval = XFS_ITEM_PINNED; +		goto out_unlock; +	} + +	/*  	 * Someone else is already flushing the inode.  Nothing we can do  	 * here but wait for the flush to finish and remove the item from  	 * the AIL. @@ -514,15 +522,6 @@ xfs_inode_item_push(  		goto out_unlock;  	} -	/* -	 * Stale inode items should force out the iclog. -	 */ -	if (ip->i_flags & XFS_ISTALE) { -		xfs_ifunlock(ip); -		xfs_iunlock(ip, XFS_ILOCK_SHARED); -		return XFS_ITEM_PINNED; -	} -  	ASSERT(iip->ili_fields != 0 || XFS_FORCED_SHUTDOWN(ip->i_mount));  	ASSERT(iip->ili_logged == 0 || XFS_FORCED_SHUTDOWN(ip->i_mount)); diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index f30d9807dc4..d90d4a38860 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -38,13 +38,21 @@  kmem_zone_t	*xfs_log_ticket_zone;  /* Local miscellaneous function prototypes */ -STATIC int	 xlog_commit_record(struct log *log, struct xlog_ticket *ticket, -				    xlog_in_core_t **, xfs_lsn_t *); +STATIC int +xlog_commit_record( +	struct xlog		*log, +	struct xlog_ticket	*ticket, +	struct xlog_in_core	**iclog, +	xfs_lsn_t		*commitlsnp); +  STATIC xlog_t *  xlog_alloc_log(xfs_mount_t	*mp,  				xfs_buftarg_t	*log_target,  				xfs_daddr_t	blk_offset,  				int		num_bblks); -STATIC int	 xlog_space_left(struct log *log, atomic64_t *head); +STATIC int +xlog_space_left( +	struct xlog		*log, +	atomic64_t		*head);  STATIC int	 xlog_sync(xlog_t *log, xlog_in_core_t *iclog);  STATIC void	 xlog_dealloc_log(xlog_t *log); @@ -64,8 +72,10 @@ STATIC void xlog_state_switch_iclogs(xlog_t		*log,  				     int		eventual_size);  STATIC void xlog_state_want_sync(xlog_t	*log, xlog_in_core_t *iclog); -STATIC void xlog_grant_push_ail(struct log	*log, -				int		need_bytes); +STATIC void +xlog_grant_push_ail( +	struct xlog	*log, +	int		need_bytes);  STATIC void xlog_regrant_reserve_log_space(xlog_t	 *log,  					   xlog_ticket_t *ticket);  STATIC void xlog_ungrant_log_space(xlog_t	 *log, @@ -73,7 +83,9 @@ STATIC void xlog_ungrant_log_space(xlog_t	 *log,  #if defined(DEBUG)  STATIC void	xlog_verify_dest_ptr(xlog_t *log, char *ptr); -STATIC void	xlog_verify_grant_tail(struct log *log); +STATIC void +xlog_verify_grant_tail( +	struct xlog	*log);  STATIC void	xlog_verify_iclog(xlog_t *log, xlog_in_core_t *iclog,  				  int count, boolean_t syncing);  STATIC void	xlog_verify_tail_lsn(xlog_t *log, xlog_in_core_t *iclog, @@ -89,9 +101,9 @@ STATIC int	xlog_iclogs_empty(xlog_t *log);  static void  xlog_grant_sub_space( -	struct log	*log, -	atomic64_t	*head, -	int		bytes) +	struct xlog		*log, +	atomic64_t		*head, +	int			bytes)  {  	int64_t	head_val = atomic64_read(head);  	int64_t new, old; @@ -115,9 +127,9 @@ xlog_grant_sub_space(  static void  xlog_grant_add_space( -	struct log	*log, -	atomic64_t	*head, -	int		bytes) +	struct xlog		*log, +	atomic64_t		*head, +	int			bytes)  {  	int64_t	head_val = atomic64_read(head);  	int64_t new, old; @@ -165,7 +177,7 @@ xlog_grant_head_wake_all(  static inline int  xlog_ticket_reservation( -	struct log		*log, +	struct xlog		*log,  	struct xlog_grant_head	*head,  	struct xlog_ticket	*tic)  { @@ -182,7 +194,7 @@ xlog_ticket_reservation(  STATIC bool  xlog_grant_head_wake( -	struct log		*log, +	struct xlog		*log,  	struct xlog_grant_head	*head,  	int			*free_bytes)  { @@ -204,7 +216,7 @@ xlog_grant_head_wake(  STATIC int  xlog_grant_head_wait( -	struct log		*log, +	struct xlog		*log,  	struct xlog_grant_head	*head,  	struct xlog_ticket	*tic,  	int			need_bytes) @@ -256,7 +268,7 @@ shutdown:   */  STATIC int  xlog_grant_head_check( -	struct log		*log, +	struct xlog		*log,  	struct xlog_grant_head	*head,  	struct xlog_ticket	*tic,  	int			*need_bytes) @@ -323,7 +335,7 @@ xfs_log_regrant(  	struct xfs_mount	*mp,  	struct xlog_ticket	*tic)  { -	struct log		*log = mp->m_log; +	struct xlog		*log = mp->m_log;  	int			need_bytes;  	int			error = 0; @@ -389,7 +401,7 @@ xfs_log_reserve(  	bool			permanent,  	uint		 	t_type)  { -	struct log		*log = mp->m_log; +	struct xlog		*log = mp->m_log;  	struct xlog_ticket	*tic;  	int			need_bytes;  	int			error = 0; @@ -465,7 +477,7 @@ xfs_log_done(  	struct xlog_in_core	**iclog,  	uint			flags)  { -	struct log		*log = mp->m_log; +	struct xlog		*log = mp->m_log;  	xfs_lsn_t		lsn = 0;  	if (XLOG_FORCED_SHUTDOWN(log) || @@ -810,6 +822,7 @@ xfs_log_unmount_write(xfs_mount_t *mp)  void  xfs_log_unmount(xfs_mount_t *mp)  { +	cancel_delayed_work_sync(&mp->m_sync_work);  	xfs_trans_ail_destroy(mp);  	xlog_dealloc_log(mp->m_log);  } @@ -838,7 +851,7 @@ void  xfs_log_space_wake(  	struct xfs_mount	*mp)  { -	struct log		*log = mp->m_log; +	struct xlog		*log = mp->m_log;  	int			free_bytes;  	if (XLOG_FORCED_SHUTDOWN(log)) @@ -916,7 +929,7 @@ xfs_lsn_t  xlog_assign_tail_lsn_locked(  	struct xfs_mount	*mp)  { -	struct log		*log = mp->m_log; +	struct xlog		*log = mp->m_log;  	struct xfs_log_item	*lip;  	xfs_lsn_t		tail_lsn; @@ -965,7 +978,7 @@ xlog_assign_tail_lsn(   */  STATIC int  xlog_space_left( -	struct log	*log, +	struct xlog	*log,  	atomic64_t	*head)  {  	int		free_bytes; @@ -1277,7 +1290,7 @@ out:   */  STATIC int  xlog_commit_record( -	struct log		*log, +	struct xlog		*log,  	struct xlog_ticket	*ticket,  	struct xlog_in_core	**iclog,  	xfs_lsn_t		*commitlsnp) @@ -1311,7 +1324,7 @@ xlog_commit_record(   */  STATIC void  xlog_grant_push_ail( -	struct log	*log, +	struct xlog	*log,  	int		need_bytes)  {  	xfs_lsn_t	threshold_lsn = 0; @@ -1790,7 +1803,7 @@ xlog_write_start_rec(  static xlog_op_header_t *  xlog_write_setup_ophdr( -	struct log		*log, +	struct xlog		*log,  	struct xlog_op_header	*ophdr,  	struct xlog_ticket	*ticket,  	uint			flags) @@ -1873,7 +1886,7 @@ xlog_write_setup_copy(  static int  xlog_write_copy_finish( -	struct log		*log, +	struct xlog		*log,  	struct xlog_in_core	*iclog,  	uint			flags,  	int			*record_cnt, @@ -1958,7 +1971,7 @@ xlog_write_copy_finish(   */  int  xlog_write( -	struct log		*log, +	struct xlog		*log,  	struct xfs_log_vec	*log_vector,  	struct xlog_ticket	*ticket,  	xfs_lsn_t		*start_lsn, @@ -2821,7 +2834,7 @@ _xfs_log_force(  	uint			flags,  	int			*log_flushed)  { -	struct log		*log = mp->m_log; +	struct xlog		*log = mp->m_log;  	struct xlog_in_core	*iclog;  	xfs_lsn_t		lsn; @@ -2969,7 +2982,7 @@ _xfs_log_force_lsn(  	uint			flags,  	int			*log_flushed)  { -	struct log		*log = mp->m_log; +	struct xlog		*log = mp->m_log;  	struct xlog_in_core	*iclog;  	int			already_slept = 0; @@ -3147,7 +3160,7 @@ xfs_log_ticket_get(   */  xlog_ticket_t *  xlog_ticket_alloc( -	struct log	*log, +	struct xlog	*log,  	int		unit_bytes,  	int		cnt,  	char		client, @@ -3278,7 +3291,7 @@ xlog_ticket_alloc(   */  void  xlog_verify_dest_ptr( -	struct log	*log, +	struct xlog	*log,  	char		*ptr)  {  	int i; @@ -3307,7 +3320,7 @@ xlog_verify_dest_ptr(   */  STATIC void  xlog_verify_grant_tail( -	struct log	*log) +	struct xlog	*log)  {  	int		tail_cycle, tail_blocks;  	int		cycle, space; diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index 7d6197c5849..ddc4529d07d 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -44,7 +44,7 @@   */  static struct xlog_ticket *  xlog_cil_ticket_alloc( -	struct log	*log) +	struct xlog	*log)  {  	struct xlog_ticket *tic; @@ -72,7 +72,7 @@ xlog_cil_ticket_alloc(   */  void  xlog_cil_init_post_recovery( -	struct log	*log) +	struct xlog	*log)  {  	log->l_cilp->xc_ctx->ticket = xlog_cil_ticket_alloc(log);  	log->l_cilp->xc_ctx->sequence = 1; @@ -182,7 +182,7 @@ xlog_cil_prepare_log_vecs(   */  STATIC void  xfs_cil_prepare_item( -	struct log		*log, +	struct xlog		*log,  	struct xfs_log_vec	*lv,  	int			*len,  	int			*diff_iovecs) @@ -231,7 +231,7 @@ xfs_cil_prepare_item(   */  static void  xlog_cil_insert_items( -	struct log		*log, +	struct xlog		*log,  	struct xfs_log_vec	*log_vector,  	struct xlog_ticket	*ticket)  { @@ -373,7 +373,7 @@ xlog_cil_committed(   */  STATIC int  xlog_cil_push( -	struct log		*log) +	struct xlog		*log)  {  	struct xfs_cil		*cil = log->l_cilp;  	struct xfs_log_vec	*lv; @@ -601,7 +601,7 @@ xlog_cil_push_work(   */  static void  xlog_cil_push_background( -	struct log	*log) +	struct xlog	*log)  {  	struct xfs_cil	*cil = log->l_cilp; @@ -629,7 +629,7 @@ xlog_cil_push_background(  static void  xlog_cil_push_foreground( -	struct log	*log, +	struct xlog	*log,  	xfs_lsn_t	push_seq)  {  	struct xfs_cil	*cil = log->l_cilp; @@ -683,7 +683,7 @@ xfs_log_commit_cil(  	xfs_lsn_t		*commit_lsn,  	int			flags)  { -	struct log		*log = mp->m_log; +	struct xlog		*log = mp->m_log;  	int			log_flags = 0;  	struct xfs_log_vec	*log_vector; @@ -754,7 +754,7 @@ xfs_log_commit_cil(   */  xfs_lsn_t  xlog_cil_force_lsn( -	struct log	*log, +	struct xlog	*log,  	xfs_lsn_t	sequence)  {  	struct xfs_cil		*cil = log->l_cilp; @@ -833,7 +833,7 @@ xfs_log_item_in_current_chkpt(   */  int  xlog_cil_init( -	struct log	*log) +	struct xlog	*log)  {  	struct xfs_cil	*cil;  	struct xfs_cil_ctx *ctx; @@ -869,7 +869,7 @@ xlog_cil_init(  void  xlog_cil_destroy( -	struct log	*log) +	struct xlog	*log)  {  	if (log->l_cilp->xc_ctx) {  		if (log->l_cilp->xc_ctx->ticket) diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index 5bc33261f5b..72eba2201b1 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -19,7 +19,7 @@  #define __XFS_LOG_PRIV_H__  struct xfs_buf; -struct log; +struct xlog;  struct xlog_ticket;  struct xfs_mount; @@ -352,7 +352,7 @@ typedef struct xlog_in_core {  	struct xlog_in_core	*ic_next;  	struct xlog_in_core	*ic_prev;  	struct xfs_buf		*ic_bp; -	struct log		*ic_log; +	struct xlog		*ic_log;  	int			ic_size;  	int			ic_offset;  	int			ic_bwritecnt; @@ -409,7 +409,7 @@ struct xfs_cil_ctx {   * operations almost as efficient as the old logging methods.   */  struct xfs_cil { -	struct log		*xc_log; +	struct xlog		*xc_log;  	struct list_head	xc_cil;  	spinlock_t		xc_cil_lock;  	struct xfs_cil_ctx	*xc_ctx; @@ -487,7 +487,7 @@ struct xlog_grant_head {   * overflow 31 bits worth of byte offset, so using a byte number will mean   * that round off problems won't occur when releasing partial reservations.   */ -typedef struct log { +typedef struct xlog {  	/* The following fields don't need locking */  	struct xfs_mount	*l_mp;	        /* mount point */  	struct xfs_ail		*l_ailp;	/* AIL log is working with */ @@ -553,9 +553,14 @@ extern int	 xlog_recover_finish(xlog_t *log);  extern void	 xlog_pack_data(xlog_t *log, xlog_in_core_t *iclog, int);  extern kmem_zone_t *xfs_log_ticket_zone; -struct xlog_ticket *xlog_ticket_alloc(struct log *log, int unit_bytes, -				int count, char client, bool permanent, -				xfs_km_flags_t alloc_flags); +struct xlog_ticket * +xlog_ticket_alloc( +	struct xlog	*log, +	int		unit_bytes, +	int		count, +	char		client, +	bool		permanent, +	xfs_km_flags_t	alloc_flags);  static inline void @@ -567,9 +572,14 @@ xlog_write_adv_cnt(void **ptr, int *len, int *off, size_t bytes)  }  void	xlog_print_tic_res(struct xfs_mount *mp, struct xlog_ticket *ticket); -int	xlog_write(struct log *log, struct xfs_log_vec *log_vector, -				struct xlog_ticket *tic, xfs_lsn_t *start_lsn, -				xlog_in_core_t **commit_iclog, uint flags); +int +xlog_write( +	struct xlog		*log, +	struct xfs_log_vec	*log_vector, +	struct xlog_ticket	*tic, +	xfs_lsn_t		*start_lsn, +	struct xlog_in_core	**commit_iclog, +	uint			flags);  /*   * When we crack an atomic LSN, we sample it first so that the value will not @@ -629,17 +639,23 @@ xlog_assign_grant_head(atomic64_t *head, int cycle, int space)  /*   * Committed Item List interfaces   */ -int	xlog_cil_init(struct log *log); -void	xlog_cil_init_post_recovery(struct log *log); -void	xlog_cil_destroy(struct log *log); +int +xlog_cil_init(struct xlog *log); +void +xlog_cil_init_post_recovery(struct xlog *log); +void +xlog_cil_destroy(struct xlog *log);  /*   * CIL force routines   */ -xfs_lsn_t xlog_cil_force_lsn(struct log *log, xfs_lsn_t sequence); +xfs_lsn_t +xlog_cil_force_lsn( +	struct xlog *log, +	xfs_lsn_t sequence);  static inline void -xlog_cil_force(struct log *log) +xlog_cil_force(struct xlog *log)  {  	xlog_cil_force_lsn(log, log->l_cilp->xc_current_sequence);  } diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index ca386909131..a7be98abd6a 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1471,8 +1471,8 @@ xlog_recover_add_item(  STATIC int  xlog_recover_add_to_cont_trans( -	struct log		*log, -	xlog_recover_t		*trans, +	struct xlog		*log, +	struct xlog_recover	*trans,  	xfs_caddr_t		dp,  	int			len)  { @@ -1517,8 +1517,8 @@ xlog_recover_add_to_cont_trans(   */  STATIC int  xlog_recover_add_to_trans( -	struct log		*log, -	xlog_recover_t		*trans, +	struct xlog		*log, +	struct xlog_recover	*trans,  	xfs_caddr_t		dp,  	int			len)  { @@ -1588,8 +1588,8 @@ xlog_recover_add_to_trans(   */  STATIC int  xlog_recover_reorder_trans( -	struct log		*log, -	xlog_recover_t		*trans, +	struct xlog		*log, +	struct xlog_recover	*trans,  	int			pass)  {  	xlog_recover_item_t	*item, *n; @@ -1642,8 +1642,8 @@ xlog_recover_reorder_trans(   */  STATIC int  xlog_recover_buffer_pass1( -	struct log		*log, -	xlog_recover_item_t	*item) +	struct xlog			*log, +	struct xlog_recover_item	*item)  {  	xfs_buf_log_format_t	*buf_f = item->ri_buf[0].i_addr;  	struct list_head	*bucket; @@ -1696,7 +1696,7 @@ xlog_recover_buffer_pass1(   */  STATIC int  xlog_check_buffer_cancelled( -	struct log		*log, +	struct xlog		*log,  	xfs_daddr_t		blkno,  	uint			len,  	ushort			flags) @@ -2689,9 +2689,9 @@ xlog_recover_free_trans(  STATIC int  xlog_recover_commit_pass1( -	struct log		*log, -	struct xlog_recover	*trans, -	xlog_recover_item_t	*item) +	struct xlog			*log, +	struct xlog_recover		*trans, +	struct xlog_recover_item	*item)  {  	trace_xfs_log_recover_item_recover(log, trans, item, XLOG_RECOVER_PASS1); @@ -2716,10 +2716,10 @@ xlog_recover_commit_pass1(  STATIC int  xlog_recover_commit_pass2( -	struct log		*log, -	struct xlog_recover	*trans, -	struct list_head	*buffer_list, -	xlog_recover_item_t	*item) +	struct xlog			*log, +	struct xlog_recover		*trans, +	struct list_head		*buffer_list, +	struct xlog_recover_item	*item)  {  	trace_xfs_log_recover_item_recover(log, trans, item, XLOG_RECOVER_PASS2); @@ -2753,7 +2753,7 @@ xlog_recover_commit_pass2(   */  STATIC int  xlog_recover_commit_trans( -	struct log		*log, +	struct xlog		*log,  	struct xlog_recover	*trans,  	int			pass)  { @@ -2793,8 +2793,8 @@ out:  STATIC int  xlog_recover_unmount_trans( -	struct log		*log, -	xlog_recover_t		*trans) +	struct xlog		*log, +	struct xlog_recover	*trans)  {  	/* Do nothing now */  	xfs_warn(log->l_mp, "%s: Unmount LR", __func__); diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 8b89c5ac72d..90c1fc9eaea 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -53,7 +53,7 @@ typedef struct xfs_trans_reservations {  #include "xfs_sync.h" -struct log; +struct xlog;  struct xfs_mount_args;  struct xfs_inode;  struct xfs_bmbt_irec; @@ -133,7 +133,7 @@ typedef struct xfs_mount {  	uint			m_readio_blocks; /* min read size blocks */  	uint			m_writeio_log;	/* min write size log bytes */  	uint			m_writeio_blocks; /* min write size blocks */ -	struct log		*m_log;		/* log specific stuff */ +	struct xlog		*m_log;		/* log specific stuff */  	int			m_logbufs;	/* number of log buffers */  	int			m_logbsize;	/* size of each log buffer */  	uint			m_rsumlevels;	/* rt summary levels */ diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c index c9d3409c5ca..1e9ee064dbb 100644 --- a/fs/xfs/xfs_sync.c +++ b/fs/xfs/xfs_sync.c @@ -386,23 +386,23 @@ xfs_sync_worker(  	 * We shouldn't write/force the log if we are in the mount/unmount  	 * process or on a read only filesystem. The workqueue still needs to be  	 * active in both cases, however, because it is used for inode reclaim -	 * during these times.  Use the s_umount semaphore to provide exclusion -	 * with unmount. +	 * during these times.  Use the MS_ACTIVE flag to avoid doing anything +	 * during mount.  Doing work during unmount is avoided by calling +	 * cancel_delayed_work_sync on this work queue before tearing down +	 * the ail and the log in xfs_log_unmount.  	 */ -	if (down_read_trylock(&mp->m_super->s_umount)) { -		if (!(mp->m_flags & XFS_MOUNT_RDONLY)) { -			/* dgc: errors ignored here */ -			if (mp->m_super->s_frozen == SB_UNFROZEN && -			    xfs_log_need_covered(mp)) -				error = xfs_fs_log_dummy(mp); -			else -				xfs_log_force(mp, 0); +	if (!(mp->m_super->s_flags & MS_ACTIVE) && +	    !(mp->m_flags & XFS_MOUNT_RDONLY)) { +		/* dgc: errors ignored here */ +		if (mp->m_super->s_frozen == SB_UNFROZEN && +		    xfs_log_need_covered(mp)) +			error = xfs_fs_log_dummy(mp); +		else +			xfs_log_force(mp, 0); -			/* start pushing all the metadata that is currently -			 * dirty */ -			xfs_ail_push_all(mp->m_ail); -		} -		up_read(&mp->m_super->s_umount); +		/* start pushing all the metadata that is currently +		 * dirty */ +		xfs_ail_push_all(mp->m_ail);  	}  	/* queue us up again */ diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 7cf9d3529e5..caf5dabfd55 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -32,7 +32,7 @@ struct xfs_da_node_entry;  struct xfs_dquot;  struct xfs_log_item;  struct xlog_ticket; -struct log; +struct xlog;  struct xlog_recover;  struct xlog_recover_item;  struct xfs_buf_log_format; @@ -762,7 +762,7 @@ DEFINE_DQUOT_EVENT(xfs_dqflush_force);  DEFINE_DQUOT_EVENT(xfs_dqflush_done);  DECLARE_EVENT_CLASS(xfs_loggrant_class, -	TP_PROTO(struct log *log, struct xlog_ticket *tic), +	TP_PROTO(struct xlog *log, struct xlog_ticket *tic),  	TP_ARGS(log, tic),  	TP_STRUCT__entry(  		__field(dev_t, dev) @@ -830,7 +830,7 @@ DECLARE_EVENT_CLASS(xfs_loggrant_class,  #define DEFINE_LOGGRANT_EVENT(name) \  DEFINE_EVENT(xfs_loggrant_class, name, \ -	TP_PROTO(struct log *log, struct xlog_ticket *tic), \ +	TP_PROTO(struct xlog *log, struct xlog_ticket *tic), \  	TP_ARGS(log, tic))  DEFINE_LOGGRANT_EVENT(xfs_log_done_nonperm);  DEFINE_LOGGRANT_EVENT(xfs_log_done_perm); @@ -1664,7 +1664,7 @@ DEFINE_SWAPEXT_EVENT(xfs_swap_extent_before);  DEFINE_SWAPEXT_EVENT(xfs_swap_extent_after);  DECLARE_EVENT_CLASS(xfs_log_recover_item_class, -	TP_PROTO(struct log *log, struct xlog_recover *trans, +	TP_PROTO(struct xlog *log, struct xlog_recover *trans,  		struct xlog_recover_item *item, int pass),  	TP_ARGS(log, trans, item, pass),  	TP_STRUCT__entry( @@ -1698,7 +1698,7 @@ DECLARE_EVENT_CLASS(xfs_log_recover_item_class,  #define DEFINE_LOG_RECOVER_ITEM(name) \  DEFINE_EVENT(xfs_log_recover_item_class, name, \ -	TP_PROTO(struct log *log, struct xlog_recover *trans, \ +	TP_PROTO(struct xlog *log, struct xlog_recover *trans, \  		struct xlog_recover_item *item, int pass), \  	TP_ARGS(log, trans, item, pass)) @@ -1709,7 +1709,7 @@ DEFINE_LOG_RECOVER_ITEM(xfs_log_recover_item_reorder_tail);  DEFINE_LOG_RECOVER_ITEM(xfs_log_recover_item_recover);  DECLARE_EVENT_CLASS(xfs_log_recover_buf_item_class, -	TP_PROTO(struct log *log, struct xfs_buf_log_format *buf_f), +	TP_PROTO(struct xlog *log, struct xfs_buf_log_format *buf_f),  	TP_ARGS(log, buf_f),  	TP_STRUCT__entry(  		__field(dev_t, dev) @@ -1739,7 +1739,7 @@ DECLARE_EVENT_CLASS(xfs_log_recover_buf_item_class,  #define DEFINE_LOG_RECOVER_BUF_ITEM(name) \  DEFINE_EVENT(xfs_log_recover_buf_item_class, name, \ -	TP_PROTO(struct log *log, struct xfs_buf_log_format *buf_f), \ +	TP_PROTO(struct xlog *log, struct xfs_buf_log_format *buf_f), \  	TP_ARGS(log, buf_f))  DEFINE_LOG_RECOVER_BUF_ITEM(xfs_log_recover_buf_not_cancel); @@ -1752,7 +1752,7 @@ DEFINE_LOG_RECOVER_BUF_ITEM(xfs_log_recover_buf_reg_buf);  DEFINE_LOG_RECOVER_BUF_ITEM(xfs_log_recover_buf_dquot_buf);  DECLARE_EVENT_CLASS(xfs_log_recover_ino_item_class, -	TP_PROTO(struct log *log, struct xfs_inode_log_format *in_f), +	TP_PROTO(struct xlog *log, struct xfs_inode_log_format *in_f),  	TP_ARGS(log, in_f),  	TP_STRUCT__entry(  		__field(dev_t, dev) @@ -1790,7 +1790,7 @@ DECLARE_EVENT_CLASS(xfs_log_recover_ino_item_class,  )  #define DEFINE_LOG_RECOVER_INO_ITEM(name) \  DEFINE_EVENT(xfs_log_recover_ino_item_class, name, \ -	TP_PROTO(struct log *log, struct xfs_inode_log_format *in_f), \ +	TP_PROTO(struct xlog *log, struct xfs_inode_log_format *in_f), \  	TP_ARGS(log, in_f))  DEFINE_LOG_RECOVER_INO_ITEM(xfs_log_recover_inode_recover); diff --git a/include/asm-generic/bug.h b/include/asm-generic/bug.h index 9f02005f217..506ec19a373 100644 --- a/include/asm-generic/bug.h +++ b/include/asm-generic/bug.h @@ -2,7 +2,6 @@  #define _ASM_GENERIC_BUG_H  #include <linux/compiler.h> -#include <linux/kernel.h>  #ifdef CONFIG_BUG @@ -32,6 +31,9 @@ struct bug_entry {  #endif	/* CONFIG_GENERIC_BUG */ +#ifndef __ASSEMBLY__ +#include <linux/kernel.h> +  /*   * Don't use BUG() or BUG_ON() unless there's really no way out; one   * example might be detecting data structure corruption in the middle @@ -61,7 +63,6 @@ struct bug_entry {   * to provide better diagnostics.   */  #ifndef __WARN_TAINT -#ifndef __ASSEMBLY__  extern __printf(3, 4)  void warn_slowpath_fmt(const char *file, const int line,  		       const char *fmt, ...); @@ -70,7 +71,6 @@ void warn_slowpath_fmt_taint(const char *file, const int line, unsigned taint,  			     const char *fmt, ...);  extern void warn_slowpath_null(const char *file, const int line);  #define WANT_WARN_ON_SLOWPATH -#endif  #define __WARN()		warn_slowpath_null(__FILE__, __LINE__)  #define __WARN_printf(arg...)	warn_slowpath_fmt(__FILE__, __LINE__, arg)  #define __WARN_printf_taint(taint, arg...)				\ @@ -203,4 +203,6 @@ extern void warn_slowpath_null(const char *file, const int line);  # define WARN_ON_SMP(x)			({0;})  #endif +#endif /* __ASSEMBLY__ */ +  #endif diff --git a/include/asm-generic/pgtable.h b/include/asm-generic/pgtable.h index 6f2b45a9b6b..ff4947b7a97 100644 --- a/include/asm-generic/pgtable.h +++ b/include/asm-generic/pgtable.h @@ -484,6 +484,16 @@ static inline int pmd_none_or_trans_huge_or_clear_bad(pmd_t *pmd)  	/*  	 * The barrier will stabilize the pmdval in a register or on  	 * the stack so that it will stop changing under the code. +	 * +	 * When CONFIG_TRANSPARENT_HUGEPAGE=y on x86 32bit PAE, +	 * pmd_read_atomic is allowed to return a not atomic pmdval +	 * (for example pointing to an hugepage that has never been +	 * mapped in the pmd). The below checks will only care about +	 * the low part of the pmd with 32bit PAE x86 anyway, with the +	 * exception of pmd_none(). So the important thing is that if +	 * the low part of the pmd is found null, the high part will +	 * be also null or the pmd_none() check below would be +	 * confused.  	 */  #ifdef CONFIG_TRANSPARENT_HUGEPAGE  	barrier(); diff --git a/include/drm/drm_pciids.h b/include/drm/drm_pciids.h index 81368ab6c61..a7aec391b7b 100644 --- a/include/drm/drm_pciids.h +++ b/include/drm/drm_pciids.h @@ -1,7 +1,3 @@ -/* -   This file is auto-generated from the drm_pciids.txt in the DRM CVS -   Please contact dri-devel@lists.sf.net to add new cards to this list -*/  #define radeon_PCI_IDS \  	{0x1002, 0x3150, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY}, \  	{0x1002, 0x3151, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h index e5834aa24b9..6a6d7aefe12 100644 --- a/include/linux/compiler-gcc.h +++ b/include/linux/compiler-gcc.h @@ -47,9 +47,9 @@   */  #if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \      !defined(CONFIG_OPTIMIZE_INLINING) || (__GNUC__ < 4) -# define inline		inline		__attribute__((always_inline)) -# define __inline__	__inline__	__attribute__((always_inline)) -# define __inline	__inline	__attribute__((always_inline)) +# define inline		inline		__attribute__((always_inline)) notrace +# define __inline__	__inline__	__attribute__((always_inline)) notrace +# define __inline	__inline	__attribute__((always_inline)) notrace  #else  /* A lot of inline functions can cause havoc with function tracing */  # define inline		inline		notrace diff --git a/include/linux/kmsg_dump.h b/include/linux/kmsg_dump.h index 35f7237ec97..d6bd50110ec 100644 --- a/include/linux/kmsg_dump.h +++ b/include/linux/kmsg_dump.h @@ -21,6 +21,7 @@   * is passed to the kernel.   */  enum kmsg_dump_reason { +	KMSG_DUMP_UNDEF,  	KMSG_DUMP_PANIC,  	KMSG_DUMP_OOPS,  	KMSG_DUMP_EMERG, @@ -31,23 +32,37 @@ enum kmsg_dump_reason {  /**   * struct kmsg_dumper - kernel crash message dumper structure - * @dump:	The callback which gets called on crashes. The buffer is passed - * 		as two sections, where s1 (length l1) contains the older - * 		messages and s2 (length l2) contains the newer.   * @list:	Entry in the dumper list (private) + * @dump:	Call into dumping code which will retrieve the data with + * 		through the record iterator + * @max_reason:	filter for highest reason number that should be dumped   * @registered:	Flag that specifies if this is already registered   */  struct kmsg_dumper { -	void (*dump)(struct kmsg_dumper *dumper, enum kmsg_dump_reason reason, -			const char *s1, unsigned long l1, -			const char *s2, unsigned long l2);  	struct list_head list; -	int registered; +	void (*dump)(struct kmsg_dumper *dumper, enum kmsg_dump_reason reason); +	enum kmsg_dump_reason max_reason; +	bool active; +	bool registered; + +	/* private state of the kmsg iterator */ +	u32 cur_idx; +	u32 next_idx; +	u64 cur_seq; +	u64 next_seq;  };  #ifdef CONFIG_PRINTK  void kmsg_dump(enum kmsg_dump_reason reason); +bool kmsg_dump_get_line(struct kmsg_dumper *dumper, bool syslog, +			char *line, size_t size, size_t *len); + +bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog, +			  char *buf, size_t size, size_t *len); + +void kmsg_dump_rewind(struct kmsg_dumper *dumper); +  int kmsg_dump_register(struct kmsg_dumper *dumper);  int kmsg_dump_unregister(struct kmsg_dumper *dumper); @@ -56,6 +71,22 @@ static inline void kmsg_dump(enum kmsg_dump_reason reason)  {  } +static inline bool kmsg_dump_get_line(struct kmsg_dumper *dumper, bool syslog, +				const char *line, size_t size, size_t *len) +{ +	return false; +} + +static inline bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog, +					char *buf, size_t size, size_t *len) +{ +	return false; +} + +static inline void kmsg_dump_rewind(struct kmsg_dumper *dumper) +{ +} +  static inline int kmsg_dump_register(struct kmsg_dumper *dumper)  {  	return -EINVAL; diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index dad95bdd06d..704a626d94a 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -57,8 +57,18 @@ struct page {  		};  		union { +#if defined(CONFIG_HAVE_CMPXCHG_DOUBLE) && \ +	defined(CONFIG_HAVE_ALIGNED_STRUCT_PAGE)  			/* Used for cmpxchg_double in slub */  			unsigned long counters; +#else +			/* +			 * Keep _count separate from slub cmpxchg_double data. +			 * As the rest of the double word is protected by +			 * slab_lock but _count is not. +			 */ +			unsigned counters; +#endif  			struct { diff --git a/include/linux/mmc/sdhci-spear.h b/include/linux/mmc/sdhci-spear.h index 5cdc96da9dd..e78c0e236e9 100644 --- a/include/linux/mmc/sdhci-spear.h +++ b/include/linux/mmc/sdhci-spear.h @@ -4,7 +4,7 @@   * SDHCI declarations specific to ST SPEAr platform   *   * Copyright (C) 2010 ST Microelectronics - * Viresh Kumar<viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/include/linux/mmc/sdio.h b/include/linux/mmc/sdio.h index c9fe66c58f8..17446d3c360 100644 --- a/include/linux/mmc/sdio.h +++ b/include/linux/mmc/sdio.h @@ -98,7 +98,9 @@  #define SDIO_CCCR_IF		0x07	/* bus interface controls */ +#define  SDIO_BUS_WIDTH_MASK	0x03	/* data bus width setting */  #define  SDIO_BUS_WIDTH_1BIT	0x00 +#define  SDIO_BUS_WIDTH_RESERVED 0x01  #define  SDIO_BUS_WIDTH_4BIT	0x02  #define  SDIO_BUS_ECSI		0x20	/* Enable continuous SPI interrupt */  #define  SDIO_BUS_SCSI		0x40	/* Support continuous SPI interrupt */ diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h index fbb78fb09bd..f58325a1d8f 100644 --- a/include/linux/nfs_fs_sb.h +++ b/include/linux/nfs_fs_sb.h @@ -25,6 +25,7 @@ struct nfs41_impl_id;   */  struct nfs_client {  	atomic_t		cl_count; +	atomic_t		cl_mds_count;  	int			cl_cons_state;	/* current construction state (-ve: init error) */  #define NFS_CS_READY		0		/* ready to be used */  #define NFS_CS_INITING		1		/* busy initialising */ diff --git a/include/linux/pata_arasan_cf_data.h b/include/linux/pata_arasan_cf_data.h index a6ee9aa898b..a7b4fc386e6 100644 --- a/include/linux/pata_arasan_cf_data.h +++ b/include/linux/pata_arasan_cf_data.h @@ -4,7 +4,7 @@   * Arasan Compact Flash host controller platform data header file   *   * Copyright (C) 2011 ST Microelectronics - * Viresh Kumar <viresh.kumar@st.com> + * Viresh Kumar <viresh.linux@gmail.com>   *   * This file is licensed under the terms of the GNU General Public   * License version 2. This program is licensed "as is" without any diff --git a/include/linux/pstore_ram.h b/include/linux/pstore_ram.h index 7ed7fd4dba4..3b823d49a85 100644 --- a/include/linux/pstore_ram.h +++ b/include/linux/pstore_ram.h @@ -69,12 +69,14 @@ struct persistent_ram_zone * __init persistent_ram_new(phys_addr_t start,  						       size_t size,  						       bool ecc);  void persistent_ram_free(struct persistent_ram_zone *prz); +void persistent_ram_zap(struct persistent_ram_zone *prz);  struct persistent_ram_zone *persistent_ram_init_ringbuffer(struct device *dev,  		bool ecc);  int persistent_ram_write(struct persistent_ram_zone *prz, const void *s,  	unsigned int count); +void persistent_ram_save_old(struct persistent_ram_zone *prz);  size_t persistent_ram_old_size(struct persistent_ram_zone *prz);  void *persistent_ram_old(struct persistent_ram_zone *prz);  void persistent_ram_free_old(struct persistent_ram_zone *prz); diff --git a/include/linux/pxa2xx_ssp.h b/include/linux/pxa2xx_ssp.h index 44835fb3979..f36632061c6 100644 --- a/include/linux/pxa2xx_ssp.h +++ b/include/linux/pxa2xx_ssp.h @@ -160,7 +160,9 @@ enum pxa_ssp_type {  	PXA25x_SSP,  /* pxa 210, 250, 255, 26x */  	PXA25x_NSSP, /* pxa 255, 26x (including ASSP) */  	PXA27x_SSP, +	PXA3xx_SSP,  	PXA168_SSP, +	PXA910_SSP,  	CE4100_SSP,  }; diff --git a/include/linux/spi/pxa2xx_spi.h b/include/linux/spi/pxa2xx_spi.h index d3e1075f7b6..c73d1445c77 100644 --- a/include/linux/spi/pxa2xx_spi.h +++ b/include/linux/spi/pxa2xx_spi.h @@ -43,7 +43,7 @@ struct pxa2xx_spi_chip {  	void (*cs_control)(u32 command);  }; -#ifdef CONFIG_ARCH_PXA +#if defined(CONFIG_ARCH_PXA) || defined(CONFIG_ARCH_MMP)  #include <linux/clk.h>  #include <mach/dma.h> diff --git a/include/linux/vga_switcheroo.h b/include/linux/vga_switcheroo.h index 60da41fe9dc..ddb419cf453 100644 --- a/include/linux/vga_switcheroo.h +++ b/include/linux/vga_switcheroo.h @@ -7,8 +7,13 @@   * vga_switcheroo.h - Support for laptop with dual GPU using one set of outputs   */ +#ifndef _LINUX_VGA_SWITCHEROO_H_ +#define _LINUX_VGA_SWITCHEROO_H_ +  #include <linux/fb.h> +struct pci_dev; +  enum vga_switcheroo_state {  	VGA_SWITCHEROO_OFF,  	VGA_SWITCHEROO_ON, @@ -71,3 +76,4 @@ static inline int vga_switcheroo_get_client_state(struct pci_dev *dev) { return  #endif +#endif /* _LINUX_VGA_SWITCHEROO_H_ */ diff --git a/kernel/cgroup.c b/kernel/cgroup.c index 72fcd3069a9..2097684cf19 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c @@ -255,12 +255,17 @@ int cgroup_lock_is_held(void)  EXPORT_SYMBOL_GPL(cgroup_lock_is_held); +static int css_unbias_refcnt(int refcnt) +{ +	return refcnt >= 0 ? refcnt : refcnt - CSS_DEACT_BIAS; +} +  /* the current nr of refs, always >= 0 whether @css is deactivated or not */  static int css_refcnt(struct cgroup_subsys_state *css)  {  	int v = atomic_read(&css->refcnt); -	return v >= 0 ? v : v - CSS_DEACT_BIAS; +	return css_unbias_refcnt(v);  }  /* convenient tests for these bits */ @@ -4982,10 +4987,12 @@ EXPORT_SYMBOL_GPL(__css_tryget);  void __css_put(struct cgroup_subsys_state *css)  {  	struct cgroup *cgrp = css->cgroup; +	int v;  	rcu_read_lock(); -	atomic_dec(&css->refcnt); -	switch (css_refcnt(css)) { +	v = css_unbias_refcnt(atomic_dec_return(&css->refcnt)); + +	switch (v) {  	case 1:  		if (notify_on_release(cgrp)) {  			set_bit(CGRP_RELEASABLE, &cgrp->flags); diff --git a/kernel/events/core.c b/kernel/events/core.c index f85c0154b33..d7d71d6ec97 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -253,9 +253,9 @@ perf_cgroup_match(struct perf_event *event)  	return !event->cgrp || event->cgrp == cpuctx->cgrp;  } -static inline void perf_get_cgroup(struct perf_event *event) +static inline bool perf_tryget_cgroup(struct perf_event *event)  { -	css_get(&event->cgrp->css); +	return css_tryget(&event->cgrp->css);  }  static inline void perf_put_cgroup(struct perf_event *event) @@ -484,7 +484,11 @@ static inline int perf_cgroup_connect(int fd, struct perf_event *event,  	event->cgrp = cgrp;  	/* must be done before we fput() the file */ -	perf_get_cgroup(event); +	if (!perf_tryget_cgroup(event)) { +		event->cgrp = NULL; +		ret = -ENOENT; +		goto out; +	}  	/*  	 * all events in a group must monitor diff --git a/kernel/exit.c b/kernel/exit.c index 34867cc5b42..2f59cc33451 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -72,6 +72,18 @@ static void __unhash_process(struct task_struct *p, bool group_dead)  		list_del_rcu(&p->tasks);  		list_del_init(&p->sibling);  		__this_cpu_dec(process_counts); +		/* +		 * If we are the last child process in a pid namespace to be +		 * reaped, notify the reaper sleeping zap_pid_ns_processes(). +		 */ +		if (IS_ENABLED(CONFIG_PID_NS)) { +			struct task_struct *parent = p->real_parent; + +			if ((task_active_pid_ns(parent)->child_reaper == parent) && +			    list_empty(&parent->children) && +			    (parent->flags & PF_EXITING)) +				wake_up_process(parent); +		}  	}  	list_del_rcu(&p->thread_group);  } @@ -643,6 +655,7 @@ static void exit_mm(struct task_struct * tsk)  	mm_release(tsk, mm);  	if (!mm)  		return; +	sync_mm_rss(mm);  	/*  	 * Serialize with any possible pending coredump.  	 * We must hold mmap_sem around checking core_state @@ -719,12 +732,6 @@ static struct task_struct *find_new_reaper(struct task_struct *father)  		zap_pid_ns_processes(pid_ns);  		write_lock_irq(&tasklist_lock); -		/* -		 * We can not clear ->child_reaper or leave it alone. -		 * There may by stealth EXIT_DEAD tasks on ->children, -		 * forget_original_parent() must move them somewhere. -		 */ -		pid_ns->child_reaper = init_pid_ns.child_reaper;  	} else if (father->signal->has_child_subreaper) {  		struct task_struct *reaper; diff --git a/kernel/pid_namespace.c b/kernel/pid_namespace.c index 16b20e38c4a..b3c7fd55425 100644 --- a/kernel/pid_namespace.c +++ b/kernel/pid_namespace.c @@ -184,11 +184,31 @@ void zap_pid_ns_processes(struct pid_namespace *pid_ns)  	}  	read_unlock(&tasklist_lock); +	/* Firstly reap the EXIT_ZOMBIE children we may have. */  	do {  		clear_thread_flag(TIF_SIGPENDING);  		rc = sys_wait4(-1, NULL, __WALL, NULL);  	} while (rc != -ECHILD); +	/* +	 * sys_wait4() above can't reap the TASK_DEAD children. +	 * Make sure they all go away, see __unhash_process(). +	 */ +	for (;;) { +		bool need_wait = false; + +		read_lock(&tasklist_lock); +		if (!list_empty(¤t->children)) { +			__set_current_state(TASK_UNINTERRUPTIBLE); +			need_wait = true; +		} +		read_unlock(&tasklist_lock); + +		if (!need_wait) +			break; +		schedule(); +	} +  	if (pid_ns->reboot)  		current->signal->group_exit_code = pid_ns->reboot; diff --git a/kernel/printk.c b/kernel/printk.c index 32462d2b364..a2276b91676 100644 --- a/kernel/printk.c +++ b/kernel/printk.c @@ -227,10 +227,10 @@ static u32 clear_idx;  #define LOG_LINE_MAX 1024  /* record buffer */ -#if !defined(CONFIG_64BIT) || defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) +#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)  #define LOG_ALIGN 4  #else -#define LOG_ALIGN 8 +#define LOG_ALIGN __alignof__(struct log)  #endif  #define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)  static char __log_buf[__LOG_BUF_LEN] __aligned(LOG_ALIGN); @@ -414,7 +414,9 @@ static ssize_t devkmsg_read(struct file *file, char __user *buf,  	if (!user)  		return -EBADF; -	mutex_lock(&user->lock); +	ret = mutex_lock_interruptible(&user->lock); +	if (ret) +		return ret;  	raw_spin_lock(&logbuf_lock);  	while (user->seq == log_next_seq) {  		if (file->f_flags & O_NONBLOCK) { @@ -878,7 +880,9 @@ static int syslog_print(char __user *buf, int size)  	syslog_seq++;  	raw_spin_unlock_irq(&logbuf_lock); -	if (len > 0 && copy_to_user(buf, text, len)) +	if (len > size) +		len = -EINVAL; +	else if (len > 0 && copy_to_user(buf, text, len))  		len = -EFAULT;  	kfree(text); @@ -909,7 +913,7 @@ static int syslog_print_all(char __user *buf, int size, bool clear)  		/*  		 * Find first record that fits, including all following records,  		 * into the user-provided buffer for this dump. -		*/ +		 */  		seq = clear_seq;  		idx = clear_idx;  		while (seq < log_next_seq) { @@ -919,6 +923,8 @@ static int syslog_print_all(char __user *buf, int size, bool clear)  			idx = log_next(idx);  			seq++;  		} + +		/* move first record forward until length fits into the buffer */  		seq = clear_seq;  		idx = clear_idx;  		while (len > size && seq < log_next_seq) { @@ -929,7 +935,7 @@ static int syslog_print_all(char __user *buf, int size, bool clear)  			seq++;  		} -		/* last message in this dump */ +		/* last message fitting into this dump */  		next_seq = log_next_seq;  		len = 0; @@ -974,6 +980,7 @@ int do_syslog(int type, char __user *buf, int len, bool from_file)  {  	bool clear = false;  	static int saved_console_loglevel = -1; +	static DEFINE_MUTEX(syslog_mutex);  	int error;  	error = check_syslog_permissions(type, from_file); @@ -1000,11 +1007,17 @@ int do_syslog(int type, char __user *buf, int len, bool from_file)  			error = -EFAULT;  			goto out;  		} +		error = mutex_lock_interruptible(&syslog_mutex); +		if (error) +			goto out;  		error = wait_event_interruptible(log_wait,  						 syslog_seq != log_next_seq); -		if (error) +		if (error) { +			mutex_unlock(&syslog_mutex);  			goto out; +		}  		error = syslog_print(buf, len); +		mutex_unlock(&syslog_mutex);  		break;  	/* Read/clear last kernel messages */  	case SYSLOG_ACTION_READ_CLEAR: @@ -2300,48 +2313,210 @@ module_param_named(always_kmsg_dump, always_kmsg_dump, bool, S_IRUGO | S_IWUSR);   * kmsg_dump - dump kernel log to kernel message dumpers.   * @reason: the reason (oops, panic etc) for dumping   * - * Iterate through each of the dump devices and call the oops/panic - * callbacks with the log buffer. + * Call each of the registered dumper's dump() callback, which can + * retrieve the kmsg records with kmsg_dump_get_line() or + * kmsg_dump_get_buffer().   */  void kmsg_dump(enum kmsg_dump_reason reason)  { -	u64 idx;  	struct kmsg_dumper *dumper; -	const char *s1, *s2; -	unsigned long l1, l2;  	unsigned long flags;  	if ((reason > KMSG_DUMP_OOPS) && !always_kmsg_dump)  		return; -	/* Theoretically, the log could move on after we do this, but -	   there's not a lot we can do about that. The new messages -	   will overwrite the start of what we dump. */ +	rcu_read_lock(); +	list_for_each_entry_rcu(dumper, &dump_list, list) { +		if (dumper->max_reason && reason > dumper->max_reason) +			continue; + +		/* initialize iterator with data about the stored records */ +		dumper->active = true; + +		raw_spin_lock_irqsave(&logbuf_lock, flags); +		dumper->cur_seq = clear_seq; +		dumper->cur_idx = clear_idx; +		dumper->next_seq = log_next_seq; +		dumper->next_idx = log_next_idx; +		raw_spin_unlock_irqrestore(&logbuf_lock, flags); + +		/* invoke dumper which will iterate over records */ +		dumper->dump(dumper, reason); + +		/* reset iterator */ +		dumper->active = false; +	} +	rcu_read_unlock(); +} + +/** + * kmsg_dump_get_line - retrieve one kmsg log line + * @dumper: registered kmsg dumper + * @syslog: include the "<4>" prefixes + * @line: buffer to copy the line to + * @size: maximum size of the buffer + * @len: length of line placed into buffer + * + * Start at the beginning of the kmsg buffer, with the oldest kmsg + * record, and copy one record into the provided buffer. + * + * Consecutive calls will return the next available record moving + * towards the end of the buffer with the youngest messages. + * + * A return value of FALSE indicates that there are no more records to + * read. + */ +bool kmsg_dump_get_line(struct kmsg_dumper *dumper, bool syslog, +			char *line, size_t size, size_t *len) +{ +	unsigned long flags; +	struct log *msg; +	size_t l = 0; +	bool ret = false; + +	if (!dumper->active) +		goto out;  	raw_spin_lock_irqsave(&logbuf_lock, flags); -	if (syslog_seq < log_first_seq) -		idx = syslog_idx; -	else -		idx = log_first_idx; +	if (dumper->cur_seq < log_first_seq) { +		/* messages are gone, move to first available one */ +		dumper->cur_seq = log_first_seq; +		dumper->cur_idx = log_first_idx; +	} + +	/* last entry */ +	if (dumper->cur_seq >= log_next_seq) { +		raw_spin_unlock_irqrestore(&logbuf_lock, flags); +		goto out; +	} -	if (idx > log_next_idx) { -		s1 = log_buf; -		l1 = log_next_idx; +	msg = log_from_idx(dumper->cur_idx); +	l = msg_print_text(msg, syslog, +			      line, size); -		s2 = log_buf + idx; -		l2 = log_buf_len - idx; -	} else { -		s1 = ""; -		l1 = 0; +	dumper->cur_idx = log_next(dumper->cur_idx); +	dumper->cur_seq++; +	ret = true; +	raw_spin_unlock_irqrestore(&logbuf_lock, flags); +out: +	if (len) +		*len = l; +	return ret; +} +EXPORT_SYMBOL_GPL(kmsg_dump_get_line); + +/** + * kmsg_dump_get_buffer - copy kmsg log lines + * @dumper: registered kmsg dumper + * @syslog: include the "<4>" prefixes + * @line: buffer to copy the line to + * @size: maximum size of the buffer + * @len: length of line placed into buffer + * + * Start at the end of the kmsg buffer and fill the provided buffer + * with as many of the the *youngest* kmsg records that fit into it. + * If the buffer is large enough, all available kmsg records will be + * copied with a single call. + * + * Consecutive calls will fill the buffer with the next block of + * available older records, not including the earlier retrieved ones. + * + * A return value of FALSE indicates that there are no more records to + * read. + */ +bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog, +			  char *buf, size_t size, size_t *len) +{ +	unsigned long flags; +	u64 seq; +	u32 idx; +	u64 next_seq; +	u32 next_idx; +	size_t l = 0; +	bool ret = false; + +	if (!dumper->active) +		goto out; + +	raw_spin_lock_irqsave(&logbuf_lock, flags); +	if (dumper->cur_seq < log_first_seq) { +		/* messages are gone, move to first available one */ +		dumper->cur_seq = log_first_seq; +		dumper->cur_idx = log_first_idx; +	} + +	/* last entry */ +	if (dumper->cur_seq >= dumper->next_seq) { +		raw_spin_unlock_irqrestore(&logbuf_lock, flags); +		goto out; +	} + +	/* calculate length of entire buffer */ +	seq = dumper->cur_seq; +	idx = dumper->cur_idx; +	while (seq < dumper->next_seq) { +		struct log *msg = log_from_idx(idx); + +		l += msg_print_text(msg, true, NULL, 0); +		idx = log_next(idx); +		seq++; +	} -		s2 = log_buf + idx; -		l2 = log_next_idx - idx; +	/* move first record forward until length fits into the buffer */ +	seq = dumper->cur_seq; +	idx = dumper->cur_idx; +	while (l > size && seq < dumper->next_seq) { +		struct log *msg = log_from_idx(idx); + +		l -= msg_print_text(msg, true, NULL, 0); +		idx = log_next(idx); +		seq++; +	} + +	/* last message in next interation */ +	next_seq = seq; +	next_idx = idx; + +	l = 0; +	while (seq < dumper->next_seq) { +		struct log *msg = log_from_idx(idx); + +		l += msg_print_text(msg, syslog, +				    buf + l, size - l); + +		idx = log_next(idx); +		seq++;  	} + +	dumper->next_seq = next_seq; +	dumper->next_idx = next_idx; +	ret = true;  	raw_spin_unlock_irqrestore(&logbuf_lock, flags); +out: +	if (len) +		*len = l; +	return ret; +} +EXPORT_SYMBOL_GPL(kmsg_dump_get_buffer); -	rcu_read_lock(); -	list_for_each_entry_rcu(dumper, &dump_list, list) -		dumper->dump(dumper, reason, s1, l1, s2, l2); -	rcu_read_unlock(); +/** + * kmsg_dump_rewind - reset the interator + * @dumper: registered kmsg dumper + * + * Reset the dumper's iterator so that kmsg_dump_get_line() and + * kmsg_dump_get_buffer() can be called again and used multiple + * times within the same dumper.dump() callback. + */ +void kmsg_dump_rewind(struct kmsg_dumper *dumper) +{ +	unsigned long flags; + +	raw_spin_lock_irqsave(&logbuf_lock, flags); +	dumper->cur_seq = clear_seq; +	dumper->cur_idx = clear_idx; +	dumper->next_seq = log_next_seq; +	dumper->next_idx = log_next_idx; +	raw_spin_unlock_irqrestore(&logbuf_lock, flags);  } +EXPORT_SYMBOL_GPL(kmsg_dump_rewind);  #endif diff --git a/kernel/sys.c b/kernel/sys.c index f0ec44dcd41..e0c8ffc50d7 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -2127,9 +2127,6 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3,  				else  					return -EINVAL;  				break; -		case PR_GET_TID_ADDRESS: -			error = prctl_get_tid_address(me, (int __user **)arg2); -			break;  			default:  				return -EINVAL;  			} @@ -2147,6 +2144,9 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3,  		case PR_SET_MM:  			error = prctl_set_mm(arg2, arg3, arg4, arg5);  			break; +		case PR_GET_TID_ADDRESS: +			error = prctl_get_tid_address(me, (int __user **)arg2); +			break;  		case PR_SET_CHILD_SUBREAPER:  			me->signal->is_child_subreaper = !!arg2;  			error = 0; diff --git a/lib/fault-inject.c b/lib/fault-inject.c index 6805453c18e..f7210ad6cff 100644 --- a/lib/fault-inject.c +++ b/lib/fault-inject.c @@ -101,6 +101,10 @@ static inline bool fail_stacktrace(struct fault_attr *attr)  bool should_fail(struct fault_attr *attr, ssize_t size)  { +	/* No need to check any other properties if the probability is 0 */ +	if (attr->probability == 0) +		return false; +  	if (attr->task_filter && !fail_task(attr, current))  		return false; diff --git a/mm/memblock.c b/mm/memblock.c index 32a0a5e4d79..d4382095f8b 100644 --- a/mm/memblock.c +++ b/mm/memblock.c @@ -184,7 +184,24 @@ static void __init_memblock memblock_remove_region(struct memblock_type *type, u  	}  } -static int __init_memblock memblock_double_array(struct memblock_type *type) +/** + * memblock_double_array - double the size of the memblock regions array + * @type: memblock type of the regions array being doubled + * @new_area_start: starting address of memory range to avoid overlap with + * @new_area_size: size of memory range to avoid overlap with + * + * Double the size of the @type regions array. If memblock is being used to + * allocate memory for a new reserved regions array and there is a previously + * allocated memory range [@new_area_start,@new_area_start+@new_area_size] + * waiting to be reserved, ensure the memory used by the new array does + * not overlap. + * + * RETURNS: + * 0 on success, -1 on failure. + */ +static int __init_memblock memblock_double_array(struct memblock_type *type, +						phys_addr_t new_area_start, +						phys_addr_t new_area_size)  {  	struct memblock_region *new_array, *old_array;  	phys_addr_t old_size, new_size, addr; @@ -222,7 +239,18 @@ static int __init_memblock memblock_double_array(struct memblock_type *type)  		new_array = kmalloc(new_size, GFP_KERNEL);  		addr = new_array ? __pa(new_array) : 0;  	} else { -		addr = memblock_find_in_range(0, MEMBLOCK_ALLOC_ACCESSIBLE, new_size, sizeof(phys_addr_t)); +		/* only exclude range when trying to double reserved.regions */ +		if (type != &memblock.reserved) +			new_area_start = new_area_size = 0; + +		addr = memblock_find_in_range(new_area_start + new_area_size, +						memblock.current_limit, +						new_size, sizeof(phys_addr_t)); +		if (!addr && new_area_size) +			addr = memblock_find_in_range(0, +					min(new_area_start, memblock.current_limit), +					new_size, sizeof(phys_addr_t)); +  		new_array = addr ? __va(addr) : 0;  	}  	if (!addr) { @@ -399,7 +427,7 @@ repeat:  	 */  	if (!insert) {  		while (type->cnt + nr_new > type->max) -			if (memblock_double_array(type) < 0) +			if (memblock_double_array(type, obase, size) < 0)  				return -ENOMEM;  		insert = true;  		goto repeat; @@ -450,7 +478,7 @@ static int __init_memblock memblock_isolate_range(struct memblock_type *type,  	/* we'll create at most two more regions */  	while (type->cnt + 2 > type->max) -		if (memblock_double_array(type) < 0) +		if (memblock_double_array(type, base, size) < 0)  			return -ENOMEM;  	for (i = 0; i < type->cnt; i++) { @@ -540,9 +568,9 @@ int __init_memblock memblock_reserve(phys_addr_t base, phys_addr_t size)   * __next_free_mem_range - next function for for_each_free_mem_range()   * @idx: pointer to u64 loop variable   * @nid: nid: node selector, %MAX_NUMNODES for all nodes - * @p_start: ptr to phys_addr_t for start address of the range, can be %NULL - * @p_end: ptr to phys_addr_t for end address of the range, can be %NULL - * @p_nid: ptr to int for nid of the range, can be %NULL + * @out_start: ptr to phys_addr_t for start address of the range, can be %NULL + * @out_end: ptr to phys_addr_t for end address of the range, can be %NULL + * @out_nid: ptr to int for nid of the range, can be %NULL   *   * Find the first free area from *@idx which matches @nid, fill the out   * parameters, and update *@idx for the next iteration.  The lower 32bit of @@ -616,9 +644,9 @@ void __init_memblock __next_free_mem_range(u64 *idx, int nid,   * __next_free_mem_range_rev - next function for for_each_free_mem_range_reverse()   * @idx: pointer to u64 loop variable   * @nid: nid: node selector, %MAX_NUMNODES for all nodes - * @p_start: ptr to phys_addr_t for start address of the range, can be %NULL - * @p_end: ptr to phys_addr_t for end address of the range, can be %NULL - * @p_nid: ptr to int for nid of the range, can be %NULL + * @out_start: ptr to phys_addr_t for start address of the range, can be %NULL + * @out_end: ptr to phys_addr_t for end address of the range, can be %NULL + * @out_nid: ptr to int for nid of the range, can be %NULL   *   * Reverse of __next_free_mem_range().   */ diff --git a/mm/memcontrol.c b/mm/memcontrol.c index ac35bccadb7..f72b5e52451 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -1148,7 +1148,7 @@ bool __mem_cgroup_same_or_subtree(const struct mem_cgroup *root_memcg,  {  	if (root_memcg == memcg)  		return true; -	if (!root_memcg->use_hierarchy) +	if (!root_memcg->use_hierarchy || !memcg)  		return false;  	return css_is_ancestor(&memcg->css, &root_memcg->css);  } @@ -1234,7 +1234,7 @@ int mem_cgroup_inactive_file_is_low(struct lruvec *lruvec)  /**   * mem_cgroup_margin - calculate chargeable space of a memory cgroup - * @mem: the memory cgroup + * @memcg: the memory cgroup   *   * Returns the maximum amount of memory @mem can be charged with, in   * pages. @@ -1508,7 +1508,7 @@ static unsigned long mem_cgroup_reclaim(struct mem_cgroup *memcg,  /**   * test_mem_cgroup_node_reclaimable - * @mem: the target memcg + * @memcg: the target memcg   * @nid: the node ID to be checked.   * @noswap : specify true here if the user wants flle only information.   * diff --git a/mm/memory.c b/mm/memory.c index 1b7dc662bf9..2466d125023 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -1225,7 +1225,15 @@ static inline unsigned long zap_pmd_range(struct mmu_gather *tlb,  		next = pmd_addr_end(addr, end);  		if (pmd_trans_huge(*pmd)) {  			if (next - addr != HPAGE_PMD_SIZE) { -				VM_BUG_ON(!rwsem_is_locked(&tlb->mm->mmap_sem)); +#ifdef CONFIG_DEBUG_VM +				if (!rwsem_is_locked(&tlb->mm->mmap_sem)) { +					pr_err("%s: mmap_sem is unlocked! addr=0x%lx end=0x%lx vma->vm_start=0x%lx vma->vm_end=0x%lx\n", +						__func__, addr, end, +						vma->vm_start, +						vma->vm_end); +					BUG(); +				} +#endif  				split_huge_page_pmd(vma->vm_mm, pmd);  			} else if (zap_huge_pmd(tlb, vma, pmd, addr))  				goto next; @@ -1366,7 +1374,7 @@ void unmap_vmas(struct mmu_gather *tlb,  /**   * zap_page_range - remove user pages in a given range   * @vma: vm_area_struct holding the applicable pages - * @address: starting address of pages to zap + * @start: starting address of pages to zap   * @size: number of bytes to zap   * @details: details of nonlinear truncation or shared cache invalidation   * diff --git a/mm/mempolicy.c b/mm/mempolicy.c index f15c1b24ca1..1d771e4200d 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -1177,7 +1177,7 @@ static long do_mbind(unsigned long start, unsigned long len,  		if (!list_empty(&pagelist)) {  			nr_failed = migrate_pages(&pagelist, new_vma_page,  						(unsigned long)vma, -						false, true); +						false, MIGRATE_SYNC);  			if (nr_failed)  				putback_lru_pages(&pagelist);  		} diff --git a/mm/oom_kill.c b/mm/oom_kill.c index 416637f0e92..ac300c99baf 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -184,6 +184,7 @@ unsigned long oom_badness(struct task_struct *p, struct mem_cgroup *memcg,  			  const nodemask_t *nodemask, unsigned long totalpages)  {  	long points; +	long adj;  	if (oom_unkillable_task(p, memcg, nodemask))  		return 0; @@ -192,7 +193,8 @@ unsigned long oom_badness(struct task_struct *p, struct mem_cgroup *memcg,  	if (!p)  		return 0; -	if (p->signal->oom_score_adj == OOM_SCORE_ADJ_MIN) { +	adj = p->signal->oom_score_adj; +	if (adj == OOM_SCORE_ADJ_MIN) {  		task_unlock(p);  		return 0;  	} @@ -210,14 +212,11 @@ unsigned long oom_badness(struct task_struct *p, struct mem_cgroup *memcg,  	 * implementation used by LSMs.  	 */  	if (has_capability_noaudit(p, CAP_SYS_ADMIN)) -		points -= 30 * totalpages / 1000; +		adj -= 30; -	/* -	 * /proc/pid/oom_score_adj ranges from -1000 to +1000 such that it may -	 * either completely disable oom killing or always prefer a certain -	 * task. -	 */ -	points += p->signal->oom_score_adj * totalpages / 1000; +	/* Normalize to oom_score_adj units */ +	adj *= totalpages / 1000; +	points += adj;  	/*  	 * Never return 0 for an eligible task regardless of the root bonus and @@ -366,7 +365,7 @@ static struct task_struct *select_bad_process(unsigned int *ppoints,  /**   * dump_tasks - dump current memory state of all system tasks - * @mem: current's memory controller, if constrained + * @memcg: current's memory controller, if constrained   * @nodemask: nodemask passed to page allocator for mempolicy ooms   *   * Dumps the current memory state of all eligible tasks.  Tasks not in the same diff --git a/mm/page_cgroup.c b/mm/page_cgroup.c index 1ccbd714059..eb750f85139 100644 --- a/mm/page_cgroup.c +++ b/mm/page_cgroup.c @@ -392,7 +392,7 @@ static struct swap_cgroup *lookup_swap_cgroup(swp_entry_t ent,  /**   * swap_cgroup_cmpxchg - cmpxchg mem_cgroup's id for this swp_entry. - * @end: swap entry to be cmpxchged + * @ent: swap entry to be cmpxchged   * @old: old id   * @new: new id   * @@ -422,7 +422,7 @@ unsigned short swap_cgroup_cmpxchg(swp_entry_t ent,  /**   * swap_cgroup_record - record mem_cgroup for this swp_entry.   * @ent: swap entry to be recorded into - * @mem: mem_cgroup to be recorded + * @id: mem_cgroup to be recorded   *   * Returns old value at success, 0 at failure.   * (Of course, old value can be 0.) diff --git a/mm/pagewalk.c b/mm/pagewalk.c index aa9701e1271..6c118d012bb 100644 --- a/mm/pagewalk.c +++ b/mm/pagewalk.c @@ -162,7 +162,6 @@ static int walk_hugetlb_range(struct vm_area_struct *vma,  /**   * walk_page_range - walk a memory map's page tables with a callback - * @mm: memory map to walk   * @addr: starting address   * @end: ending address   * @walk: set of callbacks to invoke for each level of the tree diff --git a/mm/percpu-vm.c b/mm/percpu-vm.c index 405d331804c..3707c71ae4c 100644 --- a/mm/percpu-vm.c +++ b/mm/percpu-vm.c @@ -360,7 +360,6 @@ err_free:   * @chunk: chunk to depopulate   * @off: offset to the area to depopulate   * @size: size of the area to depopulate in bytes - * @flush: whether to flush cache and tlb or not   *   * For each cpu, depopulate and unmap pages [@page_start,@page_end)   * from @chunk.  If @flush is true, vcache is flushed before unmapping diff --git a/net/9p/trans_virtio.c b/net/9p/trans_virtio.c index 5af18d11b51..2a167658bb9 100644 --- a/net/9p/trans_virtio.c +++ b/net/9p/trans_virtio.c @@ -192,10 +192,10 @@ static int pack_sg_list(struct scatterlist *sg, int start,  		s = rest_of_page(data);  		if (s > count)  			s = count; +		BUG_ON(index > limit);  		sg_set_buf(&sg[index++], data, s);  		count -= s;  		data += s; -		BUG_ON(index > limit);  	}  	return index-start; diff --git a/net/ceph/ceph_common.c b/net/ceph/ceph_common.c index a776f751edb..ba4323bce0e 100644 --- a/net/ceph/ceph_common.c +++ b/net/ceph/ceph_common.c @@ -504,13 +504,6 @@ void ceph_destroy_client(struct ceph_client *client)  	/* unmount */  	ceph_osdc_stop(&client->osdc); -	/* -	 * make sure osd connections close out before destroying the -	 * auth module, which is needed to free those connections' -	 * ceph_authorizers. -	 */ -	ceph_msgr_flush(); -  	ceph_monc_stop(&client->monc);  	ceph_debugfs_client_cleanup(client); diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c index 524f4e4f598..b332c3d7605 100644 --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c @@ -563,6 +563,10 @@ static void prepare_write_message(struct ceph_connection *con)  		m->hdr.seq = cpu_to_le64(++con->out_seq);  		m->needs_out_seq = false;  	} +#ifdef CONFIG_BLOCK +	else +		m->bio_iter = NULL; +#endif  	dout("prepare_write_message %p seq %lld type %d len %d+%d+%d %d pgs\n",  	     m, con->out_seq, le16_to_cpu(m->hdr.type), diff --git a/net/ceph/mon_client.c b/net/ceph/mon_client.c index 10d6008d31f..d0649a9655b 100644 --- a/net/ceph/mon_client.c +++ b/net/ceph/mon_client.c @@ -847,6 +847,14 @@ void ceph_monc_stop(struct ceph_mon_client *monc)  	mutex_unlock(&monc->mutex); +	/* +	 * flush msgr queue before we destroy ourselves to ensure that: +	 *  - any work that references our embedded con is finished. +	 *  - any osd_client or other work that may reference an authorizer +	 *    finishes before we shut down the auth subsystem. +	 */ +	ceph_msgr_flush(); +  	ceph_auth_destroy(monc->auth);  	ceph_msg_put(monc->m_auth); diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c index 1ffebed5ce0..ca59e66c978 100644 --- a/net/ceph/osd_client.c +++ b/net/ceph/osd_client.c @@ -139,15 +139,15 @@ void ceph_osdc_release_request(struct kref *kref)  	if (req->r_request)  		ceph_msg_put(req->r_request); -	if (req->r_reply) -		ceph_msg_put(req->r_reply);  	if (req->r_con_filling_msg) {  		dout("release_request revoking pages %p from con %p\n",  		     req->r_pages, req->r_con_filling_msg);  		ceph_con_revoke_message(req->r_con_filling_msg,  				      req->r_reply); -		ceph_con_put(req->r_con_filling_msg); +		req->r_con_filling_msg->ops->put(req->r_con_filling_msg);  	} +	if (req->r_reply) +		ceph_msg_put(req->r_reply);  	if (req->r_own_pages)  		ceph_release_page_vector(req->r_pages,  					 req->r_num_pages); @@ -1216,7 +1216,7 @@ static void handle_reply(struct ceph_osd_client *osdc, struct ceph_msg *msg,  	if (req->r_con_filling_msg == con && req->r_reply == msg) {  		dout(" dropping con_filling_msg ref %p\n", con);  		req->r_con_filling_msg = NULL; -		ceph_con_put(con); +		con->ops->put(con);  	}  	if (!req->r_got_reply) { @@ -2028,7 +2028,7 @@ static struct ceph_msg *get_reply(struct ceph_connection *con,  		dout("get_reply revoking msg %p from old con %p\n",  		     req->r_reply, req->r_con_filling_msg);  		ceph_con_revoke_message(req->r_con_filling_msg, req->r_reply); -		ceph_con_put(req->r_con_filling_msg); +		req->r_con_filling_msg->ops->put(req->r_con_filling_msg);  		req->r_con_filling_msg = NULL;  	} @@ -2063,7 +2063,7 @@ static struct ceph_msg *get_reply(struct ceph_connection *con,  #endif  	}  	*skip = 0; -	req->r_con_filling_msg = ceph_con_get(con); +	req->r_con_filling_msg = con->ops->get(con);  	dout("get_reply tid %lld %p\n", tid, m);  out: diff --git a/scripts/get_maintainer.pl b/scripts/get_maintainer.pl index 0948c6b5a32..8b673dd4627 100755 --- a/scripts/get_maintainer.pl +++ b/scripts/get_maintainer.pl @@ -83,6 +83,8 @@ push(@signature_tags, "Signed-off-by:");  push(@signature_tags, "Reviewed-by:");  push(@signature_tags, "Acked-by:"); +my $signature_pattern = "\(" . join("|", @signature_tags) . "\)"; +  # rfc822 email address - preloaded methods go here.  my $rfc822_lwsp = "(?:(?:\\r\\n)?[ \\t])";  my $rfc822_char = '[\\000-\\377]'; @@ -473,7 +475,6 @@ my @subsystem = ();  my @status = ();  my %deduplicate_name_hash = ();  my %deduplicate_address_hash = (); -my $signature_pattern;  my @maintainers = get_maintainers(); diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 41ca803a1ff..7504e62188d 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c @@ -4393,20 +4393,19 @@ void snd_hda_update_power_acct(struct hda_codec *codec)  	codec->power_jiffies += delta;  } -/** - * snd_hda_power_up - Power-up the codec - * @codec: HD-audio codec - * - * Increment the power-up counter and power up the hardware really when - * not turned on yet. - */ -void snd_hda_power_up(struct hda_codec *codec) +/* Transition to powered up, if wait_power_down then wait for a pending + * transition to D3 to complete. A pending D3 transition is indicated + * with power_transition == -1. */ +static void __snd_hda_power_up(struct hda_codec *codec, bool wait_power_down)  {  	struct hda_bus *bus = codec->bus;  	spin_lock(&codec->power_lock);  	codec->power_count++; -	if (codec->power_on || codec->power_transition > 0) { +	/* Return if power_on or transitioning to power_on, unless currently +	 * powering down. */ +	if ((codec->power_on || codec->power_transition > 0) && +	    !(wait_power_down && codec->power_transition < 0)) {  		spin_unlock(&codec->power_lock);  		return;  	} @@ -4430,8 +4429,37 @@ void snd_hda_power_up(struct hda_codec *codec)  	codec->power_transition = 0;  	spin_unlock(&codec->power_lock);  } + +/** + * snd_hda_power_up - Power-up the codec + * @codec: HD-audio codec + * + * Increment the power-up counter and power up the hardware really when + * not turned on yet. + */ +void snd_hda_power_up(struct hda_codec *codec) +{ +	__snd_hda_power_up(codec, false); +}  EXPORT_SYMBOL_HDA(snd_hda_power_up); +/** + * snd_hda_power_up_d3wait - Power-up the codec after waiting for any pending + *   D3 transition to complete.  This differs from snd_hda_power_up() when + *   power_transition == -1.  snd_hda_power_up sees this case as a nop, + *   snd_hda_power_up_d3wait waits for the D3 transition to complete then powers + *   back up. + * @codec: HD-audio codec + * + * Cancel any power down operation hapenning on the work queue, then power up. + */ +void snd_hda_power_up_d3wait(struct hda_codec *codec) +{ +	/* This will cancel and wait for pending power_work to complete. */ +	__snd_hda_power_up(codec, true); +} +EXPORT_SYMBOL_HDA(snd_hda_power_up_d3wait); +  #define power_save(codec)	\  	((codec)->bus->power_save ? *(codec)->bus->power_save : 0) diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h index 4fc3960c859..2fdaadbb432 100644 --- a/sound/pci/hda/hda_codec.h +++ b/sound/pci/hda/hda_codec.h @@ -1056,10 +1056,12 @@ const char *snd_hda_get_jack_location(u32 cfg);   */  #ifdef CONFIG_SND_HDA_POWER_SAVE  void snd_hda_power_up(struct hda_codec *codec); +void snd_hda_power_up_d3wait(struct hda_codec *codec);  void snd_hda_power_down(struct hda_codec *codec);  void snd_hda_update_power_acct(struct hda_codec *codec);  #else  static inline void snd_hda_power_up(struct hda_codec *codec) {} +static inline void snd_hda_power_up_d3wait(struct hda_codec *codec) {}  static inline void snd_hda_power_down(struct hda_codec *codec) {}  #endif diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 02763827dde..7757536b9d5 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c @@ -1766,7 +1766,7 @@ static int azx_pcm_open(struct snd_pcm_substream *substream)  				   buff_step);  	snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES,  				   buff_step); -	snd_hda_power_up(apcm->codec); +	snd_hda_power_up_d3wait(apcm->codec);  	err = hinfo->ops.open(hinfo, apcm->codec, substream);  	if (err < 0) {  		azx_release_device(azx_dev); diff --git a/sound/soc/codecs/wm8904.c b/sound/soc/codecs/wm8904.c index 65d525d74c5..812acd83fb4 100644 --- a/sound/soc/codecs/wm8904.c +++ b/sound/soc/codecs/wm8904.c @@ -1863,6 +1863,7 @@ static int wm8904_set_bias_level(struct snd_soc_codec *codec,  				return ret;  			} +			regcache_cache_only(wm8904->regmap, false);  			regcache_sync(wm8904->regmap);  			/* Enable bias */ @@ -1899,14 +1900,8 @@ static int wm8904_set_bias_level(struct snd_soc_codec *codec,  		snd_soc_update_bits(codec, WM8904_BIAS_CONTROL_0,  				    WM8904_BIAS_ENA, 0); -#ifdef CONFIG_REGULATOR -		/* Post 2.6.34 we will be able to get a callback when -		 * the regulators are disabled which we can use but -		 * for now just assume that the power will be cut if -		 * the regulator API is in use. -		 */ -		codec->cache_sync = 1; -#endif +		regcache_cache_only(wm8904->regmap, true); +		regcache_mark_dirty(wm8904->regmap);  		regulator_bulk_disable(ARRAY_SIZE(wm8904->supplies),  				       wm8904->supplies); @@ -2084,10 +2079,8 @@ static int wm8904_probe(struct snd_soc_codec *codec)  {  	struct wm8904_priv *wm8904 = snd_soc_codec_get_drvdata(codec);  	struct wm8904_pdata *pdata = wm8904->pdata; -	u16 *reg_cache = codec->reg_cache;  	int ret, i; -	codec->cache_sync = 1;  	codec->control_data = wm8904->regmap;  	switch (wm8904->devtype) { @@ -2150,6 +2143,7 @@ static int wm8904_probe(struct snd_soc_codec *codec)  		goto err_enable;  	} +	regcache_cache_only(wm8904->regmap, true);  	/* Change some default settings - latch VU and enable ZC */  	snd_soc_update_bits(codec, WM8904_ADC_DIGITAL_VOLUME_LEFT,  			    WM8904_ADC_VU, WM8904_ADC_VU); @@ -2180,14 +2174,18 @@ static int wm8904_probe(struct snd_soc_codec *codec)  			if (!pdata->gpio_cfg[i])  				continue; -			reg_cache[WM8904_GPIO_CONTROL_1 + i] -				= pdata->gpio_cfg[i] & 0xffff; +			regmap_update_bits(wm8904->regmap, +					   WM8904_GPIO_CONTROL_1 + i, +					   0xffff, +					   pdata->gpio_cfg[i]);  		}  		/* Zero is the default value for these anyway */  		for (i = 0; i < WM8904_MIC_REGS; i++) -			reg_cache[WM8904_MIC_BIAS_CONTROL_0 + i] -				= pdata->mic_cfg[i]; +			regmap_update_bits(wm8904->regmap, +					   WM8904_MIC_BIAS_CONTROL_0 + i, +					   0xffff, +					   pdata->mic_cfg[i]);  	}  	/* Set Class W by default - this will be managed by the Class diff --git a/sound/soc/codecs/wm8996.c b/sound/soc/codecs/wm8996.c index 8af422e38fd..dc9b42b7fc4 100644 --- a/sound/soc/codecs/wm8996.c +++ b/sound/soc/codecs/wm8996.c @@ -2837,8 +2837,6 @@ static int wm8996_probe(struct snd_soc_codec *codec)  		}  	} -	regcache_cache_only(codec->control_data, true); -  	/* Apply platform data settings */  	snd_soc_update_bits(codec, WM8996_LINE_INPUT_CONTROL,  			    WM8996_INL_MODE_MASK | WM8996_INR_MODE_MASK, @@ -3051,7 +3049,6 @@ static int wm8996_remove(struct snd_soc_codec *codec)  	for (i = 0; i < ARRAY_SIZE(wm8996->supplies); i++)  		regulator_unregister_notifier(wm8996->supplies[i].consumer,  					      &wm8996->disable_nb[i]); -	regulator_bulk_free(ARRAY_SIZE(wm8996->supplies), wm8996->supplies);  	return 0;  } @@ -3206,14 +3203,15 @@ static __devinit int wm8996_i2c_probe(struct i2c_client *i2c,  	dev_info(&i2c->dev, "revision %c\n",  		 (reg & WM8996_CHIP_REV_MASK) + 'A'); -	regulator_bulk_disable(ARRAY_SIZE(wm8996->supplies), wm8996->supplies); -  	ret = wm8996_reset(wm8996);  	if (ret < 0) {  		dev_err(&i2c->dev, "Failed to issue reset\n");  		goto err_regmap;  	} +	regcache_cache_only(wm8996->regmap, true); +	regulator_bulk_disable(ARRAY_SIZE(wm8996->supplies), wm8996->supplies); +  	wm8996_init_gpio(wm8996);  	ret = snd_soc_register_codec(&i2c->dev, diff --git a/sound/soc/pxa/pxa-ssp.c b/sound/soc/pxa/pxa-ssp.c index 1c2aa7fab3f..4da5fc55c7e 100644 --- a/sound/soc/pxa/pxa-ssp.c +++ b/sound/soc/pxa/pxa-ssp.c @@ -33,7 +33,6 @@  #include <mach/hardware.h>  #include <mach/dma.h> -#include <mach/audio.h>  #include "../../arm/pxa2xx-pcm.h"  #include "pxa-ssp.h" @@ -194,7 +193,7 @@ static void pxa_ssp_set_scr(struct ssp_device *ssp, u32 div)  {  	u32 sscr0 = pxa_ssp_read_reg(ssp, SSCR0); -	if (cpu_is_pxa25x() && ssp->type == PXA25x_SSP) { +	if (ssp->type == PXA25x_SSP) {  		sscr0 &= ~0x0000ff00;  		sscr0 |= ((div - 2)/2) << 8; /* 2..512 */  	} else { @@ -212,7 +211,7 @@ static u32 pxa_ssp_get_scr(struct ssp_device *ssp)  	u32 sscr0 = pxa_ssp_read_reg(ssp, SSCR0);  	u32 div; -	if (cpu_is_pxa25x() && ssp->type == PXA25x_SSP) +	if (ssp->type == PXA25x_SSP)  		div = ((sscr0 >> 8) & 0xff) * 2 + 2;  	else  		div = ((sscr0 >> 8) & 0xfff) + 1; @@ -242,7 +241,7 @@ static int pxa_ssp_set_dai_sysclk(struct snd_soc_dai *cpu_dai,  		break;  	case PXA_SSP_CLK_PLL:  		/* Internal PLL is fixed */ -		if (cpu_is_pxa25x()) +		if (ssp->type == PXA25x_SSP)  			priv->sysclk = 1843200;  		else  			priv->sysclk = 13000000; @@ -266,11 +265,11 @@ static int pxa_ssp_set_dai_sysclk(struct snd_soc_dai *cpu_dai,  	/* The SSP clock must be disabled when changing SSP clock mode  	 * on PXA2xx.  On PXA3xx it must be enabled when doing so. */ -	if (!cpu_is_pxa3xx()) +	if (ssp->type != PXA3xx_SSP)  		clk_disable(ssp->clk);  	val = pxa_ssp_read_reg(ssp, SSCR0) | sscr0;  	pxa_ssp_write_reg(ssp, SSCR0, val); -	if (!cpu_is_pxa3xx()) +	if (ssp->type != PXA3xx_SSP)  		clk_enable(ssp->clk);  	return 0; @@ -294,24 +293,20 @@ static int pxa_ssp_set_dai_clkdiv(struct snd_soc_dai *cpu_dai,  	case PXA_SSP_AUDIO_DIV_SCDB:  		val = pxa_ssp_read_reg(ssp, SSACD);  		val &= ~SSACD_SCDB; -#if defined(CONFIG_PXA3xx) -		if (cpu_is_pxa3xx()) +		if (ssp->type == PXA3xx_SSP)  			val &= ~SSACD_SCDX8; -#endif  		switch (div) {  		case PXA_SSP_CLK_SCDB_1:  			val |= SSACD_SCDB;  			break;  		case PXA_SSP_CLK_SCDB_4:  			break; -#if defined(CONFIG_PXA3xx)  		case PXA_SSP_CLK_SCDB_8: -			if (cpu_is_pxa3xx()) +			if (ssp->type == PXA3xx_SSP)  				val |= SSACD_SCDX8;  			else  				return -EINVAL;  			break; -#endif  		default:  			return -EINVAL;  		} @@ -337,10 +332,8 @@ static int pxa_ssp_set_dai_pll(struct snd_soc_dai *cpu_dai, int pll_id,  	struct ssp_device *ssp = priv->ssp;  	u32 ssacd = pxa_ssp_read_reg(ssp, SSACD) & ~0x70; -#if defined(CONFIG_PXA3xx) -	if (cpu_is_pxa3xx()) +	if (ssp->type == PXA3xx_SSP)  		pxa_ssp_write_reg(ssp, SSACDD, 0); -#endif  	switch (freq_out) {  	case 5622000: @@ -365,11 +358,10 @@ static int pxa_ssp_set_dai_pll(struct snd_soc_dai *cpu_dai, int pll_id,  		break;  	default: -#ifdef CONFIG_PXA3xx  		/* PXA3xx has a clock ditherer which can be used to generate  		 * a wider range of frequencies - calculate a value for it.  		 */ -		if (cpu_is_pxa3xx()) { +		if (ssp->type == PXA3xx_SSP) {  			u32 val;  			u64 tmp = 19968;  			tmp *= 1000000; @@ -386,7 +378,6 @@ static int pxa_ssp_set_dai_pll(struct snd_soc_dai *cpu_dai, int pll_id,  				val, freq_out);  			break;  		} -#endif  		return -EINVAL;  	} @@ -590,10 +581,8 @@ static int pxa_ssp_hw_params(struct snd_pcm_substream *substream,  	/* bit size */  	switch (params_format(params)) {  	case SNDRV_PCM_FORMAT_S16_LE: -#ifdef CONFIG_PXA3xx -		if (cpu_is_pxa3xx()) +		if (ssp->type == PXA3xx_SSP)  			sscr0 |= SSCR0_FPCKE; -#endif  		sscr0 |= SSCR0_DataSize(16);  		break;  	case SNDRV_PCM_FORMAT_S24_LE: @@ -618,9 +607,7 @@ static int pxa_ssp_hw_params(struct snd_pcm_substream *substream,  			* trying and failing a lot; some of the registers  			* needed for that mode are only available on PXA3xx.  			*/ - -#ifdef CONFIG_PXA3xx -			if (!cpu_is_pxa3xx()) +			if (ssp->type != PXA3xx_SSP)  				return -EINVAL;  			sspsp |= SSPSP_SFRMWDTH(width * 2); @@ -628,9 +615,6 @@ static int pxa_ssp_hw_params(struct snd_pcm_substream *substream,  			sspsp |= SSPSP_EDMYSTOP(3);  			sspsp |= SSPSP_DMYSTOP(3);  			sspsp |= SSPSP_DMYSTRT(1); -#else -			return -EINVAL; -#endif  		} else {  			/* The frame width is the width the LRCLK is  			 * asserted for; the delay is expressed in diff --git a/sound/soc/tegra/tegra_wm8903.c b/sound/soc/tegra/tegra_wm8903.c index 0b0df49d9d3..3b6da91188a 100644 --- a/sound/soc/tegra/tegra_wm8903.c +++ b/sound/soc/tegra/tegra_wm8903.c @@ -346,6 +346,17 @@ static int tegra_wm8903_init(struct snd_soc_pcm_runtime *rtd)  	return 0;  } +static int tegra_wm8903_remove(struct snd_soc_card *card) +{ +	struct snd_soc_pcm_runtime *rtd = &(card->rtd[0]); +	struct snd_soc_dai *codec_dai = rtd->codec_dai; +	struct snd_soc_codec *codec = codec_dai->codec; + +	wm8903_mic_detect(codec, NULL, 0, 0); + +	return 0; +} +  static struct snd_soc_dai_link tegra_wm8903_dai = {  	.name = "WM8903",  	.stream_name = "WM8903 PCM", @@ -363,6 +374,8 @@ static struct snd_soc_card snd_soc_tegra_wm8903 = {  	.dai_link = &tegra_wm8903_dai,  	.num_links = 1, +	.remove = tegra_wm8903_remove, +  	.controls = tegra_wm8903_controls,  	.num_controls = ARRAY_SIZE(tegra_wm8903_controls),  	.dapm_widgets = tegra_wm8903_dapm_widgets, diff --git a/sound/usb/6fire/firmware.c b/sound/usb/6fire/firmware.c index 6f9715ab32f..56ad923bf6b 100644 --- a/sound/usb/6fire/firmware.c +++ b/sound/usb/6fire/firmware.c @@ -209,7 +209,7 @@ static int usb6fire_fw_ezusb_upload(  	int ret;  	u8 data;  	struct usb_device *device = interface_to_usbdev(intf); -	const struct firmware *fw = 0; +	const struct firmware *fw = NULL;  	struct ihex_record *rec = kmalloc(sizeof(struct ihex_record),  			GFP_KERNEL); diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c index cdf8b760197..54607f8c4f6 100644 --- a/sound/usb/pcm.c +++ b/sound/usb/pcm.c @@ -354,17 +354,21 @@ static int set_format(struct snd_usb_substream *subs, struct audioformat *fmt)  		    (get_endpoint(alts, 1)->bLength >= USB_DT_ENDPOINT_AUDIO_SIZE &&  		     get_endpoint(alts, 1)->bSynchAddress != 0 &&  		     !implicit_fb)) { -			snd_printk(KERN_ERR "%d:%d:%d : invalid synch pipe\n", -				   dev->devnum, fmt->iface, fmt->altsetting); +			snd_printk(KERN_ERR "%d:%d:%d : invalid sync pipe. bmAttributes %02x, bLength %d, bSynchAddress %02x\n", +				   dev->devnum, fmt->iface, fmt->altsetting, +				   get_endpoint(alts, 1)->bmAttributes, +				   get_endpoint(alts, 1)->bLength, +				   get_endpoint(alts, 1)->bSynchAddress);  			return -EINVAL;  		}  		ep = get_endpoint(alts, 1)->bEndpointAddress; -		if (get_endpoint(alts, 0)->bLength >= USB_DT_ENDPOINT_AUDIO_SIZE && +		if (!implicit_fb && +		    get_endpoint(alts, 0)->bLength >= USB_DT_ENDPOINT_AUDIO_SIZE &&  		    (( is_playback && ep != (unsigned int)(get_endpoint(alts, 0)->bSynchAddress | USB_DIR_IN)) || -		     (!is_playback && ep != (unsigned int)(get_endpoint(alts, 0)->bSynchAddress & ~USB_DIR_IN)) || -		     ( is_playback && !implicit_fb))) { -			snd_printk(KERN_ERR "%d:%d:%d : invalid synch pipe\n", -				   dev->devnum, fmt->iface, fmt->altsetting); +		     (!is_playback && ep != (unsigned int)(get_endpoint(alts, 0)->bSynchAddress & ~USB_DIR_IN)))) { +			snd_printk(KERN_ERR "%d:%d:%d : invalid sync pipe. is_playback %d, ep %02x, bSynchAddress %02x\n", +				   dev->devnum, fmt->iface, fmt->altsetting, +				   is_playback, ep, get_endpoint(alts, 0)->bSynchAddress);  			return -EINVAL;  		} @@ -1147,7 +1151,8 @@ static int snd_usb_substream_playback_trigger(struct snd_pcm_substream *substrea  	return -EINVAL;  } -int snd_usb_substream_capture_trigger(struct snd_pcm_substream *substream, int cmd) +static int snd_usb_substream_capture_trigger(struct snd_pcm_substream *substream, +					     int cmd)  {  	int err;  	struct snd_usb_substream *subs = substream->runtime->private_data; diff --git a/tools/hv/hv_kvp_daemon.c b/tools/hv/hv_kvp_daemon.c index 146fd6147e8..d9834b36294 100644 --- a/tools/hv/hv_kvp_daemon.c +++ b/tools/hv/hv_kvp_daemon.c @@ -701,14 +701,18 @@ int main(void)  	pfd.fd = fd;  	while (1) { +		struct sockaddr *addr_p = (struct sockaddr *) &addr; +		socklen_t addr_l = sizeof(addr);  		pfd.events = POLLIN;  		pfd.revents = 0;  		poll(&pfd, 1, -1); -		len = recv(fd, kvp_recv_buffer, sizeof(kvp_recv_buffer), 0); +		len = recvfrom(fd, kvp_recv_buffer, sizeof(kvp_recv_buffer), 0, +				addr_p, &addr_l); -		if (len < 0) { -			syslog(LOG_ERR, "recv failed; error:%d", len); +		if (len < 0 || addr.nl_pid) { +			syslog(LOG_ERR, "recvfrom failed; pid:%u error:%d %s", +					addr.nl_pid, errno, strerror(errno));  			close(fd);  			return -1;  		} diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 262589991ea..07b5c7703dd 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -1179,6 +1179,12 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used)  		fprintf(stderr, "cannot use both --output and --log-fd\n");  		usage_with_options(stat_usage, options);  	} + +	if (output_fd < 0) { +		fprintf(stderr, "argument to --log-fd must be a > 0\n"); +		usage_with_options(stat_usage, options); +	} +  	if (!output) {  		struct timespec tm;  		mode = append_file ? "a" : "w"; @@ -1190,7 +1196,7 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used)  		}  		clock_gettime(CLOCK_REALTIME, &tm);  		fprintf(output, "# started on %s\n", ctime(&tm.tv_sec)); -	} else if (output_fd != 2) { +	} else if (output_fd > 0) {  		mode = append_file ? "a" : "w";  		output = fdopen(output_fd, mode);  		if (!output) { diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 2dd5edf161b..e909d43cf54 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -1942,7 +1942,6 @@ int perf_file_header__read(struct perf_file_header *header,  		else  			return -1;  	} else if (ph->needs_swap) { -		unsigned int i;  		/*  		 * feature bitmap is declared as an array of unsigned longs --  		 * not good since its size can differ between the host that @@ -1958,14 +1957,17 @@ int perf_file_header__read(struct perf_file_header *header,  		 * file), punt and fallback to the original behavior --  		 * clearing all feature bits and setting buildid.  		 */ -		for (i = 0; i < BITS_TO_LONGS(HEADER_FEAT_BITS); ++i) -			header->adds_features[i] = bswap_64(header->adds_features[i]); +		mem_bswap_64(&header->adds_features, +			    BITS_TO_U64(HEADER_FEAT_BITS));  		if (!test_bit(HEADER_HOSTNAME, header->adds_features)) { -			for (i = 0; i < BITS_TO_LONGS(HEADER_FEAT_BITS); ++i) { -				header->adds_features[i] = bswap_64(header->adds_features[i]); -				header->adds_features[i] = bswap_32(header->adds_features[i]); -			} +			/* unswap as u64 */ +			mem_bswap_64(&header->adds_features, +				    BITS_TO_U64(HEADER_FEAT_BITS)); + +			/* unswap as u32 */ +			mem_bswap_32(&header->adds_features, +				    BITS_TO_U32(HEADER_FEAT_BITS));  		}  		if (!test_bit(HEADER_HOSTNAME, header->adds_features)) { @@ -2091,6 +2093,35 @@ static int read_attr(int fd, struct perf_header *ph,  	return ret <= 0 ? -1 : 0;  } +static int perf_evsel__set_tracepoint_name(struct perf_evsel *evsel) +{ +	struct event_format *event = trace_find_event(evsel->attr.config); +	char bf[128]; + +	if (event == NULL) +		return -1; + +	snprintf(bf, sizeof(bf), "%s:%s", event->system, event->name); +	evsel->name = strdup(bf); +	if (event->name == NULL) +		return -1; + +	return 0; +} + +static int perf_evlist__set_tracepoint_names(struct perf_evlist *evlist) +{ +	struct perf_evsel *pos; + +	list_for_each_entry(pos, &evlist->entries, node) { +		if (pos->attr.type == PERF_TYPE_TRACEPOINT && +		    perf_evsel__set_tracepoint_name(pos)) +			return -1; +	} + +	return 0; +} +  int perf_session__read_header(struct perf_session *session, int fd)  {  	struct perf_header *header = &session->header; @@ -2172,6 +2203,9 @@ int perf_session__read_header(struct perf_session *session, int fd)  	lseek(fd, header->data_offset, SEEK_SET); +	if (perf_evlist__set_tracepoint_names(session->evlist)) +		goto out_delete_evlist; +  	header->frozen = 1;  	return 0;  out_errno: diff --git a/tools/perf/util/include/linux/bitops.h b/tools/perf/util/include/linux/bitops.h index f1584833bd2..587a230d207 100644 --- a/tools/perf/util/include/linux/bitops.h +++ b/tools/perf/util/include/linux/bitops.h @@ -8,6 +8,8 @@  #define BITS_PER_LONG __WORDSIZE  #define BITS_PER_BYTE           8  #define BITS_TO_LONGS(nr)       DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long)) +#define BITS_TO_U64(nr)         DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(u64)) +#define BITS_TO_U32(nr)         DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(u32))  #define for_each_set_bit(bit, addr, size) \  	for ((bit) = find_first_bit((addr), (size));		\ diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 2600916efa8..c3e399bcf18 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -442,6 +442,16 @@ static void perf_tool__fill_defaults(struct perf_tool *tool)  			tool->finished_round = process_finished_round_stub;  	}  } +  +void mem_bswap_32(void *src, int byte_size) +{ +	u32 *m = src; +	while (byte_size > 0) { +		*m = bswap_32(*m); +		byte_size -= sizeof(u32); +		++m; +	} +}  void mem_bswap_64(void *src, int byte_size)  { diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h index 7a5434c0056..0c702e3f0a3 100644 --- a/tools/perf/util/session.h +++ b/tools/perf/util/session.h @@ -80,6 +80,7 @@ struct branch_info *machine__resolve_bstack(struct machine *self,  bool perf_session__has_traces(struct perf_session *self, const char *msg);  void mem_bswap_64(void *src, int byte_size); +void mem_bswap_32(void *src, int byte_size);  void perf_event__attr_swap(struct perf_event_attr *attr);  int perf_session__create_kernel_maps(struct perf_session *self); diff --git a/virt/kvm/assigned-dev.c b/virt/kvm/assigned-dev.c index 01f572c10c7..b1e091ae2f3 100644 --- a/virt/kvm/assigned-dev.c +++ b/virt/kvm/assigned-dev.c @@ -635,7 +635,6 @@ static int kvm_vm_ioctl_assign_device(struct kvm *kvm,  	int r = 0, idx;  	struct kvm_assigned_dev_kernel *match;  	struct pci_dev *dev; -	u8 header_type;  	if (!(assigned_dev->flags & KVM_DEV_ASSIGN_ENABLE_IOMMU))  		return -EINVAL; @@ -668,8 +667,7 @@ static int kvm_vm_ioctl_assign_device(struct kvm *kvm,  	}  	/* Don't allow bridges to be assigned */ -	pci_read_config_byte(dev, PCI_HEADER_TYPE, &header_type); -	if ((header_type & PCI_HEADER_TYPE) != PCI_HEADER_TYPE_NORMAL) { +	if (dev->hdr_type != PCI_HEADER_TYPE_NORMAL) {  		r = -EPERM;  		goto out_put;  	}  |