commit:     fe5de491080fffef58f47ac59a6dbab9324f4599
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Tue Nov 10 00:29:54 2015 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Tue Nov 10 00:29:54 2015 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=fe5de491

Linux patch 4.1.13

 0000_README             |    4 +
 1012_linux-4.1.13.patch | 3220 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 3224 insertions(+)

diff --git a/0000_README b/0000_README
index ff278e3..acad761 100644
--- a/0000_README
+++ b/0000_README
@@ -91,6 +91,10 @@ Patch:  1011_linux-4.1.12.patch
 From:   http://www.kernel.org
 Desc:   Linux 4.1.12
 
+Patch:  1012_linux-4.1.13.patch
+From:   http://www.kernel.org
+Desc:   Linux 4.1.13
+
 Patch:  1500_XATTR_USER_PREFIX.patch
 From:   https://bugs.gentoo.org/show_bug.cgi?id=470644
 Desc:   Support for namespace user.pax.* on tmpfs.

diff --git a/1012_linux-4.1.13.patch b/1012_linux-4.1.13.patch
new file mode 100644
index 0000000..449c35f
--- /dev/null
+++ b/1012_linux-4.1.13.patch
@@ -0,0 +1,3220 @@
+diff --git a/Documentation/devicetree/bindings/mfd/mfd.txt 
b/Documentation/devicetree/bindings/mfd/mfd.txt
+new file mode 100644
+index 000000000000..af9d6931a1a2
+--- /dev/null
++++ b/Documentation/devicetree/bindings/mfd/mfd.txt
+@@ -0,0 +1,41 @@
++Multi-Function Devices (MFD)
++
++These devices comprise a nexus for heterogeneous hardware blocks containing
++more than one non-unique yet varying hardware functionality.
++
++A typical MFD can be:
++
++- A mixed signal ASIC on an external bus, sometimes a PMIC (Power Management
++  Integrated Circuit) that is manufactured in a lower technology node (rough
++  silicon) that handles analog drivers for things like audio amplifiers, LED
++  drivers, level shifters, PHY (physical interfaces to things like USB or
++  ethernet), regulators etc.
++
++- A range of memory registers containing "miscellaneous system registers" also
++  known as a system controller "syscon" or any other memory range containing a
++  mix of unrelated hardware devices.
++
++Optional properties:
++
++- compatible : "simple-mfd" - this signifies that the operating system should
++  consider all subnodes of the MFD device as separate devices akin to how
++  "simple-bus" inidicates when to see subnodes as children for a simple
++  memory-mapped bus. For more complex devices, when the nexus driver has to
++  probe registers to figure out what child devices exist etc, this should not
++  be used. In the latter case the child devices will be determined by the
++  operating system.
++
++Example:
++
++foo@1000 {
++      compatible = "syscon", "simple-mfd";
++      reg = <0x01000 0x1000>;
++
++      led@08.0 {
++              compatible = "register-bit-led";
++              offset = <0x08>;
++              mask = <0x01>;
++              label = "myled";
++              default-state = "on";
++      };
++};
+diff --git a/Makefile b/Makefile
+index 2320f1911404..d5d229db61d5 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 4
+ PATCHLEVEL = 1
+-SUBLEVEL = 12
++SUBLEVEL = 13
+ EXTRAVERSION =
+ NAME = Series 4800
+ 
+diff --git a/arch/arm/boot/dts/am57xx-beagle-x15.dts 
b/arch/arm/boot/dts/am57xx-beagle-x15.dts
+index c9df40e5cd3b..e8397879d0a7 100644
+--- a/arch/arm/boot/dts/am57xx-beagle-x15.dts
++++ b/arch/arm/boot/dts/am57xx-beagle-x15.dts
+@@ -354,11 +354,12 @@
+                               /* SMPS9 unused */
+ 
+                               ldo1_reg: ldo1 {
+-                                      /* VDD_SD  */
++                                      /* VDD_SD / VDDSHV8  */
+                                       regulator-name = "ldo1";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-boot-on;
++                                      regulator-always-on;
+                               };
+ 
+                               ldo2_reg: ldo2 {
+diff --git a/arch/arm/boot/dts/armada-385-db-ap.dts 
b/arch/arm/boot/dts/armada-385-db-ap.dts
+index 7219ac3a3d90..9f730e8e9f87 100644
+--- a/arch/arm/boot/dts/armada-385-db-ap.dts
++++ b/arch/arm/boot/dts/armada-385-db-ap.dts
+@@ -46,7 +46,7 @@
+ 
+ / {
+       model = "Marvell Armada 385 Access Point Development Board";
+-      compatible = "marvell,a385-db-ap", "marvell,armada385", 
"marvell,armada38x";
++      compatible = "marvell,a385-db-ap", "marvell,armada385", 
"marvell,armada380";
+ 
+       chosen {
+               stdout-path = "serial1:115200n8";
+diff --git a/arch/arm/boot/dts/exynos5420-peach-pit.dts 
b/arch/arm/boot/dts/exynos5420-peach-pit.dts
+index 146e71118a72..a0ec8bff83dd 100644
+--- a/arch/arm/boot/dts/exynos5420-peach-pit.dts
++++ b/arch/arm/boot/dts/exynos5420-peach-pit.dts
+@@ -915,6 +915,11 @@
+       };
+ };
+ 
++&pmu_system_controller {
++      assigned-clocks = <&pmu_system_controller 0>;
++      assigned-clock-parents = <&clock CLK_FIN_PLL>;
++};
++
+ &rtc {
+       status = "okay";
+       clocks = <&clock CLK_RTC>, <&max77802 MAX77802_CLK_32K_AP>;
+diff --git a/arch/arm/boot/dts/exynos5800-peach-pi.dts 
b/arch/arm/boot/dts/exynos5800-peach-pi.dts
+index 02eb8b15374f..1171f347878a 100644
+--- a/arch/arm/boot/dts/exynos5800-peach-pi.dts
++++ b/arch/arm/boot/dts/exynos5800-peach-pi.dts
+@@ -878,6 +878,11 @@
+       };
+ };
+ 
++&pmu_system_controller {
++      assigned-clocks = <&pmu_system_controller 0>;
++      assigned-clock-parents = <&clock CLK_FIN_PLL>;
++};
++
+ &rtc {
+       status = "okay";
+       clocks = <&clock CLK_RTC>, <&max77802 MAX77802_CLK_32K_AP>;
+diff --git a/arch/arm/boot/dts/imx6dl-riotboard.dts 
b/arch/arm/boot/dts/imx6dl-riotboard.dts
+index 43cb3fd76be7..5111f5170d53 100644
+--- a/arch/arm/boot/dts/imx6dl-riotboard.dts
++++ b/arch/arm/boot/dts/imx6dl-riotboard.dts
+@@ -305,8 +305,8 @@
+ &usdhc2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc2>;
+-      cd-gpios = <&gpio1 4 0>;
+-      wp-gpios = <&gpio1 2 0>;
++      cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
++      wp-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
+       vmmc-supply = <&reg_3p3v>;
+       status = "okay";
+ };
+@@ -314,8 +314,8 @@
+ &usdhc3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc3>;
+-      cd-gpios = <&gpio7 0 0>;
+-      wp-gpios = <&gpio7 1 0>;
++      cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>;
++      wp-gpios = <&gpio7 1 GPIO_ACTIVE_HIGH>;
+       vmmc-supply = <&reg_3p3v>;
+       status = "okay";
+ };
+diff --git a/arch/arm/boot/dts/imx6q-arm2.dts 
b/arch/arm/boot/dts/imx6q-arm2.dts
+index 78df05e9d1ce..d6515f7a56c4 100644
+--- a/arch/arm/boot/dts/imx6q-arm2.dts
++++ b/arch/arm/boot/dts/imx6q-arm2.dts
+@@ -11,6 +11,7 @@
+  */
+ 
+ /dts-v1/;
++#include <dt-bindings/gpio/gpio.h>
+ #include "imx6q.dtsi"
+ 
+ / {
+@@ -196,8 +197,8 @@
+ };
+ 
+ &usdhc3 {
+-      cd-gpios = <&gpio6 11 0>;
+-      wp-gpios = <&gpio6 14 0>;
++      cd-gpios = <&gpio6 11 GPIO_ACTIVE_LOW>;
++      wp-gpios = <&gpio6 14 GPIO_ACTIVE_HIGH>;
+       vmmc-supply = <&reg_3p3v>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc3
+diff --git a/arch/arm/boot/dts/imx6q-gk802.dts 
b/arch/arm/boot/dts/imx6q-gk802.dts
+index 703539cf36d3..00bd63e63d0c 100644
+--- a/arch/arm/boot/dts/imx6q-gk802.dts
++++ b/arch/arm/boot/dts/imx6q-gk802.dts
+@@ -7,6 +7,7 @@
+  */
+ 
+ /dts-v1/;
++#include <dt-bindings/gpio/gpio.h>
+ #include "imx6q.dtsi"
+ 
+ / {
+@@ -161,7 +162,7 @@
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc3>;
+       bus-width = <4>;
+-      cd-gpios = <&gpio6 11 0>;
++      cd-gpios = <&gpio6 11 GPIO_ACTIVE_LOW>;
+       vmmc-supply = <&reg_3p3v>;
+       status = "okay";
+ };
+diff --git a/arch/arm/boot/dts/imx6q-tbs2910.dts 
b/arch/arm/boot/dts/imx6q-tbs2910.dts
+index a43abfa21e33..5645d52850a7 100644
+--- a/arch/arm/boot/dts/imx6q-tbs2910.dts
++++ b/arch/arm/boot/dts/imx6q-tbs2910.dts
+@@ -251,7 +251,7 @@
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc2>;
+       bus-width = <4>;
+-      cd-gpios = <&gpio2 2 GPIO_ACTIVE_HIGH>;
++      cd-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>;
+       vmmc-supply = <&reg_3p3v>;
+       status = "okay";
+ };
+@@ -260,7 +260,7 @@
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc3>;
+       bus-width = <4>;
+-      cd-gpios = <&gpio2 0 GPIO_ACTIVE_HIGH>;
++      cd-gpios = <&gpio2 0 GPIO_ACTIVE_LOW>;
+       wp-gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>;
+       vmmc-supply = <&reg_3p3v>;
+       status = "okay";
+diff --git a/arch/arm/boot/dts/imx6qdl-aristainetos.dtsi 
b/arch/arm/boot/dts/imx6qdl-aristainetos.dtsi
+index e6d9195a1da7..f4d6ae564ead 100644
+--- a/arch/arm/boot/dts/imx6qdl-aristainetos.dtsi
++++ b/arch/arm/boot/dts/imx6qdl-aristainetos.dtsi
+@@ -173,7 +173,7 @@
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc1>;
+       vmmc-supply = <&reg_3p3v>;
+-      cd-gpios = <&gpio4 7 GPIO_ACTIVE_HIGH>;
++      cd-gpios = <&gpio4 7 GPIO_ACTIVE_LOW>;
+       status = "okay";
+ };
+ 
+@@ -181,7 +181,7 @@
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc2>;
+       vmmc-supply = <&reg_3p3v>;
+-      cd-gpios = <&gpio4 8 GPIO_ACTIVE_HIGH>;
++      cd-gpios = <&gpio4 8 GPIO_ACTIVE_LOW>;
+       status = "okay";
+ };
+ 
+diff --git a/arch/arm/boot/dts/imx6qdl-cubox-i.dtsi 
b/arch/arm/boot/dts/imx6qdl-cubox-i.dtsi
+index d033bb182060..6a846e0ef505 100644
+--- a/arch/arm/boot/dts/imx6qdl-cubox-i.dtsi
++++ b/arch/arm/boot/dts/imx6qdl-cubox-i.dtsi
+@@ -259,6 +259,6 @@
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_cubox_i_usdhc2_aux &pinctrl_cubox_i_usdhc2>;
+       vmmc-supply = <&reg_3p3v>;
+-      cd-gpios = <&gpio1 4 0>;
++      cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
+       status = "okay";
+ };
+diff --git a/arch/arm/boot/dts/imx6qdl-dfi-fs700-m60.dtsi 
b/arch/arm/boot/dts/imx6qdl-dfi-fs700-m60.dtsi
+index 2c253d6d20bd..45e7c39e80d5 100644
+--- a/arch/arm/boot/dts/imx6qdl-dfi-fs700-m60.dtsi
++++ b/arch/arm/boot/dts/imx6qdl-dfi-fs700-m60.dtsi
+@@ -1,3 +1,5 @@
++#include <dt-bindings/gpio/gpio.h>
++
+ / {
+       regulators {
+               compatible = "simple-bus";
+@@ -181,7 +183,7 @@
+ &usdhc2 { /* module slot */
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc2>;
+-      cd-gpios = <&gpio2 2 0>;
++      cd-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>;
+       status = "okay";
+ };
+ 
+diff --git a/arch/arm/boot/dts/imx6qdl-gw52xx.dtsi 
b/arch/arm/boot/dts/imx6qdl-gw52xx.dtsi
+index b5756c21ea1d..4493f6e99330 100644
+--- a/arch/arm/boot/dts/imx6qdl-gw52xx.dtsi
++++ b/arch/arm/boot/dts/imx6qdl-gw52xx.dtsi
+@@ -318,7 +318,7 @@
+ &usdhc3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc3>;
+-      cd-gpios = <&gpio7 0 GPIO_ACTIVE_HIGH>;
++      cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>;
+       vmmc-supply = <&reg_3p3v>;
+       status = "okay";
+ };
+diff --git a/arch/arm/boot/dts/imx6qdl-gw53xx.dtsi 
b/arch/arm/boot/dts/imx6qdl-gw53xx.dtsi
+index 86f03c1b147c..a857d1294609 100644
+--- a/arch/arm/boot/dts/imx6qdl-gw53xx.dtsi
++++ b/arch/arm/boot/dts/imx6qdl-gw53xx.dtsi
+@@ -324,7 +324,7 @@
+ &usdhc3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc3>;
+-      cd-gpios = <&gpio7 0 GPIO_ACTIVE_HIGH>;
++      cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>;
+       vmmc-supply = <&reg_3p3v>;
+       status = "okay";
+ };
+diff --git a/arch/arm/boot/dts/imx6qdl-gw54xx.dtsi 
b/arch/arm/boot/dts/imx6qdl-gw54xx.dtsi
+index 4a8d97f47759..1afe3385e2d2 100644
+--- a/arch/arm/boot/dts/imx6qdl-gw54xx.dtsi
++++ b/arch/arm/boot/dts/imx6qdl-gw54xx.dtsi
+@@ -417,7 +417,7 @@
+ &usdhc3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc3>;
+-      cd-gpios = <&gpio7 0 GPIO_ACTIVE_HIGH>;
++      cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>;
+       vmmc-supply = <&reg_3p3v>;
+       status = "okay";
+ };
+diff --git a/arch/arm/boot/dts/imx6qdl-hummingboard.dtsi 
b/arch/arm/boot/dts/imx6qdl-hummingboard.dtsi
+index 151a3db2aea9..c6833d2b4ff5 100644
+--- a/arch/arm/boot/dts/imx6qdl-hummingboard.dtsi
++++ b/arch/arm/boot/dts/imx6qdl-hummingboard.dtsi
+@@ -41,6 +41,7 @@
+  */
+ #include "imx6qdl-microsom.dtsi"
+ #include "imx6qdl-microsom-ar8035.dtsi"
++#include <dt-bindings/gpio/gpio.h>
+ 
+ / {
+       chosen {
+@@ -288,6 +289,6 @@
+               &pinctrl_hummingboard_usdhc2
+       >;
+       vmmc-supply = <&reg_3p3v>;
+-      cd-gpios = <&gpio1 4 0>;
++      cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
+       status = "okay";
+ };
+diff --git a/arch/arm/boot/dts/imx6qdl-nitrogen6x.dtsi 
b/arch/arm/boot/dts/imx6qdl-nitrogen6x.dtsi
+index 08218120e770..64e0b6178bf4 100644
+--- a/arch/arm/boot/dts/imx6qdl-nitrogen6x.dtsi
++++ b/arch/arm/boot/dts/imx6qdl-nitrogen6x.dtsi
+@@ -449,7 +449,7 @@
+ &usdhc3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc3>;
+-      cd-gpios = <&gpio7 0 0>;
++      cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>;
+       vmmc-supply = <&reg_3p3v>;
+       status = "okay";
+ };
+@@ -457,7 +457,7 @@
+ &usdhc4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc4>;
+-      cd-gpios = <&gpio2 6 0>;
++      cd-gpios = <&gpio2 6 GPIO_ACTIVE_LOW>;
+       vmmc-supply = <&reg_3p3v>;
+       status = "okay";
+ };
+diff --git a/arch/arm/boot/dts/imx6qdl-phytec-pfla02.dtsi 
b/arch/arm/boot/dts/imx6qdl-phytec-pfla02.dtsi
+index 1ce6133b67f5..9e6ecd99b472 100644
+--- a/arch/arm/boot/dts/imx6qdl-phytec-pfla02.dtsi
++++ b/arch/arm/boot/dts/imx6qdl-phytec-pfla02.dtsi
+@@ -409,8 +409,8 @@
+ &usdhc2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc2>;
+-      cd-gpios = <&gpio1 4 0>;
+-      wp-gpios = <&gpio1 2 0>;
++      cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
++      wp-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
+       status = "disabled";
+ };
+ 
+@@ -418,7 +418,7 @@
+         pinctrl-names = "default";
+         pinctrl-0 = <&pinctrl_usdhc3
+                    &pinctrl_usdhc3_cdwp>;
+-        cd-gpios = <&gpio1 27 0>;
+-        wp-gpios = <&gpio1 29 0>;
++      cd-gpios = <&gpio1 27 GPIO_ACTIVE_LOW>;
++      wp-gpios = <&gpio1 29 GPIO_ACTIVE_HIGH>;
+         status = "disabled";
+ };
+diff --git a/arch/arm/boot/dts/imx6qdl-rex.dtsi 
b/arch/arm/boot/dts/imx6qdl-rex.dtsi
+index 394a4ace351a..a50356243888 100644
+--- a/arch/arm/boot/dts/imx6qdl-rex.dtsi
++++ b/arch/arm/boot/dts/imx6qdl-rex.dtsi
+@@ -340,7 +340,7 @@
+       pinctrl-0 = <&pinctrl_usdhc2>;
+       bus-width = <4>;
+       cd-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>;
+-      wp-gpios = <&gpio2 3 GPIO_ACTIVE_LOW>;
++      wp-gpios = <&gpio2 3 GPIO_ACTIVE_HIGH>;
+       status = "okay";
+ };
+ 
+@@ -349,6 +349,6 @@
+       pinctrl-0 = <&pinctrl_usdhc3>;
+       bus-width = <4>;
+       cd-gpios = <&gpio2 0 GPIO_ACTIVE_LOW>;
+-      wp-gpios = <&gpio2 1 GPIO_ACTIVE_LOW>;
++      wp-gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>;
+       status = "okay";
+ };
+diff --git a/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi 
b/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi
+index 3b24b12651b2..e329ca5c3322 100644
+--- a/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi
++++ b/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi
+@@ -467,8 +467,8 @@
+       pinctrl-0 = <&pinctrl_usdhc3>;
+       pinctrl-1 = <&pinctrl_usdhc3_100mhz>;
+       pinctrl-2 = <&pinctrl_usdhc3_200mhz>;
+-      cd-gpios = <&gpio6 15 0>;
+-      wp-gpios = <&gpio1 13 0>;
++      cd-gpios = <&gpio6 15 GPIO_ACTIVE_LOW>;
++      wp-gpios = <&gpio1 13 GPIO_ACTIVE_HIGH>;
+       status = "okay";
+ };
+ 
+diff --git a/arch/arm/boot/dts/imx6qdl-sabrelite.dtsi 
b/arch/arm/boot/dts/imx6qdl-sabrelite.dtsi
+index 0b28a9d5241e..1e27485e4293 100644
+--- a/arch/arm/boot/dts/imx6qdl-sabrelite.dtsi
++++ b/arch/arm/boot/dts/imx6qdl-sabrelite.dtsi
+@@ -444,8 +444,8 @@
+ &usdhc3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc3>;
+-      cd-gpios = <&gpio7 0 0>;
+-      wp-gpios = <&gpio7 1 0>;
++      cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>;
++      wp-gpios = <&gpio7 1 GPIO_ACTIVE_HIGH>;
+       vmmc-supply = <&reg_3p3v>;
+       status = "okay";
+ };
+@@ -453,7 +453,7 @@
+ &usdhc4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc4>;
+-      cd-gpios = <&gpio2 6 0>;
++      cd-gpios = <&gpio2 6 GPIO_ACTIVE_LOW>;
+       vmmc-supply = <&reg_3p3v>;
+       status = "okay";
+ };
+diff --git a/arch/arm/boot/dts/imx6qdl-sabresd.dtsi 
b/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
+index a626e6dd8022..944eb81cb2b8 100644
+--- a/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
++++ b/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
+@@ -562,8 +562,8 @@
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc2>;
+       bus-width = <8>;
+-      cd-gpios = <&gpio2 2 0>;
+-      wp-gpios = <&gpio2 3 0>;
++      cd-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>;
++      wp-gpios = <&gpio2 3 GPIO_ACTIVE_HIGH>;
+       status = "okay";
+ };
+ 
+@@ -571,8 +571,8 @@
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc3>;
+       bus-width = <8>;
+-      cd-gpios = <&gpio2 0 0>;
+-      wp-gpios = <&gpio2 1 0>;
++      cd-gpios = <&gpio2 0 GPIO_ACTIVE_LOW>;
++      wp-gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>;
+       status = "okay";
+ };
+ 
+diff --git a/arch/arm/boot/dts/imx6qdl-tx6.dtsi 
b/arch/arm/boot/dts/imx6qdl-tx6.dtsi
+index f02b80b41d4f..da08de324e9e 100644
+--- a/arch/arm/boot/dts/imx6qdl-tx6.dtsi
++++ b/arch/arm/boot/dts/imx6qdl-tx6.dtsi
+@@ -680,7 +680,7 @@
+       pinctrl-0 = <&pinctrl_usdhc1>;
+       bus-width = <4>;
+       no-1-8-v;
+-      cd-gpios = <&gpio7 2 0>;
++      cd-gpios = <&gpio7 2 GPIO_ACTIVE_LOW>;
+       fsl,wp-controller;
+       status = "okay";
+ };
+@@ -690,7 +690,7 @@
+       pinctrl-0 = <&pinctrl_usdhc2>;
+       bus-width = <4>;
+       no-1-8-v;
+-      cd-gpios = <&gpio7 3 0>;
++      cd-gpios = <&gpio7 3 GPIO_ACTIVE_LOW>;
+       fsl,wp-controller;
+       status = "okay";
+ };
+diff --git a/arch/arm/boot/dts/imx6qdl-wandboard.dtsi 
b/arch/arm/boot/dts/imx6qdl-wandboard.dtsi
+index 5fb091675582..9e096d811bed 100644
+--- a/arch/arm/boot/dts/imx6qdl-wandboard.dtsi
++++ b/arch/arm/boot/dts/imx6qdl-wandboard.dtsi
+@@ -9,6 +9,8 @@
+  *
+  */
+ 
++#include <dt-bindings/gpio/gpio.h>
++
+ / {
+       regulators {
+               compatible = "simple-bus";
+@@ -250,13 +252,13 @@
+ &usdhc1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc1>;
+-      cd-gpios = <&gpio1 2 0>;
++      cd-gpios = <&gpio1 2 GPIO_ACTIVE_LOW>;
+       status = "okay";
+ };
+ 
+ &usdhc3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc3>;
+-      cd-gpios = <&gpio3 9 0>;
++      cd-gpios = <&gpio3 9 GPIO_ACTIVE_LOW>;
+       status = "okay";
+ };
+diff --git a/arch/arm/boot/dts/imx6sl-evk.dts 
b/arch/arm/boot/dts/imx6sl-evk.dts
+index 945887d3fdb3..b84dff2e94ea 100644
+--- a/arch/arm/boot/dts/imx6sl-evk.dts
++++ b/arch/arm/boot/dts/imx6sl-evk.dts
+@@ -617,8 +617,8 @@
+       pinctrl-1 = <&pinctrl_usdhc1_100mhz>;
+       pinctrl-2 = <&pinctrl_usdhc1_200mhz>;
+       bus-width = <8>;
+-      cd-gpios = <&gpio4 7 0>;
+-      wp-gpios = <&gpio4 6 0>;
++      cd-gpios = <&gpio4 7 GPIO_ACTIVE_LOW>;
++      wp-gpios = <&gpio4 6 GPIO_ACTIVE_HIGH>;
+       status = "okay";
+ };
+ 
+@@ -627,8 +627,8 @@
+       pinctrl-0 = <&pinctrl_usdhc2>;
+       pinctrl-1 = <&pinctrl_usdhc2_100mhz>;
+       pinctrl-2 = <&pinctrl_usdhc2_200mhz>;
+-      cd-gpios = <&gpio5 0 0>;
+-      wp-gpios = <&gpio4 29 0>;
++      cd-gpios = <&gpio5 0 GPIO_ACTIVE_LOW>;
++      wp-gpios = <&gpio4 29 GPIO_ACTIVE_HIGH>;
+       status = "okay";
+ };
+ 
+@@ -637,6 +637,6 @@
+       pinctrl-0 = <&pinctrl_usdhc3>;
+       pinctrl-1 = <&pinctrl_usdhc3_100mhz>;
+       pinctrl-2 = <&pinctrl_usdhc3_200mhz>;
+-      cd-gpios = <&gpio3 22 0>;
++      cd-gpios = <&gpio3 22 GPIO_ACTIVE_LOW>;
+       status = "okay";
+ };
+diff --git a/arch/arm/boot/dts/imx6sx-sabreauto.dts 
b/arch/arm/boot/dts/imx6sx-sabreauto.dts
+index e3c0b63c2205..115f3fd78971 100644
+--- a/arch/arm/boot/dts/imx6sx-sabreauto.dts
++++ b/arch/arm/boot/dts/imx6sx-sabreauto.dts
+@@ -49,7 +49,7 @@
+       pinctrl-1 = <&pinctrl_usdhc3_100mhz>;
+       pinctrl-2 = <&pinctrl_usdhc3_200mhz>;
+       bus-width = <8>;
+-      cd-gpios = <&gpio7 10 GPIO_ACTIVE_HIGH>;
++      cd-gpios = <&gpio7 10 GPIO_ACTIVE_LOW>;
+       wp-gpios = <&gpio3 19 GPIO_ACTIVE_HIGH>;
+       keep-power-in-suspend;
+       enable-sdio-wakeup;
+@@ -61,7 +61,7 @@
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc4>;
+       bus-width = <8>;
+-      cd-gpios = <&gpio7 11 GPIO_ACTIVE_HIGH>;
++      cd-gpios = <&gpio7 11 GPIO_ACTIVE_LOW>;
+       no-1-8-v;
+       keep-power-in-suspend;
+       enable-sdio-wakup;
+diff --git a/arch/arm/boot/dts/imx6sx-sdb.dtsi 
b/arch/arm/boot/dts/imx6sx-sdb.dtsi
+index cef04cef3a80..ac88c3467078 100644
+--- a/arch/arm/boot/dts/imx6sx-sdb.dtsi
++++ b/arch/arm/boot/dts/imx6sx-sdb.dtsi
+@@ -293,7 +293,7 @@
+       pinctrl-1 = <&pinctrl_usdhc3_100mhz>;
+       pinctrl-2 = <&pinctrl_usdhc3_200mhz>;
+       bus-width = <8>;
+-      cd-gpios = <&gpio2 10 GPIO_ACTIVE_HIGH>;
++      cd-gpios = <&gpio2 10 GPIO_ACTIVE_LOW>;
+       wp-gpios = <&gpio2 15 GPIO_ACTIVE_HIGH>;
+       keep-power-in-suspend;
+       enable-sdio-wakeup;
+@@ -304,7 +304,7 @@
+ &usdhc4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_usdhc4>;
+-      cd-gpios = <&gpio6 21 GPIO_ACTIVE_HIGH>;
++      cd-gpios = <&gpio6 21 GPIO_ACTIVE_LOW>;
+       wp-gpios = <&gpio6 20 GPIO_ACTIVE_HIGH>;
+       status = "okay";
+ };
+diff --git a/arch/arm/boot/dts/sun7i-a20.dtsi 
b/arch/arm/boot/dts/sun7i-a20.dtsi
+index 2b4847c7cbd4..fa36571b755a 100644
+--- a/arch/arm/boot/dts/sun7i-a20.dtsi
++++ b/arch/arm/boot/dts/sun7i-a20.dtsi
+@@ -111,7 +111,7 @@
+                               720000  1200000
+                               528000  1100000
+                               312000  1000000
+-                              144000  900000
++                              144000  1000000
+                               >;
+                       #cooling-cells = <2>;
+                       cooling-min-level = <0>;
+diff --git a/arch/arm/kvm/Kconfig b/arch/arm/kvm/Kconfig
+index f1f79d104309..60c1a0f4d67a 100644
+--- a/arch/arm/kvm/Kconfig
++++ b/arch/arm/kvm/Kconfig
+@@ -21,6 +21,7 @@ config KVM
+       depends on MMU && OF
+       select PREEMPT_NOTIFIERS
+       select ANON_INODES
++      select ARM_GIC
+       select HAVE_KVM_CPU_RELAX_INTERCEPT
+       select HAVE_KVM_ARCH_TLB_FLUSH_ALL
+       select KVM_MMIO
+diff --git a/arch/arm/plat-orion/common.c b/arch/arm/plat-orion/common.c
+index f5b00f41c4f6..b8b6e22f9987 100644
+--- a/arch/arm/plat-orion/common.c
++++ b/arch/arm/plat-orion/common.c
+@@ -499,7 +499,7 @@ void __init orion_ge00_switch_init(struct 
dsa_platform_data *d, int irq)
+ 
+       d->netdev = &orion_ge00.dev;
+       for (i = 0; i < d->nr_chips; i++)
+-              d->chip[i].host_dev = &orion_ge00_shared.dev;
++              d->chip[i].host_dev = &orion_ge_mvmdio.dev;
+       orion_switch_device.dev.platform_data = d;
+ 
+       platform_device_register(&orion_switch_device);
+diff --git a/arch/arm/vdso/vdsomunge.c b/arch/arm/vdso/vdsomunge.c
+index aedec81d1198..f6455273b2f8 100644
+--- a/arch/arm/vdso/vdsomunge.c
++++ b/arch/arm/vdso/vdsomunge.c
+@@ -45,7 +45,6 @@
+  * it does.
+  */
+ 
+-#include <byteswap.h>
+ #include <elf.h>
+ #include <errno.h>
+ #include <fcntl.h>
+@@ -59,6 +58,16 @@
+ #include <sys/types.h>
+ #include <unistd.h>
+ 
++#define swab16(x) \
++      ((((x) & 0x00ff) << 8) | \
++       (((x) & 0xff00) >> 8))
++
++#define swab32(x) \
++      ((((x) & 0x000000ff) << 24) | \
++       (((x) & 0x0000ff00) <<  8) | \
++       (((x) & 0x00ff0000) >>  8) | \
++       (((x) & 0xff000000) >> 24))
++
+ #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+ #define HOST_ORDER ELFDATA2LSB
+ #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+@@ -104,17 +113,17 @@ static void cleanup(void)
+ 
+ static Elf32_Word read_elf_word(Elf32_Word word, bool swap)
+ {
+-      return swap ? bswap_32(word) : word;
++      return swap ? swab32(word) : word;
+ }
+ 
+ static Elf32_Half read_elf_half(Elf32_Half half, bool swap)
+ {
+-      return swap ? bswap_16(half) : half;
++      return swap ? swab16(half) : half;
+ }
+ 
+ static void write_elf_word(Elf32_Word val, Elf32_Word *dst, bool swap)
+ {
+-      *dst = swap ? bswap_32(val) : val;
++      *dst = swap ? swab32(val) : val;
+ }
+ 
+ int main(int argc, char **argv)
+diff --git a/arch/arm64/include/asm/cpuidle.h 
b/arch/arm64/include/asm/cpuidle.h
+index 141b2fcabaa6..0f74f05d662a 100644
+--- a/arch/arm64/include/asm/cpuidle.h
++++ b/arch/arm64/include/asm/cpuidle.h
+@@ -5,20 +5,16 @@
+ 
+ #ifdef CONFIG_CPU_IDLE
+ extern int arm_cpuidle_init(unsigned int cpu);
+-extern int cpu_suspend(unsigned long arg);
++extern int arm_cpuidle_suspend(int index);
+ #else
+ static inline int arm_cpuidle_init(unsigned int cpu)
+ {
+       return -EOPNOTSUPP;
+ }
+ 
+-static inline int cpu_suspend(unsigned long arg)
++static inline int arm_cpuidle_suspend(int index)
+ {
+       return -EOPNOTSUPP;
+ }
+ #endif
+-static inline int arm_cpuidle_suspend(int index)
+-{
+-      return cpu_suspend(index);
+-}
+ #endif
+diff --git a/arch/arm64/include/asm/suspend.h 
b/arch/arm64/include/asm/suspend.h
+index 003802f58963..59a5b0f1e81c 100644
+--- a/arch/arm64/include/asm/suspend.h
++++ b/arch/arm64/include/asm/suspend.h
+@@ -21,6 +21,6 @@ struct sleep_save_sp {
+       phys_addr_t save_ptr_stash_phys;
+ };
+ 
+-extern int __cpu_suspend(unsigned long arg, int (*fn)(unsigned long));
++extern int cpu_suspend(unsigned long arg, int (*fn)(unsigned long));
+ extern void cpu_resume(void);
+ #endif
+diff --git a/arch/arm64/kernel/armv8_deprecated.c 
b/arch/arm64/kernel/armv8_deprecated.c
+index 7922c2e710ca..7ac3920b1356 100644
+--- a/arch/arm64/kernel/armv8_deprecated.c
++++ b/arch/arm64/kernel/armv8_deprecated.c
+@@ -279,22 +279,24 @@ static void register_insn_emulation_sysctl(struct 
ctl_table *table)
+  */
+ #define __user_swpX_asm(data, addr, res, temp, B)             \
+       __asm__ __volatile__(                                   \
+-      "       mov             %w2, %w1\n"                     \
+-      "0:     ldxr"B"         %w1, [%3]\n"                    \
+-      "1:     stxr"B"         %w0, %w2, [%3]\n"               \
++      "0:     ldxr"B"         %w2, [%3]\n"                    \
++      "1:     stxr"B"         %w0, %w1, [%3]\n"               \
+       "       cbz             %w0, 2f\n"                      \
+       "       mov             %w0, %w4\n"                     \
++      "       b               3f\n"                           \
+       "2:\n"                                                  \
++      "       mov             %w1, %w2\n"                     \
++      "3:\n"                                                  \
+       "       .pushsection     .fixup,\"ax\"\n"               \
+       "       .align          2\n"                            \
+-      "3:     mov             %w0, %w5\n"                     \
+-      "       b               2b\n"                           \
++      "4:     mov             %w0, %w5\n"                     \
++      "       b               3b\n"                           \
+       "       .popsection"                                    \
+       "       .pushsection     __ex_table,\"a\"\n"            \
+       "       .align          3\n"                            \
+-      "       .quad           0b, 3b\n"                       \
+-      "       .quad           1b, 3b\n"                       \
+-      "       .popsection"                                    \
++      "       .quad           0b, 4b\n"                       \
++      "       .quad           1b, 4b\n"                       \
++      "       .popsection\n"                                  \
+       : "=&r" (res), "+r" (data), "=&r" (temp)                \
+       : "r" (addr), "i" (-EAGAIN), "i" (-EFAULT)              \
+       : "memory")
+diff --git a/arch/arm64/kernel/cpuidle.c b/arch/arm64/kernel/cpuidle.c
+index a78143a5c99f..2bbd0fee084f 100644
+--- a/arch/arm64/kernel/cpuidle.c
++++ b/arch/arm64/kernel/cpuidle.c
+@@ -37,7 +37,7 @@ int arm_cpuidle_init(unsigned int cpu)
+  * Return: 0 on success, -EOPNOTSUPP if CPU suspend hook not initialized, CPU
+  * operations back-end error code otherwise.
+  */
+-int cpu_suspend(unsigned long arg)
++int arm_cpuidle_suspend(int index)
+ {
+       int cpu = smp_processor_id();
+ 
+@@ -47,5 +47,5 @@ int cpu_suspend(unsigned long arg)
+        */
+       if (!cpu_ops[cpu] || !cpu_ops[cpu]->cpu_suspend)
+               return -EOPNOTSUPP;
+-      return cpu_ops[cpu]->cpu_suspend(arg);
++      return cpu_ops[cpu]->cpu_suspend(index);
+ }
+diff --git a/arch/arm64/kernel/psci.c b/arch/arm64/kernel/psci.c
+index ea18cb53921e..24d4733b7e3c 100644
+--- a/arch/arm64/kernel/psci.c
++++ b/arch/arm64/kernel/psci.c
+@@ -546,7 +546,7 @@ static int __maybe_unused cpu_psci_cpu_suspend(unsigned 
long index)
+       if (state[index - 1].type == PSCI_POWER_STATE_TYPE_STANDBY)
+               ret = psci_ops.cpu_suspend(state[index - 1], 0);
+       else
+-              ret = __cpu_suspend(index, psci_suspend_finisher);
++              ret = cpu_suspend(index, psci_suspend_finisher);
+ 
+       return ret;
+ }
+diff --git a/arch/arm64/kernel/stacktrace.c b/arch/arm64/kernel/stacktrace.c
+index 407991bf79f5..ccb6078ed9f2 100644
+--- a/arch/arm64/kernel/stacktrace.c
++++ b/arch/arm64/kernel/stacktrace.c
+@@ -48,11 +48,7 @@ int notrace unwind_frame(struct stackframe *frame)
+ 
+       frame->sp = fp + 0x10;
+       frame->fp = *(unsigned long *)(fp);
+-      /*
+-       * -4 here because we care about the PC at time of bl,
+-       * not where the return will go.
+-       */
+-      frame->pc = *(unsigned long *)(fp + 8) - 4;
++      frame->pc = *(unsigned long *)(fp + 8);
+ 
+       return 0;
+ }
+diff --git a/arch/arm64/kernel/suspend.c b/arch/arm64/kernel/suspend.c
+index d7daf45ae7a2..53f1f8dccf6c 100644
+--- a/arch/arm64/kernel/suspend.c
++++ b/arch/arm64/kernel/suspend.c
+@@ -51,13 +51,13 @@ void __init cpu_suspend_set_dbg_restorer(void 
(*hw_bp_restore)(void *))
+ }
+ 
+ /*
+- * __cpu_suspend
++ * cpu_suspend
+  *
+  * arg: argument to pass to the finisher function
+  * fn: finisher function pointer
+  *
+  */
+-int __cpu_suspend(unsigned long arg, int (*fn)(unsigned long))
++int cpu_suspend(unsigned long arg, int (*fn)(unsigned long))
+ {
+       struct mm_struct *mm = current->active_mm;
+       int ret;
+@@ -80,17 +80,21 @@ int __cpu_suspend(unsigned long arg, int (*fn)(unsigned 
long))
+       if (ret == 0) {
+               /*
+                * We are resuming from reset with TTBR0_EL1 set to the
+-               * idmap to enable the MMU; restore the active_mm mappings in
+-               * TTBR0_EL1 unless the active_mm == &init_mm, in which case
+-               * the thread entered __cpu_suspend with TTBR0_EL1 set to
+-               * reserved TTBR0 page tables and should be restored as such.
++               * idmap to enable the MMU; set the TTBR0 to the reserved
++               * page tables to prevent speculative TLB allocations, flush
++               * the local tlb and set the default tcr_el1.t0sz so that
++               * the TTBR0 address space set-up is properly restored.
++               * If the current active_mm != &init_mm we entered cpu_suspend
++               * with mappings in TTBR0 that must be restored, so we switch
++               * them back to complete the address space configuration
++               * restoration before returning.
+                */
+-              if (mm == &init_mm)
+-                      cpu_set_reserved_ttbr0();
+-              else
+-                      cpu_switch_mm(mm->pgd, mm);
+-
++              cpu_set_reserved_ttbr0();
+               flush_tlb_all();
++              cpu_set_default_tcr_t0sz();
++
++              if (mm != &init_mm)
++                      cpu_switch_mm(mm->pgd, mm);
+ 
+               /*
+                * Restore per-cpu offset before any kernel
+diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c
+index caffb10e7aa3..5607693f35cf 100644
+--- a/arch/powerpc/kernel/rtas.c
++++ b/arch/powerpc/kernel/rtas.c
+@@ -1041,6 +1041,9 @@ asmlinkage int ppc_rtas(struct rtas_args __user *uargs)
+       if (!capable(CAP_SYS_ADMIN))
+               return -EPERM;
+ 
++      if (!rtas.entry)
++              return -EINVAL;
++
+       if (copy_from_user(&args, uargs, 3 * sizeof(u32)) != 0)
+               return -EFAULT;
+ 
+diff --git a/arch/x86/boot/compressed/eboot.c 
b/arch/x86/boot/compressed/eboot.c
+index 0cdc154a22b5..4c3f76b425c1 100644
+--- a/arch/x86/boot/compressed/eboot.c
++++ b/arch/x86/boot/compressed/eboot.c
+@@ -667,6 +667,7 @@ setup_gop32(struct screen_info *si, efi_guid_t *proto,
+               bool conout_found = false;
+               void *dummy = NULL;
+               u32 h = handles[i];
++              u32 current_fb_base;
+ 
+               status = efi_call_early(handle_protocol, h,
+                                       proto, (void **)&gop32);
+@@ -678,7 +679,7 @@ setup_gop32(struct screen_info *si, efi_guid_t *proto,
+               if (status == EFI_SUCCESS)
+                       conout_found = true;
+ 
+-              status = __gop_query32(gop32, &info, &size, &fb_base);
++              status = __gop_query32(gop32, &info, &size, &current_fb_base);
+               if (status == EFI_SUCCESS && (!first_gop || conout_found)) {
+                       /*
+                        * Systems that use the UEFI Console Splitter may
+@@ -692,6 +693,7 @@ setup_gop32(struct screen_info *si, efi_guid_t *proto,
+                       pixel_format = info->pixel_format;
+                       pixel_info = info->pixel_information;
+                       pixels_per_scan_line = info->pixels_per_scan_line;
++                      fb_base = current_fb_base;
+ 
+                       /*
+                        * Once we've found a GOP supporting ConOut,
+@@ -770,6 +772,7 @@ setup_gop64(struct screen_info *si, efi_guid_t *proto,
+               bool conout_found = false;
+               void *dummy = NULL;
+               u64 h = handles[i];
++              u32 current_fb_base;
+ 
+               status = efi_call_early(handle_protocol, h,
+                                       proto, (void **)&gop64);
+@@ -781,7 +784,7 @@ setup_gop64(struct screen_info *si, efi_guid_t *proto,
+               if (status == EFI_SUCCESS)
+                       conout_found = true;
+ 
+-              status = __gop_query64(gop64, &info, &size, &fb_base);
++              status = __gop_query64(gop64, &info, &size, &current_fb_base);
+               if (status == EFI_SUCCESS && (!first_gop || conout_found)) {
+                       /*
+                        * Systems that use the UEFI Console Splitter may
+@@ -795,6 +798,7 @@ setup_gop64(struct screen_info *si, efi_guid_t *proto,
+                       pixel_format = info->pixel_format;
+                       pixel_info = info->pixel_information;
+                       pixels_per_scan_line = info->pixels_per_scan_line;
++                      fb_base = current_fb_base;
+ 
+                       /*
+                        * Once we've found a GOP supporting ConOut,
+diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
+index 0cc657160cb6..a10ed8915bf4 100644
+--- a/arch/x86/xen/enlighten.c
++++ b/arch/x86/xen/enlighten.c
+@@ -33,7 +33,7 @@
+ #include <linux/memblock.h>
+ #include <linux/edd.h>
+ 
+-#ifdef CONFIG_KEXEC_CORE
++#ifdef CONFIG_KEXEC
+ #include <linux/kexec.h>
+ #endif
+ 
+@@ -1802,7 +1802,7 @@ static struct notifier_block xen_hvm_cpu_notifier = {
+       .notifier_call  = xen_hvm_cpu_notify,
+ };
+ 
+-#ifdef CONFIG_KEXEC_CORE
++#ifdef CONFIG_KEXEC
+ static void xen_hvm_shutdown(void)
+ {
+       native_machine_shutdown();
+@@ -1836,7 +1836,7 @@ static void __init xen_hvm_guest_init(void)
+       x86_init.irqs.intr_init = xen_init_IRQ;
+       xen_hvm_init_time_ops();
+       xen_hvm_init_mmu_ops();
+-#ifdef CONFIG_KEXEC_CORE
++#ifdef CONFIG_KEXEC
+       machine_ops.shutdown = xen_hvm_shutdown;
+       machine_ops.crash_shutdown = xen_hvm_crash_shutdown;
+ #endif
+diff --git a/crypto/ablkcipher.c b/crypto/ablkcipher.c
+index db201bca1581..523dd10e1751 100644
+--- a/crypto/ablkcipher.c
++++ b/crypto/ablkcipher.c
+@@ -698,7 +698,7 @@ struct crypto_ablkcipher *crypto_alloc_ablkcipher(const 
char *alg_name,
+ err:
+               if (err != -EAGAIN)
+                       break;
+-              if (signal_pending(current)) {
++              if (fatal_signal_pending(current)) {
+                       err = -EINTR;
+                       break;
+               }
+diff --git a/crypto/algapi.c b/crypto/algapi.c
+index d2627a3d4ed8..dda720c6ab08 100644
+--- a/crypto/algapi.c
++++ b/crypto/algapi.c
+@@ -337,7 +337,7 @@ static void crypto_wait_for_test(struct crypto_larval 
*larval)
+               crypto_alg_tested(larval->alg.cra_driver_name, 0);
+       }
+ 
+-      err = wait_for_completion_interruptible(&larval->completion);
++      err = wait_for_completion_killable(&larval->completion);
+       WARN_ON(err);
+ 
+ out:
+diff --git a/crypto/api.c b/crypto/api.c
+index afe4610afc4b..bbc147cb5dec 100644
+--- a/crypto/api.c
++++ b/crypto/api.c
+@@ -172,7 +172,7 @@ static struct crypto_alg *crypto_larval_wait(struct 
crypto_alg *alg)
+       struct crypto_larval *larval = (void *)alg;
+       long timeout;
+ 
+-      timeout = wait_for_completion_interruptible_timeout(
++      timeout = wait_for_completion_killable_timeout(
+               &larval->completion, 60 * HZ);
+ 
+       alg = larval->adult;
+@@ -445,7 +445,7 @@ struct crypto_tfm *crypto_alloc_base(const char *alg_name, 
u32 type, u32 mask)
+ err:
+               if (err != -EAGAIN)
+                       break;
+-              if (signal_pending(current)) {
++              if (fatal_signal_pending(current)) {
+                       err = -EINTR;
+                       break;
+               }
+@@ -562,7 +562,7 @@ void *crypto_alloc_tfm(const char *alg_name,
+ err:
+               if (err != -EAGAIN)
+                       break;
+-              if (signal_pending(current)) {
++              if (fatal_signal_pending(current)) {
+                       err = -EINTR;
+                       break;
+               }
+diff --git a/crypto/crypto_user.c b/crypto/crypto_user.c
+index 41dfe762b7fb..edf2e3ea1740 100644
+--- a/crypto/crypto_user.c
++++ b/crypto/crypto_user.c
+@@ -381,7 +381,7 @@ static struct crypto_alg *crypto_user_aead_alg(const char 
*name, u32 type,
+               err = PTR_ERR(alg);
+               if (err != -EAGAIN)
+                       break;
+-              if (signal_pending(current)) {
++              if (fatal_signal_pending(current)) {
+                       err = -EINTR;
+                       break;
+               }
+diff --git a/drivers/block/nvme-core.c b/drivers/block/nvme-core.c
+index 683dff272562..04c0e8f3183c 100644
+--- a/drivers/block/nvme-core.c
++++ b/drivers/block/nvme-core.c
+@@ -590,6 +590,7 @@ static void req_completion(struct nvme_queue *nvmeq, void 
*ctx,
+       struct nvme_iod *iod = ctx;
+       struct request *req = iod_get_private(iod);
+       struct nvme_cmd_info *cmd_rq = blk_mq_rq_to_pdu(req);
++      bool requeue = false;
+ 
+       u16 status = le16_to_cpup(&cqe->status) >> 1;
+ 
+@@ -598,12 +599,13 @@ static void req_completion(struct nvme_queue *nvmeq, 
void *ctx,
+                   && (jiffies - req->start_time) < req->timeout) {
+                       unsigned long flags;
+ 
++                      requeue = true;
+                       blk_mq_requeue_request(req);
+                       spin_lock_irqsave(req->q->queue_lock, flags);
+                       if (!blk_queue_stopped(req->q))
+                               blk_mq_kick_requeue_list(req->q);
+                       spin_unlock_irqrestore(req->q->queue_lock, flags);
+-                      return;
++                      goto release_iod;
+               }
+               req->errors = nvme_error_status(status);
+       } else
+@@ -613,7 +615,7 @@ static void req_completion(struct nvme_queue *nvmeq, void 
*ctx,
+               dev_warn(&nvmeq->dev->pci_dev->dev,
+                       "completing aborted command with status:%04x\n",
+                       status);
+-
++ release_iod:
+       if (iod->nents) {
+               dma_unmap_sg(&nvmeq->dev->pci_dev->dev, iod->sg, iod->nents,
+                       rq_data_dir(req) ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
+@@ -626,7 +628,8 @@ static void req_completion(struct nvme_queue *nvmeq, void 
*ctx,
+       }
+       nvme_free_iod(nvmeq->dev, iod);
+ 
+-      blk_mq_complete_request(req);
++      if (likely(!requeue))
++              blk_mq_complete_request(req);
+ }
+ 
+ /* length is in bytes.  gfp flags indicates whether we may sleep. */
+diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
+index fe8f1e4b4c7c..1ec6441fe2a5 100644
+--- a/drivers/block/rbd.c
++++ b/drivers/block/rbd.c
+@@ -96,6 +96,8 @@ static int atomic_dec_return_safe(atomic_t *v)
+ #define RBD_MINORS_PER_MAJOR          256
+ #define RBD_SINGLE_MAJOR_PART_SHIFT   4
+ 
++#define RBD_MAX_PARENT_CHAIN_LEN      16
++
+ #define RBD_SNAP_DEV_NAME_PREFIX      "snap_"
+ #define RBD_MAX_SNAP_NAME_LEN \
+                       (NAME_MAX - (sizeof (RBD_SNAP_DEV_NAME_PREFIX) - 1))
+@@ -425,7 +427,7 @@ static ssize_t rbd_add_single_major(struct bus_type *bus, 
const char *buf,
+                                   size_t count);
+ static ssize_t rbd_remove_single_major(struct bus_type *bus, const char *buf,
+                                      size_t count);
+-static int rbd_dev_image_probe(struct rbd_device *rbd_dev, bool mapping);
++static int rbd_dev_image_probe(struct rbd_device *rbd_dev, int depth);
+ static void rbd_spec_put(struct rbd_spec *spec);
+ 
+ static int rbd_dev_id_to_minor(int dev_id)
+@@ -3797,6 +3799,9 @@ static int rbd_init_disk(struct rbd_device *rbd_dev)
+       q->limits.discard_zeroes_data = 1;
+ 
+       blk_queue_merge_bvec(q, rbd_merge_bvec);
++      if (!ceph_test_opt(rbd_dev->rbd_client->client, NOCRC))
++              q->backing_dev_info.capabilities |= BDI_CAP_STABLE_WRITES;
++
+       disk->queue = q;
+ 
+       q->queuedata = rbd_dev;
+@@ -5142,44 +5147,50 @@ out_err:
+       return ret;
+ }
+ 
+-static int rbd_dev_probe_parent(struct rbd_device *rbd_dev)
++/*
++ * @depth is rbd_dev_image_probe() -> rbd_dev_probe_parent() ->
++ * rbd_dev_image_probe() recursion depth, which means it's also the
++ * length of the already discovered part of the parent chain.
++ */
++static int rbd_dev_probe_parent(struct rbd_device *rbd_dev, int depth)
+ {
+       struct rbd_device *parent = NULL;
+-      struct rbd_spec *parent_spec;
+-      struct rbd_client *rbdc;
+       int ret;
+ 
+       if (!rbd_dev->parent_spec)
+               return 0;
+-      /*
+-       * We need to pass a reference to the client and the parent
+-       * spec when creating the parent rbd_dev.  Images related by
+-       * parent/child relationships always share both.
+-       */
+-      parent_spec = rbd_spec_get(rbd_dev->parent_spec);
+-      rbdc = __rbd_get_client(rbd_dev->rbd_client);
+ 
+-      ret = -ENOMEM;
+-      parent = rbd_dev_create(rbdc, parent_spec);
+-      if (!parent)
++      if (++depth > RBD_MAX_PARENT_CHAIN_LEN) {
++              pr_info("parent chain is too long (%d)\n", depth);
++              ret = -EINVAL;
+               goto out_err;
++      }
+ 
+-      ret = rbd_dev_image_probe(parent, false);
++      parent = rbd_dev_create(rbd_dev->rbd_client, rbd_dev->parent_spec);
++      if (!parent) {
++              ret = -ENOMEM;
++              goto out_err;
++      }
++
++      /*
++       * Images related by parent/child relationships always share
++       * rbd_client and spec/parent_spec, so bump their refcounts.
++       */
++      __rbd_get_client(rbd_dev->rbd_client);
++      rbd_spec_get(rbd_dev->parent_spec);
++
++      ret = rbd_dev_image_probe(parent, depth);
+       if (ret < 0)
+               goto out_err;
++
+       rbd_dev->parent = parent;
+       atomic_set(&rbd_dev->parent_ref, 1);
+-
+       return 0;
++
+ out_err:
+-      if (parent) {
+-              rbd_dev_unparent(rbd_dev);
++      rbd_dev_unparent(rbd_dev);
++      if (parent)
+               rbd_dev_destroy(parent);
+-      } else {
+-              rbd_put_client(rbdc);
+-              rbd_spec_put(parent_spec);
+-      }
+-
+       return ret;
+ }
+ 
+@@ -5297,7 +5308,7 @@ static void rbd_dev_image_release(struct rbd_device 
*rbd_dev)
+  * parent), initiate a watch on its header object before using that
+  * object to get detailed information about the rbd image.
+  */
+-static int rbd_dev_image_probe(struct rbd_device *rbd_dev, bool mapping)
++static int rbd_dev_image_probe(struct rbd_device *rbd_dev, int depth)
+ {
+       int ret;
+ 
+@@ -5315,7 +5326,7 @@ static int rbd_dev_image_probe(struct rbd_device 
*rbd_dev, bool mapping)
+       if (ret)
+               goto err_out_format;
+ 
+-      if (mapping) {
++      if (!depth) {
+               ret = rbd_dev_header_watch_sync(rbd_dev);
+               if (ret) {
+                       if (ret == -ENOENT)
+@@ -5336,7 +5347,7 @@ static int rbd_dev_image_probe(struct rbd_device 
*rbd_dev, bool mapping)
+        * Otherwise this is a parent image, identified by pool, image
+        * and snap ids - need to fill in names for those ids.
+        */
+-      if (mapping)
++      if (!depth)
+               ret = rbd_spec_fill_snap_id(rbd_dev);
+       else
+               ret = rbd_spec_fill_names(rbd_dev);
+@@ -5358,12 +5369,12 @@ static int rbd_dev_image_probe(struct rbd_device 
*rbd_dev, bool mapping)
+                * Need to warn users if this image is the one being
+                * mapped and has a parent.
+                */
+-              if (mapping && rbd_dev->parent_spec)
++              if (!depth && rbd_dev->parent_spec)
+                       rbd_warn(rbd_dev,
+                                "WARNING: kernel layering is EXPERIMENTAL!");
+       }
+ 
+-      ret = rbd_dev_probe_parent(rbd_dev);
++      ret = rbd_dev_probe_parent(rbd_dev, depth);
+       if (ret)
+               goto err_out_probe;
+ 
+@@ -5374,7 +5385,7 @@ static int rbd_dev_image_probe(struct rbd_device 
*rbd_dev, bool mapping)
+ err_out_probe:
+       rbd_dev_unprobe(rbd_dev);
+ err_out_watch:
+-      if (mapping)
++      if (!depth)
+               rbd_dev_header_unwatch_sync(rbd_dev);
+ out_header_name:
+       kfree(rbd_dev->header_name);
+@@ -5439,7 +5450,7 @@ static ssize_t do_rbd_add(struct bus_type *bus,
+       rbdc = NULL;            /* rbd_dev now owns this */
+       spec = NULL;            /* rbd_dev now owns this */
+ 
+-      rc = rbd_dev_image_probe(rbd_dev, true);
++      rc = rbd_dev_image_probe(rbd_dev, 0);
+       if (rc < 0)
+               goto err_out_rbd_dev;
+ 
+diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
+index 89c7371ab2dc..42ef86c409b6 100644
+--- a/drivers/block/xen-blkfront.c
++++ b/drivers/block/xen-blkfront.c
+@@ -1925,7 +1925,8 @@ static void blkback_changed(struct xenbus_device *dev,
+                       break;
+               /* Missed the backend's Closing state -- fallthrough */
+       case XenbusStateClosing:
+-              blkfront_closing(info);
++              if (info)
++                      blkfront_closing(info);
+               break;
+       }
+ }
+diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c
+index e8d16997c5cb..1ee2ab58e37d 100644
+--- a/drivers/cpufreq/intel_pstate.c
++++ b/drivers/cpufreq/intel_pstate.c
+@@ -761,6 +761,11 @@ static inline void intel_pstate_sample(struct cpudata 
*cpu)
+       local_irq_save(flags);
+       rdmsrl(MSR_IA32_APERF, aperf);
+       rdmsrl(MSR_IA32_MPERF, mperf);
++      if (cpu->prev_mperf == mperf) {
++              local_irq_restore(flags);
++              return;
++      }
++
+       local_irq_restore(flags);
+ 
+       cpu->last_sample_time = cpu->sample.time;
+diff --git a/drivers/edac/sb_edac.c b/drivers/edac/sb_edac.c
+index 1acf57ba4c86..cd6b9c72c8ac 100644
+--- a/drivers/edac/sb_edac.c
++++ b/drivers/edac/sb_edac.c
+@@ -1608,6 +1608,7 @@ static int sbridge_mci_bind_devs(struct mem_ctl_info 
*mci,
+ {
+       struct sbridge_pvt *pvt = mci->pvt_info;
+       struct pci_dev *pdev;
++      u8 saw_chan_mask = 0;
+       int i;
+ 
+       for (i = 0; i < sbridge_dev->n_devs; i++) {
+@@ -1641,6 +1642,7 @@ static int sbridge_mci_bind_devs(struct mem_ctl_info 
*mci,
+               {
+                       int id = pdev->device - 
PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_TAD0;
+                       pvt->pci_tad[id] = pdev;
++                      saw_chan_mask |= 1 << id;
+               }
+                       break;
+               case PCI_DEVICE_ID_INTEL_SBRIDGE_IMC_DDRIO:
+@@ -1661,10 +1663,8 @@ static int sbridge_mci_bind_devs(struct mem_ctl_info 
*mci,
+           !pvt-> pci_tad || !pvt->pci_ras  || !pvt->pci_ta)
+               goto enodev;
+ 
+-      for (i = 0; i < NUM_CHANNELS; i++) {
+-              if (!pvt->pci_tad[i])
+-                      goto enodev;
+-      }
++      if (saw_chan_mask != 0x0f)
++              goto enodev;
+       return 0;
+ 
+ enodev:
+diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c 
b/drivers/gpu/drm/drm_dp_mst_topology.c
+index 2a2eb96caeda..109e776345d3 100644
+--- a/drivers/gpu/drm/drm_dp_mst_topology.c
++++ b/drivers/gpu/drm/drm_dp_mst_topology.c
+@@ -1179,17 +1179,18 @@ static struct drm_dp_mst_branch 
*drm_dp_get_mst_branch_device(struct drm_dp_mst_
+ 
+               list_for_each_entry(port, &mstb->ports, next) {
+                       if (port->port_num == port_num) {
+-                              if (!port->mstb) {
++                              mstb = port->mstb;
++                              if (!mstb) {
+                                       DRM_ERROR("failed to lookup MSTB with 
lct %d, rad %02x\n", lct, rad[0]);
+-                                      return NULL;
++                                      goto out;
+                               }
+ 
+-                              mstb = port->mstb;
+                               break;
+                       }
+               }
+       }
+       kref_get(&mstb->kref);
++out:
+       mutex_unlock(&mgr->lock);
+       return mstb;
+ }
+diff --git a/drivers/gpu/drm/i915/i915_gem_userptr.c 
b/drivers/gpu/drm/i915/i915_gem_userptr.c
+index 1719078c763a..ce175d05260b 100644
+--- a/drivers/gpu/drm/i915/i915_gem_userptr.c
++++ b/drivers/gpu/drm/i915/i915_gem_userptr.c
+@@ -776,7 +776,10 @@ static const struct drm_i915_gem_object_ops 
i915_gem_userptr_ops = {
+  * Also note, that the object created here is not currently a "first class"
+  * object, in that several ioctls are banned. These are the CPU access
+  * ioctls: mmap(), pwrite and pread. In practice, you are expected to use
+- * direct access via your pointer rather than use those ioctls.
++ * direct access via your pointer rather than use those ioctls. Another
++ * restriction is that we do not allow userptr surfaces to be pinned to the
++ * hardware and so we reject any attempt to create a framebuffer out of a
++ * userptr.
+  *
+  * If you think this is a good interface to use to pass GPU memory between
+  * drivers, please use dma-buf instead. In fact, wherever possible use
+diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
+index f208bbc6d58e..7b27a114b030 100644
+--- a/drivers/gpu/drm/i915/intel_display.c
++++ b/drivers/gpu/drm/i915/intel_display.c
+@@ -1699,6 +1699,8 @@ static void i9xx_enable_pll(struct intel_crtc *crtc)
+                          I915_READ(DPLL(!crtc->pipe)) | DPLL_DVO_2X_MODE);
+       }
+ 
++      I915_WRITE(reg, dpll);
++
+       /* Wait for the clocks to stabilize. */
+       POSTING_READ(reg);
+       udelay(150);
+@@ -13212,6 +13214,11 @@ static int 
intel_user_framebuffer_create_handle(struct drm_framebuffer *fb,
+       struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
+       struct drm_i915_gem_object *obj = intel_fb->obj;
+ 
++      if (obj->userptr.mm) {
++              DRM_DEBUG("attempting to use a userptr for a framebuffer, 
denied\n");
++              return -EINVAL;
++      }
++
+       return drm_gem_handle_create(file, &obj->base, handle);
+ }
+ 
+diff --git a/drivers/gpu/drm/i915/intel_lrc.c 
b/drivers/gpu/drm/i915/intel_lrc.c
+index 9ab7c1c758ae..72f1bb8b0499 100644
+--- a/drivers/gpu/drm/i915/intel_lrc.c
++++ b/drivers/gpu/drm/i915/intel_lrc.c
+@@ -1298,6 +1298,7 @@ static int gen8_emit_flush_render(struct 
intel_ringbuffer *ringbuf,
+       if (flush_domains) {
+               flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH;
+               flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH;
++              flags |= PIPE_CONTROL_FLUSH_ENABLE;
+       }
+ 
+       if (invalidate_domains) {
+diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c 
b/drivers/gpu/drm/i915/intel_ringbuffer.c
+index 005b5e04de4d..b7e20dee64c4 100644
+--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
++++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
+@@ -342,6 +342,7 @@ gen7_render_ring_flush(struct intel_engine_cs *ring,
+       if (flush_domains) {
+               flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH;
+               flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH;
++              flags |= PIPE_CONTROL_FLUSH_ENABLE;
+       }
+       if (invalidate_domains) {
+               flags |= PIPE_CONTROL_TLB_INVALIDATE;
+@@ -412,6 +413,7 @@ gen8_render_ring_flush(struct intel_engine_cs *ring,
+       if (flush_domains) {
+               flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH;
+               flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH;
++              flags |= PIPE_CONTROL_FLUSH_ENABLE;
+       }
+       if (invalidate_domains) {
+               flags |= PIPE_CONTROL_TLB_INVALIDATE;
+diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c 
b/drivers/gpu/drm/nouveau/nouveau_gem.c
+index 0e690bf19fc9..58c959265b1a 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_gem.c
++++ b/drivers/gpu/drm/nouveau/nouveau_gem.c
+@@ -227,11 +227,12 @@ nouveau_gem_info(struct drm_file *file_priv, struct 
drm_gem_object *gem,
+       struct nouveau_bo *nvbo = nouveau_gem_object(gem);
+       struct nvkm_vma *vma;
+ 
+-      if (nvbo->bo.mem.mem_type == TTM_PL_TT)
++      if (is_power_of_2(nvbo->valid_domains))
++              rep->domain = nvbo->valid_domains;
++      else if (nvbo->bo.mem.mem_type == TTM_PL_TT)
+               rep->domain = NOUVEAU_GEM_DOMAIN_GART;
+       else
+               rep->domain = NOUVEAU_GEM_DOMAIN_VRAM;
+-
+       rep->offset = nvbo->bo.offset;
+       if (cli->vm) {
+               vma = nouveau_bo_vma_find(nvbo, cli->vm);
+diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c 
b/drivers/gpu/drm/radeon/atombios_encoders.c
+index b4ff4c134fbb..5be50ef2b30e 100644
+--- a/drivers/gpu/drm/radeon/atombios_encoders.c
++++ b/drivers/gpu/drm/radeon/atombios_encoders.c
+@@ -237,6 +237,7 @@ void radeon_atom_backlight_init(struct radeon_encoder 
*radeon_encoder,
+       backlight_update_status(bd);
+ 
+       DRM_INFO("radeon atom DIG backlight initialized\n");
++      rdev->mode_info.bl_encoder = radeon_encoder;
+ 
+       return;
+ 
+@@ -1624,9 +1625,14 @@ radeon_atom_encoder_dpms_avivo(struct drm_encoder 
*encoder, int mode)
+               } else
+                       atom_execute_table(rdev->mode_info.atom_context, index, 
(uint32_t *)&args);
+               if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
+-                      struct radeon_encoder_atom_dig *dig = 
radeon_encoder->enc_priv;
++                      if (rdev->mode_info.bl_encoder) {
++                              struct radeon_encoder_atom_dig *dig = 
radeon_encoder->enc_priv;
+ 
+-                      atombios_set_backlight_level(radeon_encoder, 
dig->backlight_level);
++                              atombios_set_backlight_level(radeon_encoder, 
dig->backlight_level);
++                      } else {
++                              args.ucAction = ATOM_LCD_BLON;
++                              
atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
++                      }
+               }
+               break;
+       case DRM_MODE_DPMS_STANDBY:
+@@ -1706,8 +1712,13 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder 
*encoder, int mode)
+                       if (ASIC_IS_DCE4(rdev))
+                               atombios_dig_encoder_setup(encoder, 
ATOM_ENCODER_CMD_DP_VIDEO_ON, 0);
+               }
+-              if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT))
+-                      atombios_set_backlight_level(radeon_encoder, 
dig->backlight_level);
++              if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
++                      if (rdev->mode_info.bl_encoder)
++                              atombios_set_backlight_level(radeon_encoder, 
dig->backlight_level);
++                      else
++                              atombios_dig_transmitter_setup(encoder,
++                                                             
ATOM_TRANSMITTER_ACTION_LCD_BLON, 0, 0);
++              }
+               if (ext_encoder)
+                       atombios_external_encoder_setup(encoder, ext_encoder, 
ATOM_ENABLE);
+               break;
+diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
+index 46eb0fa75a61..91c3f60f8bac 100644
+--- a/drivers/gpu/drm/radeon/radeon.h
++++ b/drivers/gpu/drm/radeon/radeon.h
+@@ -1656,6 +1656,7 @@ struct radeon_pm {
+       u8                      fan_max_rpm;
+       /* dpm */
+       bool                    dpm_enabled;
++      bool                    sysfs_initialized;
+       struct radeon_dpm       dpm;
+ };
+ 
+diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c 
b/drivers/gpu/drm/radeon/radeon_encoders.c
+index ef99917f000d..c6ee80216cf4 100644
+--- a/drivers/gpu/drm/radeon/radeon_encoders.c
++++ b/drivers/gpu/drm/radeon/radeon_encoders.c
+@@ -194,7 +194,6 @@ static void radeon_encoder_add_backlight(struct 
radeon_encoder *radeon_encoder,
+                       radeon_atom_backlight_init(radeon_encoder, connector);
+               else
+                       radeon_legacy_backlight_init(radeon_encoder, connector);
+-              rdev->mode_info.bl_encoder = radeon_encoder;
+       }
+ }
+ 
+diff --git a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c 
b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c
+index 45715307db71..30de43366eae 100644
+--- a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c
++++ b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c
+@@ -441,6 +441,7 @@ void radeon_legacy_backlight_init(struct radeon_encoder 
*radeon_encoder,
+       backlight_update_status(bd);
+ 
+       DRM_INFO("radeon legacy LVDS backlight initialized\n");
++      rdev->mode_info.bl_encoder = radeon_encoder;
+ 
+       return;
+ 
+diff --git a/drivers/gpu/drm/radeon/radeon_pm.c 
b/drivers/gpu/drm/radeon/radeon_pm.c
+index 948c33105801..91764320c56f 100644
+--- a/drivers/gpu/drm/radeon/radeon_pm.c
++++ b/drivers/gpu/drm/radeon/radeon_pm.c
+@@ -720,10 +720,14 @@ static umode_t hwmon_attributes_visible(struct kobject 
*kobj,
+       struct radeon_device *rdev = dev_get_drvdata(dev);
+       umode_t effective_mode = attr->mode;
+ 
+-      /* Skip limit attributes if DPM is not enabled */
++      /* Skip attributes if DPM is not enabled */
+       if (rdev->pm.pm_method != PM_METHOD_DPM &&
+           (attr == &sensor_dev_attr_temp1_crit.dev_attr.attr ||
+-           attr == &sensor_dev_attr_temp1_crit_hyst.dev_attr.attr))
++           attr == &sensor_dev_attr_temp1_crit_hyst.dev_attr.attr ||
++           attr == &sensor_dev_attr_pwm1.dev_attr.attr ||
++           attr == &sensor_dev_attr_pwm1_enable.dev_attr.attr ||
++           attr == &sensor_dev_attr_pwm1_max.dev_attr.attr ||
++           attr == &sensor_dev_attr_pwm1_min.dev_attr.attr))
+               return 0;
+ 
+       /* Skip fan attributes if fan is not present */
+@@ -1529,19 +1533,23 @@ int radeon_pm_late_init(struct radeon_device *rdev)
+ 
+       if (rdev->pm.pm_method == PM_METHOD_DPM) {
+               if (rdev->pm.dpm_enabled) {
+-                      ret = device_create_file(rdev->dev, 
&dev_attr_power_dpm_state);
+-                      if (ret)
+-                              DRM_ERROR("failed to create device file for dpm 
state\n");
+-                      ret = device_create_file(rdev->dev, 
&dev_attr_power_dpm_force_performance_level);
+-                      if (ret)
+-                              DRM_ERROR("failed to create device file for dpm 
state\n");
+-                      /* XXX: these are noops for dpm but are here for 
backwards compat */
+-                      ret = device_create_file(rdev->dev, 
&dev_attr_power_profile);
+-                      if (ret)
+-                              DRM_ERROR("failed to create device file for 
power profile\n");
+-                      ret = device_create_file(rdev->dev, 
&dev_attr_power_method);
+-                      if (ret)
+-                              DRM_ERROR("failed to create device file for 
power method\n");
++                      if (!rdev->pm.sysfs_initialized) {
++                              ret = device_create_file(rdev->dev, 
&dev_attr_power_dpm_state);
++                              if (ret)
++                                      DRM_ERROR("failed to create device file 
for dpm state\n");
++                              ret = device_create_file(rdev->dev, 
&dev_attr_power_dpm_force_performance_level);
++                              if (ret)
++                                      DRM_ERROR("failed to create device file 
for dpm state\n");
++                              /* XXX: these are noops for dpm but are here 
for backwards compat */
++                              ret = device_create_file(rdev->dev, 
&dev_attr_power_profile);
++                              if (ret)
++                                      DRM_ERROR("failed to create device file 
for power profile\n");
++                              ret = device_create_file(rdev->dev, 
&dev_attr_power_method);
++                              if (ret)
++                                      DRM_ERROR("failed to create device file 
for power method\n");
++                              if (!ret)
++                                      rdev->pm.sysfs_initialized = true;
++                      }
+ 
+                       mutex_lock(&rdev->pm.mutex);
+                       ret = radeon_dpm_late_enable(rdev);
+@@ -1557,7 +1565,8 @@ int radeon_pm_late_init(struct radeon_device *rdev)
+                       }
+               }
+       } else {
+-              if (rdev->pm.num_power_states > 1) {
++              if ((rdev->pm.num_power_states > 1) &&
++                  (!rdev->pm.sysfs_initialized)) {
+                       /* where's the best place to put these? */
+                       ret = device_create_file(rdev->dev, 
&dev_attr_power_profile);
+                       if (ret)
+@@ -1565,6 +1574,8 @@ int radeon_pm_late_init(struct radeon_device *rdev)
+                       ret = device_create_file(rdev->dev, 
&dev_attr_power_method);
+                       if (ret)
+                               DRM_ERROR("failed to create device file for 
power method\n");
++                      if (!ret)
++                              rdev->pm.sysfs_initialized = true;
+               }
+       }
+       return ret;
+diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+index 620bb5cf617c..15a8d7746fd2 100644
+--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+@@ -1458,6 +1458,9 @@ static void __exit vmwgfx_exit(void)
+       drm_pci_exit(&driver, &vmw_pci_driver);
+ }
+ 
++MODULE_INFO(vmw_patch, "ed7d78b2");
++MODULE_INFO(vmw_patch, "54c12bc3");
++
+ module_init(vmwgfx_init);
+ module_exit(vmwgfx_exit);
+ 
+diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h 
b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
+index d26a6daa9719..d8896ed41b9e 100644
+--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
+@@ -636,7 +636,8 @@ extern int vmw_user_dmabuf_alloc(struct vmw_private 
*dev_priv,
+                                uint32_t size,
+                                bool shareable,
+                                uint32_t *handle,
+-                               struct vmw_dma_buffer **p_dma_buf);
++                               struct vmw_dma_buffer **p_dma_buf,
++                               struct ttm_base_object **p_base);
+ extern int vmw_user_dmabuf_reference(struct ttm_object_file *tfile,
+                                    struct vmw_dma_buffer *dma_buf,
+                                    uint32_t *handle);
+@@ -650,7 +651,8 @@ extern uint32_t vmw_dmabuf_validate_node(struct 
ttm_buffer_object *bo,
+                                        uint32_t cur_validate_node);
+ extern void vmw_dmabuf_validate_clear(struct ttm_buffer_object *bo);
+ extern int vmw_user_dmabuf_lookup(struct ttm_object_file *tfile,
+-                                uint32_t id, struct vmw_dma_buffer **out);
++                                uint32_t id, struct vmw_dma_buffer **out,
++                                struct ttm_base_object **base);
+ extern int vmw_stream_claim_ioctl(struct drm_device *dev, void *data,
+                                 struct drm_file *file_priv);
+ extern int vmw_stream_unref_ioctl(struct drm_device *dev, void *data,
+diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
+index 97ad3bcb99a7..aee1c6ccc52d 100644
+--- a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
+@@ -887,7 +887,8 @@ static int vmw_translate_mob_ptr(struct vmw_private 
*dev_priv,
+       struct vmw_relocation *reloc;
+       int ret;
+ 
+-      ret = vmw_user_dmabuf_lookup(sw_context->fp->tfile, handle, &vmw_bo);
++      ret = vmw_user_dmabuf_lookup(sw_context->fp->tfile, handle, &vmw_bo,
++                                   NULL);
+       if (unlikely(ret != 0)) {
+               DRM_ERROR("Could not find or use MOB buffer.\n");
+               ret = -EINVAL;
+@@ -949,7 +950,8 @@ static int vmw_translate_guest_ptr(struct vmw_private 
*dev_priv,
+       struct vmw_relocation *reloc;
+       int ret;
+ 
+-      ret = vmw_user_dmabuf_lookup(sw_context->fp->tfile, handle, &vmw_bo);
++      ret = vmw_user_dmabuf_lookup(sw_context->fp->tfile, handle, &vmw_bo,
++                                   NULL);
+       if (unlikely(ret != 0)) {
+               DRM_ERROR("Could not find or use GMR region.\n");
+               ret = -EINVAL;
+diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c
+index 87e39f68e9d0..e1898982b44a 100644
+--- a/drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c
++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c
+@@ -484,7 +484,7 @@ int vmw_overlay_ioctl(struct drm_device *dev, void *data,
+               goto out_unlock;
+       }
+ 
+-      ret = vmw_user_dmabuf_lookup(tfile, arg->handle, &buf);
++      ret = vmw_user_dmabuf_lookup(tfile, arg->handle, &buf, NULL);
+       if (ret)
+               goto out_unlock;
+ 
+diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
+index 210ef15b1d09..c5b4c47e86d6 100644
+--- a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
+@@ -356,7 +356,7 @@ int vmw_user_lookup_handle(struct vmw_private *dev_priv,
+       }
+ 
+       *out_surf = NULL;
+-      ret = vmw_user_dmabuf_lookup(tfile, handle, out_buf);
++      ret = vmw_user_dmabuf_lookup(tfile, handle, out_buf, NULL);
+       return ret;
+ }
+ 
+@@ -483,7 +483,8 @@ int vmw_user_dmabuf_alloc(struct vmw_private *dev_priv,
+                         uint32_t size,
+                         bool shareable,
+                         uint32_t *handle,
+-                        struct vmw_dma_buffer **p_dma_buf)
++                        struct vmw_dma_buffer **p_dma_buf,
++                        struct ttm_base_object **p_base)
+ {
+       struct vmw_user_dma_buffer *user_bo;
+       struct ttm_buffer_object *tmp;
+@@ -517,6 +518,10 @@ int vmw_user_dmabuf_alloc(struct vmw_private *dev_priv,
+       }
+ 
+       *p_dma_buf = &user_bo->dma;
++      if (p_base) {
++              *p_base = &user_bo->prime.base;
++              kref_get(&(*p_base)->refcount);
++      }
+       *handle = user_bo->prime.base.hash.key;
+ 
+ out_no_base_object:
+@@ -633,6 +638,7 @@ int vmw_user_dmabuf_synccpu_ioctl(struct drm_device *dev, 
void *data,
+       struct vmw_dma_buffer *dma_buf;
+       struct vmw_user_dma_buffer *user_bo;
+       struct ttm_object_file *tfile = vmw_fpriv(file_priv)->tfile;
++      struct ttm_base_object *buffer_base;
+       int ret;
+ 
+       if ((arg->flags & (drm_vmw_synccpu_read | drm_vmw_synccpu_write)) == 0
+@@ -645,7 +651,8 @@ int vmw_user_dmabuf_synccpu_ioctl(struct drm_device *dev, 
void *data,
+ 
+       switch (arg->op) {
+       case drm_vmw_synccpu_grab:
+-              ret = vmw_user_dmabuf_lookup(tfile, arg->handle, &dma_buf);
++              ret = vmw_user_dmabuf_lookup(tfile, arg->handle, &dma_buf,
++                                           &buffer_base);
+               if (unlikely(ret != 0))
+                       return ret;
+ 
+@@ -653,6 +660,7 @@ int vmw_user_dmabuf_synccpu_ioctl(struct drm_device *dev, 
void *data,
+                                      dma);
+               ret = vmw_user_dmabuf_synccpu_grab(user_bo, tfile, arg->flags);
+               vmw_dmabuf_unreference(&dma_buf);
++              ttm_base_object_unref(&buffer_base);
+               if (unlikely(ret != 0 && ret != -ERESTARTSYS &&
+                            ret != -EBUSY)) {
+                       DRM_ERROR("Failed synccpu grab on handle 0x%08x.\n",
+@@ -694,7 +702,8 @@ int vmw_dmabuf_alloc_ioctl(struct drm_device *dev, void 
*data,
+               return ret;
+ 
+       ret = vmw_user_dmabuf_alloc(dev_priv, vmw_fpriv(file_priv)->tfile,
+-                                  req->size, false, &handle, &dma_buf);
++                                  req->size, false, &handle, &dma_buf,
++                                  NULL);
+       if (unlikely(ret != 0))
+               goto out_no_dmabuf;
+ 
+@@ -723,7 +732,8 @@ int vmw_dmabuf_unref_ioctl(struct drm_device *dev, void 
*data,
+ }
+ 
+ int vmw_user_dmabuf_lookup(struct ttm_object_file *tfile,
+-                         uint32_t handle, struct vmw_dma_buffer **out)
++                         uint32_t handle, struct vmw_dma_buffer **out,
++                         struct ttm_base_object **p_base)
+ {
+       struct vmw_user_dma_buffer *vmw_user_bo;
+       struct ttm_base_object *base;
+@@ -745,7 +755,10 @@ int vmw_user_dmabuf_lookup(struct ttm_object_file *tfile,
+       vmw_user_bo = container_of(base, struct vmw_user_dma_buffer,
+                                  prime.base);
+       (void)ttm_bo_reference(&vmw_user_bo->dma.base);
+-      ttm_base_object_unref(&base);
++      if (p_base)
++              *p_base = base;
++      else
++              ttm_base_object_unref(&base);
+       *out = &vmw_user_bo->dma;
+ 
+       return 0;
+@@ -1006,7 +1019,7 @@ int vmw_dumb_create(struct drm_file *file_priv,
+ 
+       ret = vmw_user_dmabuf_alloc(dev_priv, vmw_fpriv(file_priv)->tfile,
+                                   args->size, false, &args->handle,
+-                                  &dma_buf);
++                                  &dma_buf, NULL);
+       if (unlikely(ret != 0))
+               goto out_no_dmabuf;
+ 
+@@ -1034,7 +1047,7 @@ int vmw_dumb_map_offset(struct drm_file *file_priv,
+       struct vmw_dma_buffer *out_buf;
+       int ret;
+ 
+-      ret = vmw_user_dmabuf_lookup(tfile, handle, &out_buf);
++      ret = vmw_user_dmabuf_lookup(tfile, handle, &out_buf, NULL);
+       if (ret != 0)
+               return -EINVAL;
+ 
+diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c
+index 6a4584a43aa6..d2751ada19b1 100644
+--- a/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c
++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c
+@@ -470,7 +470,7 @@ int vmw_shader_define_ioctl(struct drm_device *dev, void 
*data,
+ 
+       if (arg->buffer_handle != SVGA3D_INVALID_ID) {
+               ret = vmw_user_dmabuf_lookup(tfile, arg->buffer_handle,
+-                                           &buffer);
++                                           &buffer, NULL);
+               if (unlikely(ret != 0)) {
+                       DRM_ERROR("Could not find buffer for shader "
+                                 "creation.\n");
+diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c
+index 4ecdbf3e59da..17a4107639b2 100644
+--- a/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c
++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_surface.c
+@@ -43,6 +43,7 @@ struct vmw_user_surface {
+       struct vmw_surface srf;
+       uint32_t size;
+       struct drm_master *master;
++      struct ttm_base_object *backup_base;
+ };
+ 
+ /**
+@@ -652,6 +653,8 @@ static void vmw_user_surface_base_release(struct 
ttm_base_object **p_base)
+       struct vmw_resource *res = &user_srf->srf.res;
+ 
+       *p_base = NULL;
++      if (user_srf->backup_base)
++              ttm_base_object_unref(&user_srf->backup_base);
+       vmw_resource_unreference(&res);
+ }
+ 
+@@ -846,7 +849,8 @@ int vmw_surface_define_ioctl(struct drm_device *dev, void 
*data,
+                                           res->backup_size,
+                                           true,
+                                           &backup_handle,
+-                                          &res->backup);
++                                          &res->backup,
++                                          &user_srf->backup_base);
+               if (unlikely(ret != 0)) {
+                       vmw_resource_unreference(&res);
+                       goto out_unlock;
+@@ -1309,7 +1313,8 @@ int vmw_gb_surface_define_ioctl(struct drm_device *dev, 
void *data,
+ 
+       if (req->buffer_handle != SVGA3D_INVALID_ID) {
+               ret = vmw_user_dmabuf_lookup(tfile, req->buffer_handle,
+-                                           &res->backup);
++                                           &res->backup,
++                                           &user_srf->backup_base);
+       } else if (req->drm_surface_flags &
+                  drm_vmw_surface_flag_create_buffer)
+               ret = vmw_user_dmabuf_alloc(dev_priv, tfile,
+@@ -1317,7 +1322,8 @@ int vmw_gb_surface_define_ioctl(struct drm_device *dev, 
void *data,
+                                           req->drm_surface_flags &
+                                           drm_vmw_surface_flag_shareable,
+                                           &backup_handle,
+-                                          &res->backup);
++                                          &res->backup,
++                                          &user_srf->backup_base);
+ 
+       if (unlikely(ret != 0)) {
+               vmw_resource_unreference(&res);
+diff --git a/drivers/i2c/busses/i2c-mv64xxx.c 
b/drivers/i2c/busses/i2c-mv64xxx.c
+index 30059c1df2a3..5801227b97ab 100644
+--- a/drivers/i2c/busses/i2c-mv64xxx.c
++++ b/drivers/i2c/busses/i2c-mv64xxx.c
+@@ -669,8 +669,6 @@ mv64xxx_i2c_can_offload(struct mv64xxx_i2c_data *drv_data)
+       struct i2c_msg *msgs = drv_data->msgs;
+       int num = drv_data->num_msgs;
+ 
+-      return false;
+-
+       if (!drv_data->offload_enabled)
+               return false;
+ 
+diff --git a/drivers/iio/accel/st_accel_core.c 
b/drivers/iio/accel/st_accel_core.c
+index 211b13271c61..2ae7150442fc 100644
+--- a/drivers/iio/accel/st_accel_core.c
++++ b/drivers/iio/accel/st_accel_core.c
+@@ -149,8 +149,6 @@
+ #define ST_ACCEL_4_BDU_MASK                   0x40
+ #define ST_ACCEL_4_DRDY_IRQ_ADDR              0x21
+ #define ST_ACCEL_4_DRDY_IRQ_INT1_MASK         0x04
+-#define ST_ACCEL_4_IG1_EN_ADDR                        0x21
+-#define ST_ACCEL_4_IG1_EN_MASK                        0x08
+ #define ST_ACCEL_4_MULTIREAD_BIT              true
+ 
+ static const struct iio_chan_spec st_accel_12bit_channels[] = {
+@@ -446,10 +444,6 @@ static const struct st_sensor_settings 
st_accel_sensors_settings[] = {
+               .drdy_irq = {
+                       .addr = ST_ACCEL_4_DRDY_IRQ_ADDR,
+                       .mask_int1 = ST_ACCEL_4_DRDY_IRQ_INT1_MASK,
+-                      .ig1 = {
+-                              .en_addr = ST_ACCEL_4_IG1_EN_ADDR,
+-                              .en_mask = ST_ACCEL_4_IG1_EN_MASK,
+-                      },
+               },
+               .multi_read_bit = ST_ACCEL_4_MULTIREAD_BIT,
+               .bootime = 2, /* guess */
+diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c
+index 0271608a51c4..0962b6821ce1 100644
+--- a/drivers/infiniband/core/cm.c
++++ b/drivers/infiniband/core/cm.c
+@@ -859,6 +859,11 @@ retest:
+       case IB_CM_SIDR_REQ_RCVD:
+               spin_unlock_irq(&cm_id_priv->lock);
+               cm_reject_sidr_req(cm_id_priv, IB_SIDR_REJECT);
++              spin_lock_irq(&cm.lock);
++              if (!RB_EMPTY_NODE(&cm_id_priv->sidr_id_node))
++                      rb_erase(&cm_id_priv->sidr_id_node,
++                               &cm.remote_sidr_table);
++              spin_unlock_irq(&cm.lock);
+               break;
+       case IB_CM_REQ_SENT:
+       case IB_CM_MRA_REQ_RCVD:
+@@ -3098,7 +3103,10 @@ int ib_send_cm_sidr_rep(struct ib_cm_id *cm_id,
+       spin_unlock_irqrestore(&cm_id_priv->lock, flags);
+ 
+       spin_lock_irqsave(&cm.lock, flags);
+-      rb_erase(&cm_id_priv->sidr_id_node, &cm.remote_sidr_table);
++      if (!RB_EMPTY_NODE(&cm_id_priv->sidr_id_node)) {
++              rb_erase(&cm_id_priv->sidr_id_node, &cm.remote_sidr_table);
++              RB_CLEAR_NODE(&cm_id_priv->sidr_id_node);
++      }
+       spin_unlock_irqrestore(&cm.lock, flags);
+       return 0;
+ 
+diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
+index bc7eed67998a..4b9e31a5b3f8 100644
+--- a/drivers/input/mouse/alps.c
++++ b/drivers/input/mouse/alps.c
+@@ -100,7 +100,7 @@ static const struct alps_nibble_commands 
alps_v6_nibble_commands[] = {
+ #define ALPS_FOUR_BUTTONS     0x40    /* 4 direction button present */
+ #define ALPS_PS2_INTERLEAVED  0x80    /* 3-byte PS/2 packet interleaved with
+                                          6-byte ALPS packet */
+-#define ALPS_DELL             0x100   /* device is a Dell laptop */
++#define ALPS_STICK_BITS               0x100   /* separate stick button bits */
+ #define ALPS_BUTTONPAD                0x200   /* device is a clickpad */
+ 
+ static const struct alps_model_info alps_model_data[] = {
+@@ -159,6 +159,43 @@ static const struct alps_protocol_info 
alps_v8_protocol_data = {
+       ALPS_PROTO_V8, 0x18, 0x18, 0
+ };
+ 
++/*
++ * Some v2 models report the stick buttons in separate bits
++ */
++static const struct dmi_system_id alps_dmi_has_separate_stick_buttons[] = {
++#if defined(CONFIG_DMI) && defined(CONFIG_X86)
++      {
++              /* Extrapolated from other entries */
++              .matches = {
++                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Latitude D420"),
++              },
++      },
++      {
++              /* Reported-by: Hans de Bruin <jmdebr...@xmsnet.nl> */
++              .matches = {
++                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Latitude D430"),
++              },
++      },
++      {
++              /* Reported-by: Hans de Goede <hdego...@redhat.com> */
++              .matches = {
++                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Latitude D620"),
++              },
++      },
++      {
++              /* Extrapolated from other entries */
++              .matches = {
++                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Latitude D630"),
++              },
++      },
++#endif
++      { }
++};
++
+ static void alps_set_abs_params_st(struct alps_data *priv,
+                                  struct input_dev *dev1);
+ static void alps_set_abs_params_mt(struct alps_data *priv,
+@@ -253,9 +290,8 @@ static void alps_process_packet_v1_v2(struct psmouse 
*psmouse)
+               return;
+       }
+ 
+-      /* Dell non interleaved V2 dualpoint has separate stick button bits */
+-      if (priv->proto_version == ALPS_PROTO_V2 &&
+-          priv->flags == (ALPS_DELL | ALPS_PASS | ALPS_DUALPOINT)) {
++      /* Some models have separate stick button bits */
++      if (priv->flags & ALPS_STICK_BITS) {
+               left |= packet[0] & 1;
+               right |= packet[0] & 2;
+               middle |= packet[0] & 4;
+@@ -2544,8 +2580,6 @@ static int alps_set_protocol(struct psmouse *psmouse,
+       priv->byte0 = protocol->byte0;
+       priv->mask0 = protocol->mask0;
+       priv->flags = protocol->flags;
+-      if (dmi_name_in_vendors("Dell"))
+-              priv->flags |= ALPS_DELL;
+ 
+       priv->x_max = 2000;
+       priv->y_max = 1400;
+@@ -2560,6 +2594,8 @@ static int alps_set_protocol(struct psmouse *psmouse,
+               priv->set_abs_params = alps_set_abs_params_st;
+               priv->x_max = 1023;
+               priv->y_max = 767;
++              if (dmi_check_system(alps_dmi_has_separate_stick_buttons))
++                      priv->flags |= ALPS_STICK_BITS;
+               break;
+ 
+       case ALPS_PROTO_V3:
+diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c
+index ca9f4edbb940..f0fd5352f8ef 100644
+--- a/drivers/iommu/amd_iommu.c
++++ b/drivers/iommu/amd_iommu.c
+@@ -2099,8 +2099,8 @@ static void set_dte_entry(u16 devid, struct 
protection_domain *domain, bool ats)
+ static void clear_dte_entry(u16 devid)
+ {
+       /* remove entry from the device table seen by the hardware */
+-      amd_iommu_dev_table[devid].data[0] = IOMMU_PTE_P | IOMMU_PTE_TV;
+-      amd_iommu_dev_table[devid].data[1] = 0;
++      amd_iommu_dev_table[devid].data[0]  = IOMMU_PTE_P | IOMMU_PTE_TV;
++      amd_iommu_dev_table[devid].data[1] &= DTE_FLAG_MASK;
+ 
+       amd_iommu_apply_erratum_63(devid);
+ }
+diff --git a/drivers/iommu/amd_iommu_types.h b/drivers/iommu/amd_iommu_types.h
+index 05030e523771..cbfd0f4c4608 100644
+--- a/drivers/iommu/amd_iommu_types.h
++++ b/drivers/iommu/amd_iommu_types.h
+@@ -295,6 +295,7 @@
+ #define IOMMU_PTE_IR (1ULL << 61)
+ #define IOMMU_PTE_IW (1ULL << 62)
+ 
++#define DTE_FLAG_MASK (0x3ffULL << 32)
+ #define DTE_FLAG_IOTLB        (0x01UL << 32)
+ #define DTE_FLAG_GV   (0x01ULL << 55)
+ #define DTE_GLX_SHIFT (56)
+diff --git a/drivers/iommu/amd_iommu_v2.c b/drivers/iommu/amd_iommu_v2.c
+index 3465faf1809e..45087c3e5c57 100644
+--- a/drivers/iommu/amd_iommu_v2.c
++++ b/drivers/iommu/amd_iommu_v2.c
+@@ -508,6 +508,13 @@ static void do_fault(struct work_struct *work)
+               goto out;
+       }
+ 
++      if (!(vma->vm_flags & (VM_READ | VM_EXEC | VM_WRITE))) {
++              /* handle_mm_fault would BUG_ON() */
++              up_read(&mm->mmap_sem);
++              handle_fault_error(fault);
++              goto out;
++      }
++
+       ret = handle_mm_fault(mm, vma, address, write);
+       if (ret & VM_FAULT_ERROR) {
+               /* failed to service fault */
+diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
+index c23427951ec1..8b0178db6a04 100644
+--- a/drivers/iommu/intel-iommu.c
++++ b/drivers/iommu/intel-iommu.c
+@@ -2033,15 +2033,19 @@ static int __domain_mapping(struct dmar_domain 
*domain, unsigned long iov_pfn,
+                               return -ENOMEM;
+                       /* It is large page*/
+                       if (largepage_lvl > 1) {
++                              unsigned long nr_superpages, end_pfn;
++
+                               pteval |= DMA_PTE_LARGE_PAGE;
+                               lvl_pages = lvl_to_nr_pages(largepage_lvl);
++
++                              nr_superpages = sg_res / lvl_pages;
++                              end_pfn = iov_pfn + nr_superpages * lvl_pages - 
1;
++
+                               /*
+                                * Ensure that old small page tables are
+-                               * removed to make room for superpage,
+-                               * if they exist.
++                               * removed to make room for superpage(s).
+                                */
+-                              dma_pte_free_pagetable(domain, iov_pfn,
+-                                                     iov_pfn + lvl_pages - 1);
++                              dma_pte_free_pagetable(domain, iov_pfn, 
end_pfn);
+                       } else {
+                               pteval &= ~(uint64_t)DMA_PTE_LARGE_PAGE;
+                       }
+diff --git a/drivers/irqchip/irq-tegra.c b/drivers/irqchip/irq-tegra.c
+index f67bbd80433e..ab5353a96a82 100644
+--- a/drivers/irqchip/irq-tegra.c
++++ b/drivers/irqchip/irq-tegra.c
+@@ -215,6 +215,7 @@ static struct irq_chip tegra_ictlr_chip = {
+       .irq_unmask             = tegra_unmask,
+       .irq_retrigger          = tegra_retrigger,
+       .irq_set_wake           = tegra_set_wake,
++      .irq_set_type           = irq_chip_set_type_parent,
+       .flags                  = IRQCHIP_MASK_ON_SUSPEND,
+ #ifdef CONFIG_SMP
+       .irq_set_affinity       = irq_chip_set_affinity_parent,
+diff --git a/drivers/md/md.c b/drivers/md/md.c
+index e8c44fcb1ad1..78c1f77e7903 100644
+--- a/drivers/md/md.c
++++ b/drivers/md/md.c
+@@ -8013,8 +8013,7 @@ static int remove_and_add_spares(struct mddev *mddev,
+                      !test_bit(Bitmap_sync, &rdev->flags)))
+                       continue;
+ 
+-              if (rdev->saved_raid_disk < 0)
+-                      rdev->recovery_offset = 0;
++              rdev->recovery_offset = 0;
+               if (mddev->pers->
+                   hot_add_disk(mddev, rdev) == 0) {
+                       if (sysfs_link_rdev(mddev, rdev))
+diff --git a/drivers/md/persistent-data/dm-btree-remove.c 
b/drivers/md/persistent-data/dm-btree-remove.c
+index 7c0d75547ccf..92cd09f3c69b 100644
+--- a/drivers/md/persistent-data/dm-btree-remove.c
++++ b/drivers/md/persistent-data/dm-btree-remove.c
+@@ -301,11 +301,16 @@ static void redistribute3(struct dm_btree_info *info, 
struct btree_node *parent,
+ {
+       int s;
+       uint32_t max_entries = le32_to_cpu(left->header.max_entries);
+-      unsigned target = (nr_left + nr_center + nr_right) / 3;
+-      BUG_ON(target > max_entries);
++      unsigned total = nr_left + nr_center + nr_right;
++      unsigned target_right = total / 3;
++      unsigned remainder = (target_right * 3) != total;
++      unsigned target_left = target_right + remainder;
++
++      BUG_ON(target_left > max_entries);
++      BUG_ON(target_right > max_entries);
+ 
+       if (nr_left < nr_right) {
+-              s = nr_left - target;
++              s = nr_left - target_left;
+ 
+               if (s < 0 && nr_center < -s) {
+                       /* not enough in central node */
+@@ -316,10 +321,10 @@ static void redistribute3(struct dm_btree_info *info, 
struct btree_node *parent,
+               } else
+                       shift(left, center, s);
+ 
+-              shift(center, right, target - nr_right);
++              shift(center, right, target_right - nr_right);
+ 
+       } else {
+-              s = target - nr_right;
++              s = target_right - nr_right;
+               if (s > 0 && nr_center < s) {
+                       /* not enough in central node */
+                       shift(center, right, nr_center);
+@@ -329,7 +334,7 @@ static void redistribute3(struct dm_btree_info *info, 
struct btree_node *parent,
+               } else
+                       shift(center, right, s);
+ 
+-              shift(left, center, nr_left - target);
++              shift(left, center, nr_left - target_left);
+       }
+ 
+       *key_ptr(parent, c->index) = center->keys[0];
+diff --git a/drivers/md/persistent-data/dm-btree.c 
b/drivers/md/persistent-data/dm-btree.c
+index c7726cebc495..d6e47033b5e0 100644
+--- a/drivers/md/persistent-data/dm-btree.c
++++ b/drivers/md/persistent-data/dm-btree.c
+@@ -523,7 +523,7 @@ static int btree_split_beneath(struct shadow_spine *s, 
uint64_t key)
+ 
+       r = new_block(s->info, &right);
+       if (r < 0) {
+-              /* FIXME: put left */
++              unlock_block(s->info, left);
+               return r;
+       }
+ 
+diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
+index 5ce3cd5c4e1d..bff6c1c7fecb 100644
+--- a/drivers/md/raid1.c
++++ b/drivers/md/raid1.c
+@@ -2248,7 +2248,7 @@ static int narrow_write_error(struct r1bio *r1_bio, int 
i)
+               bio_trim(wbio, sector - r1_bio->sector, sectors);
+               wbio->bi_iter.bi_sector += rdev->data_offset;
+               wbio->bi_bdev = rdev->bdev;
+-              if (submit_bio_wait(WRITE, wbio) == 0)
++              if (submit_bio_wait(WRITE, wbio) < 0)
+                       /* failure! */
+                       ok = rdev_set_badblocks(rdev, sector,
+                                               sectors, 0)
+diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
+index fe0122771642..adfc83a0f023 100644
+--- a/drivers/md/raid10.c
++++ b/drivers/md/raid10.c
+@@ -2590,7 +2590,7 @@ static int narrow_write_error(struct r10bio *r10_bio, 
int i)
+                                  choose_data_offset(r10_bio, rdev) +
+                                  (sector - r10_bio->sector));
+               wbio->bi_bdev = rdev->bdev;
+-              if (submit_bio_wait(WRITE, wbio) == 0)
++              if (submit_bio_wait(WRITE, wbio) < 0)
+                       /* Failure! */
+                       ok = rdev_set_badblocks(rdev, sector,
+                                               sectors, 0)
+diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
+index 23af6772f146..0d767e31f455 100644
+--- a/drivers/md/raid5.c
++++ b/drivers/md/raid5.c
+@@ -3494,6 +3494,7 @@ returnbi:
+               }
+       if (!discard_pending &&
+           test_bit(R5_Discard, &sh->dev[sh->pd_idx].flags)) {
++              int hash;
+               clear_bit(R5_Discard, &sh->dev[sh->pd_idx].flags);
+               clear_bit(R5_UPTODATE, &sh->dev[sh->pd_idx].flags);
+               if (sh->qd_idx >= 0) {
+@@ -3507,16 +3508,17 @@ returnbi:
+                * no updated data, so remove it from hash list and the stripe
+                * will be reinitialized
+                */
+-              spin_lock_irq(&conf->device_lock);
+ unhash:
++              hash = sh->hash_lock_index;
++              spin_lock_irq(conf->hash_locks + hash);
+               remove_hash(sh);
++              spin_unlock_irq(conf->hash_locks + hash);
+               if (head_sh->batch_head) {
+                       sh = list_first_entry(&sh->batch_list,
+                                             struct stripe_head, batch_list);
+                       if (sh != head_sh)
+                                       goto unhash;
+               }
+-              spin_unlock_irq(&conf->device_lock);
+               sh = head_sh;
+ 
+               if (test_bit(STRIPE_SYNC_REQUESTED, &sh->state))
+diff --git a/drivers/media/dvb-frontends/si2168.c 
b/drivers/media/dvb-frontends/si2168.c
+index 5db588ebfc24..391e98395b41 100644
+--- a/drivers/media/dvb-frontends/si2168.c
++++ b/drivers/media/dvb-frontends/si2168.c
+@@ -457,6 +457,10 @@ static int si2168_init(struct dvb_frontend *fe)
+               /* firmware is in the new format */
+               for (remaining = fw->size; remaining > 0; remaining -= 17) {
+                       len = fw->data[fw->size - remaining];
++                      if (len > SI2168_ARGLEN) {
++                              ret = -EINVAL;
++                              break;
++                      }
+                       memcpy(cmd.args, &fw->data[(fw->size - remaining) + 1], 
len);
+                       cmd.wlen = len;
+                       cmd.rlen = 1;
+diff --git a/drivers/media/tuners/si2157.c b/drivers/media/tuners/si2157.c
+index d74ae26621ca..c5dbba5b5bc9 100644
+--- a/drivers/media/tuners/si2157.c
++++ b/drivers/media/tuners/si2157.c
+@@ -165,6 +165,10 @@ static int si2157_init(struct dvb_frontend *fe)
+ 
+       for (remaining = fw->size; remaining > 0; remaining -= 17) {
+               len = fw->data[fw->size - remaining];
++              if (len > SI2157_ARGLEN) {
++                      dev_err(&client->dev, "Bad firmware length\n");
++                      goto err_release_firmware;
++              }
+               memcpy(cmd.args, &fw->data[(fw->size - remaining) + 1], len);
+               cmd.wlen = len;
+               cmd.rlen = 1;
+diff --git a/drivers/media/usb/dvb-usb-v2/rtl28xxu.c 
b/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
+index 895441fe90f7..e862554952c1 100644
+--- a/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
++++ b/drivers/media/usb/dvb-usb-v2/rtl28xxu.c
+@@ -34,6 +34,14 @@ static int rtl28xxu_ctrl_msg(struct dvb_usb_device *d, 
struct rtl28xxu_req *req)
+       unsigned int pipe;
+       u8 requesttype;
+ 
++      mutex_lock(&d->usb_mutex);
++
++      if (req->size > sizeof(dev->buf)) {
++              dev_err(&d->intf->dev, "too large message %u\n", req->size);
++              ret = -EINVAL;
++              goto err_mutex_unlock;
++      }
++
+       if (req->index & CMD_WR_FLAG) {
+               /* write */
+               memcpy(dev->buf, req->data, req->size);
+@@ -50,14 +58,17 @@ static int rtl28xxu_ctrl_msg(struct dvb_usb_device *d, 
struct rtl28xxu_req *req)
+       dvb_usb_dbg_usb_control_msg(d->udev, 0, requesttype, req->value,
+                       req->index, dev->buf, req->size);
+       if (ret < 0)
+-              goto err;
++              goto err_mutex_unlock;
+ 
+       /* read request, copy returned data to return buf */
+       if (requesttype == (USB_TYPE_VENDOR | USB_DIR_IN))
+               memcpy(req->data, dev->buf, req->size);
+ 
++      mutex_unlock(&d->usb_mutex);
++
+       return 0;
+-err:
++err_mutex_unlock:
++      mutex_unlock(&d->usb_mutex);
+       dev_dbg(&d->intf->dev, "failed=%d\n", ret);
+       return ret;
+ }
+diff --git a/drivers/media/usb/dvb-usb-v2/rtl28xxu.h 
b/drivers/media/usb/dvb-usb-v2/rtl28xxu.h
+index 1b5d7ffb685e..1bdeda05d332 100644
+--- a/drivers/media/usb/dvb-usb-v2/rtl28xxu.h
++++ b/drivers/media/usb/dvb-usb-v2/rtl28xxu.h
+@@ -69,7 +69,7 @@
+ 
+ 
+ struct rtl28xxu_dev {
+-      u8 buf[28];
++      u8 buf[128];
+       u8 chip_id;
+       u8 tuner;
+       char *tuner_name;
+diff --git a/drivers/net/wireless/ath/ath9k/init.c 
b/drivers/net/wireless/ath/ath9k/init.c
+index f8d11efa7b0f..46a389c20bfc 100644
+--- a/drivers/net/wireless/ath/ath9k/init.c
++++ b/drivers/net/wireless/ath/ath9k/init.c
+@@ -874,6 +874,7 @@ static void ath9k_set_hw_capab(struct ath_softc *sc, 
struct ieee80211_hw *hw)
+       hw->max_rate_tries = 10;
+       hw->sta_data_size = sizeof(struct ath_node);
+       hw->vif_data_size = sizeof(struct ath_vif);
++      hw->extra_tx_headroom = 4;
+ 
+       hw->wiphy->available_antennas_rx = BIT(ah->caps.max_rxchains) - 1;
+       hw->wiphy->available_antennas_tx = BIT(ah->caps.max_txchains) - 1;
+diff --git a/drivers/net/wireless/iwlwifi/dvm/lib.c 
b/drivers/net/wireless/iwlwifi/dvm/lib.c
+index 1d2223df5cb0..e7d3566c714b 100644
+--- a/drivers/net/wireless/iwlwifi/dvm/lib.c
++++ b/drivers/net/wireless/iwlwifi/dvm/lib.c
+@@ -1022,7 +1022,7 @@ static void iwlagn_wowlan_program_keys(struct 
ieee80211_hw *hw,
+                       u8 *pn = seq.ccmp.pn;
+ 
+                       ieee80211_get_key_rx_seq(key, i, &seq);
+-                      aes_sc->pn = cpu_to_le64(
++                      aes_sc[i].pn = cpu_to_le64(
+                                       (u64)pn[5] |
+                                       ((u64)pn[4] << 8) |
+                                       ((u64)pn[3] << 16) |
+diff --git a/drivers/net/wireless/iwlwifi/iwl-7000.c 
b/drivers/net/wireless/iwlwifi/iwl-7000.c
+index 74ad278116be..fd83e30eaf00 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-7000.c
++++ b/drivers/net/wireless/iwlwifi/iwl-7000.c
+@@ -325,6 +325,6 @@ const struct iwl_cfg iwl7265d_n_cfg = {
+ };
+ 
+ MODULE_FIRMWARE(IWL7260_MODULE_FIRMWARE(IWL7260_UCODE_API_OK));
+-MODULE_FIRMWARE(IWL3160_MODULE_FIRMWARE(IWL3160_UCODE_API_OK));
++MODULE_FIRMWARE(IWL3160_MODULE_FIRMWARE(IWL7260_UCODE_API_OK));
+ MODULE_FIRMWARE(IWL7265_MODULE_FIRMWARE(IWL7260_UCODE_API_OK));
+ MODULE_FIRMWARE(IWL7265D_MODULE_FIRMWARE(IWL7260_UCODE_API_OK));
+diff --git a/drivers/net/wireless/iwlwifi/mvm/d3.c 
b/drivers/net/wireless/iwlwifi/mvm/d3.c
+index 4310cf102d78..89d6a6100c88 100644
+--- a/drivers/net/wireless/iwlwifi/mvm/d3.c
++++ b/drivers/net/wireless/iwlwifi/mvm/d3.c
+@@ -298,12 +298,12 @@ static void iwl_mvm_wowlan_program_keys(struct 
ieee80211_hw *hw,
+                       u8 *pn = seq.ccmp.pn;
+ 
+                       ieee80211_get_key_rx_seq(key, i, &seq);
+-                      aes_sc->pn = cpu_to_le64((u64)pn[5] |
+-                                               ((u64)pn[4] << 8) |
+-                                               ((u64)pn[3] << 16) |
+-                                               ((u64)pn[2] << 24) |
+-                                               ((u64)pn[1] << 32) |
+-                                               ((u64)pn[0] << 40));
++                      aes_sc[i].pn = cpu_to_le64((u64)pn[5] |
++                                                 ((u64)pn[4] << 8) |
++                                                 ((u64)pn[3] << 16) |
++                                                 ((u64)pn[2] << 24) |
++                                                 ((u64)pn[1] << 32) |
++                                                 ((u64)pn[0] << 40));
+               }
+               data->use_rsc_tsc = true;
+               break;
+diff --git a/drivers/net/wireless/iwlwifi/mvm/fw.c 
b/drivers/net/wireless/iwlwifi/mvm/fw.c
+index df869633f4dd..1e1c77a59760 100644
+--- a/drivers/net/wireless/iwlwifi/mvm/fw.c
++++ b/drivers/net/wireless/iwlwifi/mvm/fw.c
+@@ -364,7 +364,7 @@ int iwl_run_init_mvm_ucode(struct iwl_mvm *mvm, bool 
read_nvm)
+        * abort after reading the nvm in case RF Kill is on, we will complete
+        * the init seq later when RF kill will switch to off
+        */
+-      if (iwl_mvm_is_radio_killed(mvm)) {
++      if (iwl_mvm_is_radio_hw_killed(mvm)) {
+               IWL_DEBUG_RF_KILL(mvm,
+                                 "jump over all phy activities due to RF 
kill\n");
+               iwl_remove_notification(&mvm->notif_wait, &calib_wait);
+@@ -397,7 +397,7 @@ int iwl_run_init_mvm_ucode(struct iwl_mvm *mvm, bool 
read_nvm)
+       ret = iwl_wait_notification(&mvm->notif_wait, &calib_wait,
+                       MVM_UCODE_CALIB_TIMEOUT);
+ 
+-      if (ret && iwl_mvm_is_radio_killed(mvm)) {
++      if (ret && iwl_mvm_is_radio_hw_killed(mvm)) {
+               IWL_DEBUG_RF_KILL(mvm, "RFKILL while calibrating.\n");
+               ret = 1;
+       }
+diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c 
b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
+index 60c138a9bf4f..9779c1e5688c 100644
+--- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c
++++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
+@@ -2277,6 +2277,7 @@ static void iwl_mvm_stop_ap_ibss(struct ieee80211_hw *hw,
+               iwl_mvm_remove_time_event(mvm, mvmvif,
+                                         &mvmvif->time_event_data);
+               RCU_INIT_POINTER(mvm->csa_vif, NULL);
++              mvmvif->csa_countdown = false;
+       }
+ 
+       if (rcu_access_pointer(mvm->csa_tx_blocked_vif) == vif) {
+diff --git a/drivers/net/wireless/iwlwifi/mvm/mvm.h 
b/drivers/net/wireless/iwlwifi/mvm/mvm.h
+index 6af21daaaaef..83273adfabdd 100644
+--- a/drivers/net/wireless/iwlwifi/mvm/mvm.h
++++ b/drivers/net/wireless/iwlwifi/mvm/mvm.h
+@@ -870,6 +870,11 @@ static inline bool iwl_mvm_is_radio_killed(struct iwl_mvm 
*mvm)
+              test_bit(IWL_MVM_STATUS_HW_CTKILL, &mvm->status);
+ }
+ 
++static inline bool iwl_mvm_is_radio_hw_killed(struct iwl_mvm *mvm)
++{
++      return test_bit(IWL_MVM_STATUS_HW_RFKILL, &mvm->status);
++}
++
+ /* Must be called with rcu_read_lock() held and it can only be
+  * released when mvmsta is not needed anymore.
+  */
+diff --git a/drivers/net/wireless/iwlwifi/mvm/ops.c 
b/drivers/net/wireless/iwlwifi/mvm/ops.c
+index 2ea01238754e..8d4f287dca3b 100644
+--- a/drivers/net/wireless/iwlwifi/mvm/ops.c
++++ b/drivers/net/wireless/iwlwifi/mvm/ops.c
+@@ -589,6 +589,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const 
struct iwl_cfg *cfg,
+       ieee80211_unregister_hw(mvm->hw);
+       iwl_mvm_leds_exit(mvm);
+  out_free:
++      flush_delayed_work(&mvm->fw_dump_wk);
+       iwl_phy_db_free(mvm->phy_db);
+       kfree(mvm->scan_cmd);
+       if (!cfg->no_power_up_nic_in_init || !mvm->nvm_file_name)
+diff --git a/drivers/net/wireless/iwlwifi/pcie/drv.c 
b/drivers/net/wireless/iwlwifi/pcie/drv.c
+index b18569734922..8b16949a9cb9 100644
+--- a/drivers/net/wireless/iwlwifi/pcie/drv.c
++++ b/drivers/net/wireless/iwlwifi/pcie/drv.c
+@@ -412,6 +412,11 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
+       {IWL_PCI_DEVICE(0x095A, 0x5590, iwl7265_2ac_cfg)},
+       {IWL_PCI_DEVICE(0x095B, 0x5290, iwl7265_2ac_cfg)},
+       {IWL_PCI_DEVICE(0x095A, 0x5490, iwl7265_2ac_cfg)},
++      {IWL_PCI_DEVICE(0x095A, 0x5F10, iwl7265_2ac_cfg)},
++      {IWL_PCI_DEVICE(0x095B, 0x5212, iwl7265_2ac_cfg)},
++      {IWL_PCI_DEVICE(0x095B, 0x520A, iwl7265_2ac_cfg)},
++      {IWL_PCI_DEVICE(0x095A, 0x9000, iwl7265_2ac_cfg)},
++      {IWL_PCI_DEVICE(0x095A, 0x9400, iwl7265_2ac_cfg)},
+ 
+ /* 8000 Series */
+       {IWL_PCI_DEVICE(0x24F3, 0x0010, iwl8260_2ac_cfg)},
+diff --git a/drivers/net/wireless/rtlwifi/pci.h 
b/drivers/net/wireless/rtlwifi/pci.h
+index d4567d12e07e..5da6703942d9 100644
+--- a/drivers/net/wireless/rtlwifi/pci.h
++++ b/drivers/net/wireless/rtlwifi/pci.h
+@@ -247,6 +247,8 @@ struct rtl_pci {
+       /* MSI support */
+       bool msi_support;
+       bool using_msi;
++      /* interrupt clear before set */
++      bool int_clear;
+ };
+ 
+ struct mp_adapter {
+diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c 
b/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c
+index 3fa2fb7c8e4e..76e52dfb2be5 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c
++++ b/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c
+@@ -2253,11 +2253,28 @@ void rtl8821ae_set_qos(struct ieee80211_hw *hw, int 
aci)
+       }
+ }
+ 
++static void rtl8821ae_clear_interrupt(struct ieee80211_hw *hw)
++{
++      struct rtl_priv *rtlpriv = rtl_priv(hw);
++      u32 tmp = rtl_read_dword(rtlpriv, REG_HISR);
++
++      rtl_write_dword(rtlpriv, REG_HISR, tmp);
++
++      tmp = rtl_read_dword(rtlpriv, REG_HISRE);
++      rtl_write_dword(rtlpriv, REG_HISRE, tmp);
++
++      tmp = rtl_read_dword(rtlpriv, REG_HSISR);
++      rtl_write_dword(rtlpriv, REG_HSISR, tmp);
++}
++
+ void rtl8821ae_enable_interrupt(struct ieee80211_hw *hw)
+ {
+       struct rtl_priv *rtlpriv = rtl_priv(hw);
+       struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
+ 
++      if (!rtlpci->int_clear)
++              rtl8821ae_clear_interrupt(hw);/*clear it here first*/
++
+       rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF);
+       rtl_write_dword(rtlpriv, REG_HIMRE, rtlpci->irq_mask[1] & 0xFFFFFFFF);
+       rtlpci->irq_enabled = true;
+diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/sw.c 
b/drivers/net/wireless/rtlwifi/rtl8821ae/sw.c
+index a4988121e1ab..8ee141a55bc5 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8821ae/sw.c
++++ b/drivers/net/wireless/rtlwifi/rtl8821ae/sw.c
+@@ -96,6 +96,7 @@ int rtl8821ae_init_sw_vars(struct ieee80211_hw *hw)
+ 
+       rtl8821ae_bt_reg_init(hw);
+       rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support;
++      rtlpci->int_clear = rtlpriv->cfg->mod_params->int_clear;
+       rtlpriv->btcoexist.btc_ops = rtl_btc_get_ops_pointer();
+ 
+       rtlpriv->dm.dm_initialgain_enable = 1;
+@@ -167,6 +168,7 @@ int rtl8821ae_init_sw_vars(struct ieee80211_hw *hw)
+       rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps;
+       rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps;
+       rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support;
++      rtlpci->msi_support = rtlpriv->cfg->mod_params->int_clear;
+       if (rtlpriv->cfg->mod_params->disable_watchdog)
+               pr_info("watchdog disabled\n");
+       rtlpriv->psc.reg_fwctrl_lps = 3;
+@@ -308,6 +310,7 @@ static struct rtl_mod_params rtl8821ae_mod_params = {
+       .swctrl_lps = false,
+       .fwctrl_lps = true,
+       .msi_support = true,
++      .int_clear = true,
+       .debug = DBG_EMERG,
+       .disable_watchdog = 0,
+ };
+@@ -437,6 +440,7 @@ module_param_named(fwlps, rtl8821ae_mod_params.fwctrl_lps, 
bool, 0444);
+ module_param_named(msi, rtl8821ae_mod_params.msi_support, bool, 0444);
+ module_param_named(disable_watchdog, rtl8821ae_mod_params.disable_watchdog,
+                  bool, 0444);
++module_param_named(int_clear, rtl8821ae_mod_params.int_clear, bool, 0444);
+ MODULE_PARM_DESC(swenc, "Set to 1 for software crypto (default 0)\n");
+ MODULE_PARM_DESC(ips, "Set to 0 to not use link power save (default 1)\n");
+ MODULE_PARM_DESC(swlps, "Set to 1 to use SW control power save (default 
0)\n");
+@@ -444,6 +448,7 @@ MODULE_PARM_DESC(fwlps, "Set to 1 to use FW control power 
save (default 1)\n");
+ MODULE_PARM_DESC(msi, "Set to 1 to use MSI interrupts mode (default 1)\n");
+ MODULE_PARM_DESC(debug, "Set debug level (0-5) (default 0)");
+ MODULE_PARM_DESC(disable_watchdog, "Set to 1 to disable the watchdog (default 
0)\n");
++MODULE_PARM_DESC(int_clear, "Set to 1 to disable interrupt clear before set 
(default 0)\n");
+ 
+ static SIMPLE_DEV_PM_OPS(rtlwifi_pm_ops, rtl_pci_suspend, rtl_pci_resume);
+ 
+diff --git a/drivers/net/wireless/rtlwifi/wifi.h 
b/drivers/net/wireless/rtlwifi/wifi.h
+index 51572912c53d..f1fa8100f288 100644
+--- a/drivers/net/wireless/rtlwifi/wifi.h
++++ b/drivers/net/wireless/rtlwifi/wifi.h
+@@ -2233,6 +2233,9 @@ struct rtl_mod_params {
+ 
+       /* default 0: 1 means disable */
+       bool disable_watchdog;
++
++      /* default 0: 1 means do not disable interrupts */
++      bool int_clear;
+ };
+ 
+ struct rtl_hal_usbint_cfg {
+diff --git a/drivers/of/platform.c b/drivers/of/platform.c
+index a01f57c9e34e..ddf8e42c9367 100644
+--- a/drivers/of/platform.c
++++ b/drivers/of/platform.c
+@@ -25,6 +25,7 @@
+ 
+ const struct of_device_id of_default_bus_match_table[] = {
+       { .compatible = "simple-bus", },
++      { .compatible = "simple-mfd", },
+ #ifdef CONFIG_ARM_AMBA
+       { .compatible = "arm,amba-bus", },
+ #endif /* CONFIG_ARM_AMBA */
+diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c
+index 312f23a8429c..92618686604c 100644
+--- a/drivers/pci/pci-sysfs.c
++++ b/drivers/pci/pci-sysfs.c
+@@ -216,7 +216,7 @@ static ssize_t numa_node_store(struct device *dev,
+       if (ret)
+               return ret;
+ 
+-      if (!node_online(node))
++      if (node >= MAX_NUMNODES || !node_online(node))
+               return -EINVAL;
+ 
+       add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK);
+diff --git a/drivers/pinctrl/intel/pinctrl-baytrail.c 
b/drivers/pinctrl/intel/pinctrl-baytrail.c
+index 2062c224e32f..b2602210784d 100644
+--- a/drivers/pinctrl/intel/pinctrl-baytrail.c
++++ b/drivers/pinctrl/intel/pinctrl-baytrail.c
+@@ -146,7 +146,7 @@ struct byt_gpio_pin_context {
+ struct byt_gpio {
+       struct gpio_chip                chip;
+       struct platform_device          *pdev;
+-      spinlock_t                      lock;
++      raw_spinlock_t                  lock;
+       void __iomem                    *reg_base;
+       struct pinctrl_gpio_range       *range;
+       struct byt_gpio_pin_context     *saved_context;
+@@ -174,11 +174,11 @@ static void byt_gpio_clear_triggering(struct byt_gpio 
*vg, unsigned offset)
+       unsigned long flags;
+       u32 value;
+ 
+-      spin_lock_irqsave(&vg->lock, flags);
++      raw_spin_lock_irqsave(&vg->lock, flags);
+       value = readl(reg);
+       value &= ~(BYT_TRIG_POS | BYT_TRIG_NEG | BYT_TRIG_LVL);
+       writel(value, reg);
+-      spin_unlock_irqrestore(&vg->lock, flags);
++      raw_spin_unlock_irqrestore(&vg->lock, flags);
+ }
+ 
+ static u32 byt_get_gpio_mux(struct byt_gpio *vg, unsigned offset)
+@@ -201,6 +201,9 @@ static int byt_gpio_request(struct gpio_chip *chip, 
unsigned offset)
+       struct byt_gpio *vg = to_byt_gpio(chip);
+       void __iomem *reg = byt_gpio_reg(chip, offset, BYT_CONF0_REG);
+       u32 value, gpio_mux;
++      unsigned long flags;
++
++      raw_spin_lock_irqsave(&vg->lock, flags);
+ 
+       /*
+        * In most cases, func pin mux 000 means GPIO function.
+@@ -214,18 +217,16 @@ static int byt_gpio_request(struct gpio_chip *chip, 
unsigned offset)
+       value = readl(reg) & BYT_PIN_MUX;
+       gpio_mux = byt_get_gpio_mux(vg, offset);
+       if (WARN_ON(gpio_mux != value)) {
+-              unsigned long flags;
+-
+-              spin_lock_irqsave(&vg->lock, flags);
+               value = readl(reg) & ~BYT_PIN_MUX;
+               value |= gpio_mux;
+               writel(value, reg);
+-              spin_unlock_irqrestore(&vg->lock, flags);
+ 
+               dev_warn(&vg->pdev->dev,
+                        "pin %u forcibly re-configured as GPIO\n", offset);
+       }
+ 
++      raw_spin_unlock_irqrestore(&vg->lock, flags);
++
+       pm_runtime_get(&vg->pdev->dev);
+ 
+       return 0;
+@@ -250,7 +251,7 @@ static int byt_irq_type(struct irq_data *d, unsigned type)
+       if (offset >= vg->chip.ngpio)
+               return -EINVAL;
+ 
+-      spin_lock_irqsave(&vg->lock, flags);
++      raw_spin_lock_irqsave(&vg->lock, flags);
+       value = readl(reg);
+ 
+       WARN(value & BYT_DIRECT_IRQ_EN,
+@@ -269,7 +270,7 @@ static int byt_irq_type(struct irq_data *d, unsigned type)
+       else if (type & IRQ_TYPE_LEVEL_MASK)
+               __irq_set_handler_locked(d->irq, handle_level_irq);
+ 
+-      spin_unlock_irqrestore(&vg->lock, flags);
++      raw_spin_unlock_irqrestore(&vg->lock, flags);
+ 
+       return 0;
+ }
+@@ -277,7 +278,15 @@ static int byt_irq_type(struct irq_data *d, unsigned type)
+ static int byt_gpio_get(struct gpio_chip *chip, unsigned offset)
+ {
+       void __iomem *reg = byt_gpio_reg(chip, offset, BYT_VAL_REG);
+-      return readl(reg) & BYT_LEVEL;
++      struct byt_gpio *vg = to_byt_gpio(chip);
++      unsigned long flags;
++      u32 val;
++
++      raw_spin_lock_irqsave(&vg->lock, flags);
++      val = readl(reg);
++      raw_spin_unlock_irqrestore(&vg->lock, flags);
++
++      return val & BYT_LEVEL;
+ }
+ 
+ static void byt_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
+@@ -287,7 +296,7 @@ static void byt_gpio_set(struct gpio_chip *chip, unsigned 
offset, int value)
+       unsigned long flags;
+       u32 old_val;
+ 
+-      spin_lock_irqsave(&vg->lock, flags);
++      raw_spin_lock_irqsave(&vg->lock, flags);
+ 
+       old_val = readl(reg);
+ 
+@@ -296,7 +305,7 @@ static void byt_gpio_set(struct gpio_chip *chip, unsigned 
offset, int value)
+       else
+               writel(old_val & ~BYT_LEVEL, reg);
+ 
+-      spin_unlock_irqrestore(&vg->lock, flags);
++      raw_spin_unlock_irqrestore(&vg->lock, flags);
+ }
+ 
+ static int byt_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
+@@ -306,13 +315,13 @@ static int byt_gpio_direction_input(struct gpio_chip 
*chip, unsigned offset)
+       unsigned long flags;
+       u32 value;
+ 
+-      spin_lock_irqsave(&vg->lock, flags);
++      raw_spin_lock_irqsave(&vg->lock, flags);
+ 
+       value = readl(reg) | BYT_DIR_MASK;
+       value &= ~BYT_INPUT_EN;         /* active low */
+       writel(value, reg);
+ 
+-      spin_unlock_irqrestore(&vg->lock, flags);
++      raw_spin_unlock_irqrestore(&vg->lock, flags);
+ 
+       return 0;
+ }
+@@ -326,7 +335,7 @@ static int byt_gpio_direction_output(struct gpio_chip 
*chip,
+       unsigned long flags;
+       u32 reg_val;
+ 
+-      spin_lock_irqsave(&vg->lock, flags);
++      raw_spin_lock_irqsave(&vg->lock, flags);
+ 
+       /*
+        * Before making any direction modifications, do a check if gpio
+@@ -345,7 +354,7 @@ static int byt_gpio_direction_output(struct gpio_chip 
*chip,
+       else
+               writel(reg_val & ~BYT_LEVEL, reg);
+ 
+-      spin_unlock_irqrestore(&vg->lock, flags);
++      raw_spin_unlock_irqrestore(&vg->lock, flags);
+ 
+       return 0;
+ }
+@@ -354,18 +363,19 @@ static void byt_gpio_dbg_show(struct seq_file *s, struct 
gpio_chip *chip)
+ {
+       struct byt_gpio *vg = to_byt_gpio(chip);
+       int i;
+-      unsigned long flags;
+       u32 conf0, val, offs;
+ 
+-      spin_lock_irqsave(&vg->lock, flags);
+-
+       for (i = 0; i < vg->chip.ngpio; i++) {
+               const char *pull_str = NULL;
+               const char *pull = NULL;
++              unsigned long flags;
+               const char *label;
+               offs = vg->range->pins[i] * 16;
++
++              raw_spin_lock_irqsave(&vg->lock, flags);
+               conf0 = readl(vg->reg_base + offs + BYT_CONF0_REG);
+               val = readl(vg->reg_base + offs + BYT_VAL_REG);
++              raw_spin_unlock_irqrestore(&vg->lock, flags);
+ 
+               label = gpiochip_is_requested(chip, i);
+               if (!label)
+@@ -418,7 +428,6 @@ static void byt_gpio_dbg_show(struct seq_file *s, struct 
gpio_chip *chip)
+ 
+               seq_puts(s, "\n");
+       }
+-      spin_unlock_irqrestore(&vg->lock, flags);
+ }
+ 
+ static void byt_gpio_irq_handler(unsigned irq, struct irq_desc *desc)
+@@ -450,8 +459,10 @@ static void byt_irq_ack(struct irq_data *d)
+       unsigned offset = irqd_to_hwirq(d);
+       void __iomem *reg;
+ 
++      raw_spin_lock(&vg->lock);
+       reg = byt_gpio_reg(&vg->chip, offset, BYT_INT_STAT_REG);
+       writel(BIT(offset % 32), reg);
++      raw_spin_unlock(&vg->lock);
+ }
+ 
+ static void byt_irq_unmask(struct irq_data *d)
+@@ -463,9 +474,9 @@ static void byt_irq_unmask(struct irq_data *d)
+       void __iomem *reg;
+       u32 value;
+ 
+-      spin_lock_irqsave(&vg->lock, flags);
+-
+       reg = byt_gpio_reg(&vg->chip, offset, BYT_CONF0_REG);
++
++      raw_spin_lock_irqsave(&vg->lock, flags);
+       value = readl(reg);
+ 
+       switch (irqd_get_trigger_type(d)) {
+@@ -486,7 +497,7 @@ static void byt_irq_unmask(struct irq_data *d)
+ 
+       writel(value, reg);
+ 
+-      spin_unlock_irqrestore(&vg->lock, flags);
++      raw_spin_unlock_irqrestore(&vg->lock, flags);
+ }
+ 
+ static void byt_irq_mask(struct irq_data *d)
+@@ -578,7 +589,7 @@ static int byt_gpio_probe(struct platform_device *pdev)
+       if (IS_ERR(vg->reg_base))
+               return PTR_ERR(vg->reg_base);
+ 
+-      spin_lock_init(&vg->lock);
++      raw_spin_lock_init(&vg->lock);
+ 
+       gc = &vg->chip;
+       gc->label = dev_name(&pdev->dev);
+diff --git a/drivers/scsi/mvsas/mv_sas.c b/drivers/scsi/mvsas/mv_sas.c
+index 454536c49315..9c780740fb82 100644
+--- a/drivers/scsi/mvsas/mv_sas.c
++++ b/drivers/scsi/mvsas/mv_sas.c
+@@ -887,6 +887,8 @@ static void mvs_slot_free(struct mvs_info *mvi, u32 
rx_desc)
+ static void mvs_slot_task_free(struct mvs_info *mvi, struct sas_task *task,
+                         struct mvs_slot_info *slot, u32 slot_idx)
+ {
++      if (!slot)
++              return;
+       if (!slot->task)
+               return;
+       if (!sas_protocol_ata(task->task_proto))
+diff --git a/drivers/staging/iio/accel/sca3000_ring.c 
b/drivers/staging/iio/accel/sca3000_ring.c
+index 8589eade1057..de65a8730d88 100644
+--- a/drivers/staging/iio/accel/sca3000_ring.c
++++ b/drivers/staging/iio/accel/sca3000_ring.c
+@@ -116,7 +116,7 @@ static int sca3000_read_first_n_hw_rb(struct iio_buffer *r,
+       if (ret)
+               goto error_ret;
+ 
+-      for (i = 0; i < num_read; i++)
++      for (i = 0; i < num_read / sizeof(u16); i++)
+               *(((u16 *)rx) + i) = be16_to_cpup((__be16 *)rx + i);
+ 
+       if (copy_to_user(buf, rx, num_read))
+diff --git a/drivers/staging/iio/adc/mxs-lradc.c 
b/drivers/staging/iio/adc/mxs-lradc.c
+index d7c5223f1c3e..2931ea9b75d1 100644
+--- a/drivers/staging/iio/adc/mxs-lradc.c
++++ b/drivers/staging/iio/adc/mxs-lradc.c
+@@ -919,11 +919,12 @@ static int mxs_lradc_read_raw(struct iio_dev *iio_dev,
+       case IIO_CHAN_INFO_OFFSET:
+               if (chan->type == IIO_TEMP) {
+                       /* The calculated value from the ADC is in Kelvin, we
+-                       * want Celsius for hwmon so the offset is
+-                       * -272.15 * scale
++                       * want Celsius for hwmon so the offset is -273.15
++                       * The offset is applied before scaling so it is
++                       * actually -213.15 * 4 / 1.012 = -1079.644268
+                        */
+-                      *val = -1075;
+-                      *val2 = 691699;
++                      *val = -1079;
++                      *val2 = 644268;
+ 
+                       return IIO_VAL_INT_PLUS_MICRO;
+               }
+diff --git a/drivers/tty/serial/8250/8250_dma.c 
b/drivers/tty/serial/8250/8250_dma.c
+index 21d01a491405..e508939daea3 100644
+--- a/drivers/tty/serial/8250/8250_dma.c
++++ b/drivers/tty/serial/8250/8250_dma.c
+@@ -80,10 +80,6 @@ int serial8250_tx_dma(struct uart_8250_port *p)
+               return 0;
+ 
+       dma->tx_size = CIRC_CNT_TO_END(xmit->head, xmit->tail, UART_XMIT_SIZE);
+-      if (dma->tx_size < p->port.fifosize) {
+-              ret = -EINVAL;
+-              goto err;
+-      }
+ 
+       desc = dmaengine_prep_slave_single(dma->txchan,
+                                          dma->tx_addr + xmit->tail,
+diff --git a/drivers/tty/serial/8250/8250_pci.c 
b/drivers/tty/serial/8250/8250_pci.c
+index 9373cca121d3..eb8adc2e68c1 100644
+--- a/drivers/tty/serial/8250/8250_pci.c
++++ b/drivers/tty/serial/8250/8250_pci.c
+@@ -1998,6 +1998,7 @@ pci_wch_ch38x_setup(struct serial_private *priv,
+ #define PCIE_DEVICE_ID_WCH_CH382_2S1P 0x3250
+ #define PCIE_DEVICE_ID_WCH_CH384_4S   0x3470
+ 
++#define PCI_DEVICE_ID_EXAR_XR17V4358  0x4358
+ #define PCI_DEVICE_ID_EXAR_XR17V8358  0x8358
+ 
+ #define PCI_VENDOR_ID_PERICOM                 0x12D8
+@@ -2515,6 +2516,13 @@ static struct pci_serial_quirk pci_serial_quirks[] 
__refdata = {
+       },
+       {
+               .vendor = PCI_VENDOR_ID_EXAR,
++              .device = PCI_DEVICE_ID_EXAR_XR17V4358,
++              .subvendor      = PCI_ANY_ID,
++              .subdevice      = PCI_ANY_ID,
++              .setup          = pci_xr17v35x_setup,
++      },
++      {
++              .vendor = PCI_VENDOR_ID_EXAR,
+               .device = PCI_DEVICE_ID_EXAR_XR17V8358,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+@@ -2999,6 +3007,7 @@ enum pci_board_num_t {
+       pbn_exar_XR17V352,
+       pbn_exar_XR17V354,
+       pbn_exar_XR17V358,
++      pbn_exar_XR17V4358,
+       pbn_exar_XR17V8358,
+       pbn_exar_ibm_saturn,
+       pbn_pasemi_1682M,
+@@ -3690,6 +3699,14 @@ static struct pciserial_board pci_boards[] = {
+               .reg_shift      = 0,
+               .first_offset   = 0,
+       },
++      [pbn_exar_XR17V4358] = {
++              .flags          = FL_BASE0,
++              .num_ports      = 12,
++              .base_baud      = 7812500,
++              .uart_offset    = 0x400,
++              .reg_shift      = 0,
++              .first_offset   = 0,
++      },
+       [pbn_exar_XR17V8358] = {
+               .flags          = FL_BASE0,
+               .num_ports      = 16,
+@@ -5133,6 +5150,10 @@ static struct pci_device_id serial_pci_tbl[] = {
+               PCI_ANY_ID, PCI_ANY_ID,
+               0,
+               0, pbn_exar_XR17V358 },
++      {       PCI_VENDOR_ID_EXAR, PCI_DEVICE_ID_EXAR_XR17V4358,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0,
++              0, pbn_exar_XR17V4358 },
+       {       PCI_VENDOR_ID_EXAR, PCI_DEVICE_ID_EXAR_XR17V8358,
+               PCI_ANY_ID, PCI_ANY_ID,
+               0,
+diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
+index 2af32e26fafc..7e5c90eebb9c 100644
+--- a/drivers/usb/host/xhci-pci.c
++++ b/drivers/usb/host/xhci-pci.c
+@@ -135,6 +135,7 @@ static void xhci_pci_quirks(struct device *dev, struct 
xhci_hcd *xhci)
+       if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
+               pdev->device == PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI) {
+               xhci->quirks |= XHCI_SPURIOUS_REBOOT;
++              xhci->quirks |= XHCI_SPURIOUS_WAKEUP;
+       }
+       if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
+               (pdev->device == PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_XHCI ||
+diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
+index ad975a2975ca..41d7a05f8af4 100644
+--- a/drivers/usb/host/xhci-ring.c
++++ b/drivers/usb/host/xhci-ring.c
+@@ -2239,6 +2239,7 @@ static int handle_tx_event(struct xhci_hcd *xhci,
+       u32 trb_comp_code;
+       int ret = 0;
+       int td_num = 0;
++      bool handling_skipped_tds = false;
+ 
+       slot_id = TRB_TO_SLOT_ID(le32_to_cpu(event->flags));
+       xdev = xhci->devs[slot_id];
+@@ -2372,6 +2373,10 @@ static int handle_tx_event(struct xhci_hcd *xhci,
+               ep->skip = true;
+               xhci_dbg(xhci, "Miss service interval error, set skip flag\n");
+               goto cleanup;
++      case COMP_PING_ERR:
++              ep->skip = true;
++              xhci_dbg(xhci, "No Ping response error, Skip one Isoc TD\n");
++              goto cleanup;
+       default:
+               if (xhci_is_vendor_info_code(xhci, trb_comp_code)) {
+                       status = 0;
+@@ -2508,13 +2513,18 @@ static int handle_tx_event(struct xhci_hcd *xhci,
+                                                ep, &status);
+ 
+ cleanup:
++
++
++              handling_skipped_tds = ep->skip &&
++                      trb_comp_code != COMP_MISSED_INT &&
++                      trb_comp_code != COMP_PING_ERR;
++
+               /*
+-               * Do not update event ring dequeue pointer if ep->skip is set.
+-               * Will roll back to continue process missed tds.
++               * Do not update event ring dequeue pointer if we're in a loop
++               * processing missed tds.
+                */
+-              if (trb_comp_code == COMP_MISSED_INT || !ep->skip) {
++              if (!handling_skipped_tds)
+                       inc_deq(xhci, xhci->event_ring);
+-              }
+ 
+               if (ret) {
+                       urb = td->urb;
+@@ -2549,7 +2559,7 @@ cleanup:
+        * Process them as short transfer until reach the td pointed by
+        * the event.
+        */
+-      } while (ep->skip && trb_comp_code != COMP_MISSED_INT);
++      } while (handling_skipped_tds);
+ 
+       return 0;
+ }
+diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c
+index ebcec8cda858..f49d262e926b 100644
+--- a/drivers/usb/serial/qcserial.c
++++ b/drivers/usb/serial/qcserial.c
+@@ -153,6 +153,8 @@ static const struct usb_device_id id_table[] = {
+       {DEVICE_SWI(0x1199, 0x9056)},   /* Sierra Wireless Modem */
+       {DEVICE_SWI(0x1199, 0x9060)},   /* Sierra Wireless Modem */
+       {DEVICE_SWI(0x1199, 0x9061)},   /* Sierra Wireless Modem */
++      {DEVICE_SWI(0x1199, 0x9070)},   /* Sierra Wireless MC74xx/EM74xx */
++      {DEVICE_SWI(0x1199, 0x9071)},   /* Sierra Wireless MC74xx/EM74xx */
+       {DEVICE_SWI(0x413c, 0x81a2)},   /* Dell Wireless 5806 Gobi(TM) 4G LTE 
Mobile Broadband Card */
+       {DEVICE_SWI(0x413c, 0x81a3)},   /* Dell Wireless 5570 HSPA+ (42Mbps) 
Mobile Broadband Card */
+       {DEVICE_SWI(0x413c, 0x81a4)},   /* Dell Wireless 5570e HSPA+ (42Mbps) 
Mobile Broadband Card */
+diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
+index af3dd3c55ef1..8b2c82ce36b3 100644
+--- a/fs/btrfs/ioctl.c
++++ b/fs/btrfs/ioctl.c
+@@ -4494,7 +4494,7 @@ locked:
+ 
+       if (bctl->flags & ~(BTRFS_BALANCE_ARGS_MASK | BTRFS_BALANCE_TYPE_MASK)) 
{
+               ret = -EINVAL;
+-              goto out_bargs;
++              goto out_bctl;
+       }
+ 
+ do_balance:
+@@ -4508,12 +4508,15 @@ do_balance:
+       need_unlock = false;
+ 
+       ret = btrfs_balance(bctl, bargs);
++      bctl = NULL;
+ 
+       if (arg) {
+               if (copy_to_user(arg, bargs, sizeof(*bargs)))
+                       ret = -EFAULT;
+       }
+ 
++out_bctl:
++      kfree(bctl);
+ out_bargs:
+       kfree(bargs);
+ out_unlock:
+diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c
+index 84d693d37428..871fcb67be97 100644
+--- a/fs/overlayfs/copy_up.c
++++ b/fs/overlayfs/copy_up.c
+@@ -81,11 +81,11 @@ static int ovl_copy_up_data(struct path *old, struct path 
*new, loff_t len)
+       if (len == 0)
+               return 0;
+ 
+-      old_file = ovl_path_open(old, O_RDONLY);
++      old_file = ovl_path_open(old, O_LARGEFILE | O_RDONLY);
+       if (IS_ERR(old_file))
+               return PTR_ERR(old_file);
+ 
+-      new_file = ovl_path_open(new, O_WRONLY);
++      new_file = ovl_path_open(new, O_LARGEFILE | O_WRONLY);
+       if (IS_ERR(new_file)) {
+               error = PTR_ERR(new_file);
+               goto out_fput;
+@@ -267,7 +267,7 @@ out:
+ 
+ out_cleanup:
+       ovl_cleanup(wdir, newdentry);
+-      goto out;
++      goto out2;
+ }
+ 
+ /*
+diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c
+index 33f2d27a6792..d74af7f78fec 100644
+--- a/fs/overlayfs/super.c
++++ b/fs/overlayfs/super.c
+@@ -474,6 +474,7 @@ static void ovl_put_super(struct super_block *sb)
+       mntput(ufs->upper_mnt);
+       for (i = 0; i < ufs->numlower; i++)
+               mntput(ufs->lower_mnt[i]);
++      kfree(ufs->lower_mnt);
+ 
+       kfree(ufs->config.lowerdir);
+       kfree(ufs->config.upperdir);
+@@ -981,6 +982,7 @@ static int ovl_fill_super(struct super_block *sb, void 
*data, int silent)
+               oe->lowerstack[i].dentry = stack[i].dentry;
+               oe->lowerstack[i].mnt = ufs->lower_mnt[i];
+       }
++      kfree(stack);
+ 
+       root_dentry->d_fsdata = oe;
+ 
+diff --git a/include/sound/soc.h b/include/sound/soc.h
+index f6226914acfe..8d948aa9c5c9 100644
+--- a/include/sound/soc.h
++++ b/include/sound/soc.h
+@@ -85,7 +85,7 @@
+       .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
+       SNDRV_CTL_ELEM_ACCESS_READWRITE, \
+       .tlv.p  = (tlv_array),\
+-      .info = snd_soc_info_volsw, \
++      .info = snd_soc_info_volsw_sx, \
+       .get = snd_soc_get_volsw_sx,\
+       .put = snd_soc_put_volsw_sx, \
+       .private_value = (unsigned long)&(struct soc_mixer_control) \
+@@ -155,7 +155,7 @@
+       .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
+       SNDRV_CTL_ELEM_ACCESS_READWRITE, \
+       .tlv.p  = (tlv_array), \
+-      .info = snd_soc_info_volsw, \
++      .info = snd_soc_info_volsw_sx, \
+       .get = snd_soc_get_volsw_sx, \
+       .put = snd_soc_put_volsw_sx, \
+       .private_value = (unsigned long)&(struct soc_mixer_control) \
+@@ -563,6 +563,8 @@ int snd_soc_put_enum_double(struct snd_kcontrol *kcontrol,
+       struct snd_ctl_elem_value *ucontrol);
+ int snd_soc_info_volsw(struct snd_kcontrol *kcontrol,
+       struct snd_ctl_elem_info *uinfo);
++int snd_soc_info_volsw_sx(struct snd_kcontrol *kcontrol,
++                        struct snd_ctl_elem_info *uinfo);
+ #define snd_soc_info_bool_ext         snd_ctl_boolean_mono_info
+ int snd_soc_get_volsw(struct snd_kcontrol *kcontrol,
+       struct snd_ctl_elem_value *ucontrol);
+diff --git a/include/sound/wm8904.h b/include/sound/wm8904.h
+index 898be3a8db9a..6d8f8fba3341 100644
+--- a/include/sound/wm8904.h
++++ b/include/sound/wm8904.h
+@@ -119,7 +119,7 @@
+ #define WM8904_MIC_REGS  2
+ #define WM8904_GPIO_REGS 4
+ #define WM8904_DRC_REGS  4
+-#define WM8904_EQ_REGS   25
++#define WM8904_EQ_REGS   24
+ 
+ /**
+  * DRC configurations are specified with a label and a set of register
+diff --git a/kernel/module.c b/kernel/module.c
+index cfc9e843a924..3b9ff966edb9 100644
+--- a/kernel/module.c
++++ b/kernel/module.c
+@@ -906,11 +906,15 @@ void symbol_put_addr(void *addr)
+       if (core_kernel_text(a))
+               return;
+ 
+-      /* module_text_address is safe here: we're supposed to have reference
+-       * to module from symbol_get, so it can't go away. */
++      /*
++       * Even though we hold a reference on the module; we still need to
++       * disable preemption in order to safely traverse the data structure.
++       */
++      preempt_disable();
+       modaddr = __module_text_address(a);
+       BUG_ON(!modaddr);
+       module_put(modaddr);
++      preempt_enable();
+ }
+ EXPORT_SYMBOL_GPL(symbol_put_addr);
+ 
+diff --git a/lib/fault-inject.c b/lib/fault-inject.c
+index f1cdeb024d17..6a823a53e357 100644
+--- a/lib/fault-inject.c
++++ b/lib/fault-inject.c
+@@ -44,7 +44,7 @@ static void fail_dump(struct fault_attr *attr)
+               printk(KERN_NOTICE "FAULT_INJECTION: forcing a failure.\n"
+                      "name %pd, interval %lu, probability %lu, "
+                      "space %d, times %d\n", attr->dname,
+-                     attr->probability, attr->interval,
++                     attr->interval, attr->probability,
+                      atomic_read(&attr->space),
+                      atomic_read(&attr->times));
+               if (attr->verbose > 1)
+diff --git a/mm/filemap.c b/mm/filemap.c
+index 6bf5e42d560a..1ffef05f1c1f 100644
+--- a/mm/filemap.c
++++ b/mm/filemap.c
+@@ -2461,6 +2461,11 @@ again:
+                       break;
+               }
+ 
++              if (fatal_signal_pending(current)) {
++                      status = -EINTR;
++                      break;
++              }
++
+               status = a_ops->write_begin(file, mapping, pos, bytes, flags,
+                                               &page, &fsdata);
+               if (unlikely(status < 0))
+@@ -2498,10 +2503,6 @@ again:
+               written += copied;
+ 
+               balance_dirty_pages_ratelimited(mapping);
+-              if (fatal_signal_pending(current)) {
+-                      status = -EINTR;
+-                      break;
+-              }
+       } while (iov_iter_count(i));
+ 
+       return written ? written : status;
+diff --git a/mm/huge_memory.c b/mm/huge_memory.c
+index 078832cf3636..8e792ec5e84c 100644
+--- a/mm/huge_memory.c
++++ b/mm/huge_memory.c
+@@ -2137,7 +2137,8 @@ static int __collapse_huge_page_isolate(struct 
vm_area_struct *vma,
+       for (_pte = pte; _pte < pte+HPAGE_PMD_NR;
+            _pte++, address += PAGE_SIZE) {
+               pte_t pteval = *_pte;
+-              if (pte_none(pteval) || is_zero_pfn(pte_pfn(pteval))) {
++              if (pte_none(pteval) || (pte_present(pteval) &&
++                      is_zero_pfn(pte_pfn(pteval)))) {
+                       if (++none_or_zero <= khugepaged_max_ptes_none)
+                               continue;
+                       else
+diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
+index 36e8f1236637..57197bef5f5b 100644
+--- a/sound/pci/hda/hda_codec.c
++++ b/sound/pci/hda/hda_codec.c
+@@ -3833,10 +3833,8 @@ int snd_hda_codec_build_pcms(struct hda_codec *codec)
+               return -EINVAL;
+ 
+       err = snd_hda_codec_parse_pcms(codec);
+-      if (err < 0) {
+-              snd_hda_codec_reset(codec);
++      if (err < 0)
+               return err;
+-      }
+ 
+       /* attach a new PCM streams */
+       list_for_each_entry(cpcm, &codec->pcm_list_head, list) {
+diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c
+index 06cc9d57ba3d..488f4c7be33e 100644
+--- a/sound/pci/hda/patch_conexant.c
++++ b/sound/pci/hda/patch_conexant.c
+@@ -819,6 +819,7 @@ static const struct snd_pci_quirk cxt5066_fixups[] = {
+       SND_PCI_QUIRK(0x17aa, 0x21da, "Lenovo X220", CXT_PINCFG_LENOVO_TP410),
+       SND_PCI_QUIRK(0x17aa, 0x21db, "Lenovo X220-tablet", 
CXT_PINCFG_LENOVO_TP410),
+       SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo IdeaPad Z560", 
CXT_FIXUP_MUTE_LED_EAPD),
++      SND_PCI_QUIRK(0x17aa, 0x390b, "Lenovo G50-80", CXT_FIXUP_STEREO_DMIC),
+       SND_PCI_QUIRK(0x17aa, 0x3975, "Lenovo U300s", CXT_FIXUP_STEREO_DMIC),
+       SND_PCI_QUIRK(0x17aa, 0x3977, "Lenovo IdeaPad U310", 
CXT_FIXUP_STEREO_DMIC),
+       SND_PCI_QUIRK(0x17aa, 0x397b, "Lenovo S205", CXT_FIXUP_STEREO_DMIC),
+diff --git a/sound/soc/soc-ops.c b/sound/soc/soc-ops.c
+index 100d92b5b77e..05977ae1ff2a 100644
+--- a/sound/soc/soc-ops.c
++++ b/sound/soc/soc-ops.c
+@@ -207,6 +207,34 @@ int snd_soc_info_volsw(struct snd_kcontrol *kcontrol,
+ EXPORT_SYMBOL_GPL(snd_soc_info_volsw);
+ 
+ /**
++ * snd_soc_info_volsw_sx - Mixer info callback for SX TLV controls
++ * @kcontrol: mixer control
++ * @uinfo: control element information
++ *
++ * Callback to provide information about a single mixer control, or a double
++ * mixer control that spans 2 registers of the SX TLV type. SX TLV controls
++ * have a range that represents both positive and negative values either side
++ * of zero but without a sign bit.
++ *
++ * Returns 0 for success.
++ */
++int snd_soc_info_volsw_sx(struct snd_kcontrol *kcontrol,
++                        struct snd_ctl_elem_info *uinfo)
++{
++      struct soc_mixer_control *mc =
++              (struct soc_mixer_control *)kcontrol->private_value;
++
++      snd_soc_info_volsw(kcontrol, uinfo);
++      /* Max represents the number of levels in an SX control not the
++       * maximum value, so add the minimum value back on
++       */
++      uinfo->value.integer.max += mc->min;
++
++      return 0;
++}
++EXPORT_SYMBOL_GPL(snd_soc_info_volsw_sx);
++
++/**
+  * snd_soc_get_volsw - single mixer get callback
+  * @kcontrol: mixer control
+  * @ucontrol: control element information

Reply via email to