diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arc/include/asm/cache.h linux-libre-4.19.89-gnu/arch/arc/include/asm/cache.h
--- linux-libre-4.19.88-gnu/arch/arc/include/asm/cache.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arc/include/asm/cache.h	2019-12-13 02:52:59.000000000 -0500
@@ -124,7 +124,9 @@ extern unsigned long perip_base, perip_e
 
 /* IO coherency related Auxiliary registers */
 #define ARC_REG_IO_COH_ENABLE	0x500
+#define ARC_IO_COH_ENABLE_BIT	BIT(0)
 #define ARC_REG_IO_COH_PARTIAL	0x501
+#define ARC_IO_COH_PARTIAL_BIT	BIT(0)
 #define ARC_REG_IO_COH_AP0_BASE	0x508
 #define ARC_REG_IO_COH_AP0_SIZE	0x509
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arc/mm/cache.c linux-libre-4.19.89-gnu/arch/arc/mm/cache.c
--- linux-libre-4.19.88-gnu/arch/arc/mm/cache.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arc/mm/cache.c	2019-12-13 02:52:59.000000000 -0500
@@ -1145,6 +1145,20 @@ noinline void __init arc_ioc_setup(void)
 	unsigned int ioc_base, mem_sz;
 
 	/*
+	 * If IOC was already enabled (due to bootloader) it technically needs to
+	 * be reconfigured with aperture base,size corresponding to Linux memory map
+	 * which will certainly be different than uboot's. But disabling and
+	 * reenabling IOC when DMA might be potentially active is tricky business.
+	 * To avoid random memory issues later, just panic here and ask user to
+	 * upgrade bootloader to one which doesn't enable IOC
+	 */
+	if (read_aux_reg(ARC_REG_IO_COH_ENABLE) & ARC_IO_COH_ENABLE_BIT)
+		panic("IOC already enabled, please upgrade bootloader!\n");
+
+	if (!ioc_enable)
+		return;
+
+	/*
 	 * As for today we don't support both IOC and ZONE_HIGHMEM enabled
 	 * simultaneously. This happens because as of today IOC aperture covers
 	 * only ZONE_NORMAL (low mem) and any dma transactions outside this
@@ -1187,8 +1201,8 @@ noinline void __init arc_ioc_setup(void)
 		panic("IOC Aperture start must be aligned to the size of the aperture");
 
 	write_aux_reg(ARC_REG_IO_COH_AP0_BASE, ioc_base >> 12);
-	write_aux_reg(ARC_REG_IO_COH_PARTIAL, 1);
-	write_aux_reg(ARC_REG_IO_COH_ENABLE, 1);
+	write_aux_reg(ARC_REG_IO_COH_PARTIAL, ARC_IO_COH_PARTIAL_BIT);
+	write_aux_reg(ARC_REG_IO_COH_ENABLE, ARC_IO_COH_ENABLE_BIT);
 
 	/* Re-enable L1 dcache */
 	__dc_enable();
@@ -1265,7 +1279,7 @@ void __init arc_cache_init_master(void)
 	if (is_isa_arcv2() && l2_line_sz && !slc_enable)
 		arc_slc_disable();
 
-	if (is_isa_arcv2() && ioc_enable)
+	if (is_isa_arcv2() && ioc_exists)
 		arc_ioc_setup();
 
 	if (is_isa_arcv2() && l2_line_sz && slc_enable) {
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/boot/dts/am335x-pdu001.dts linux-libre-4.19.89-gnu/arch/arm/boot/dts/am335x-pdu001.dts
--- linux-libre-4.19.88-gnu/arch/arm/boot/dts/am335x-pdu001.dts	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/boot/dts/am335x-pdu001.dts	2019-12-13 02:52:59.000000000 -0500
@@ -577,7 +577,7 @@
 	bus-width = <4>;
 	pinctrl-names = "default";
 	pinctrl-0 = <&mmc2_pins>;
-	cd-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>;
+	cd-gpios = <&gpio2 2 GPIO_ACTIVE_HIGH>;
 };
 
 &sham {
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/boot/dts/arm-realview-pb1176.dts linux-libre-4.19.89-gnu/arch/arm/boot/dts/arm-realview-pb1176.dts
--- linux-libre-4.19.88-gnu/arch/arm/boot/dts/arm-realview-pb1176.dts	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/boot/dts/arm-realview-pb1176.dts	2019-12-13 02:52:59.000000000 -0500
@@ -45,7 +45,7 @@
 	};
 
 	/* The voltage to the MMC card is hardwired at 3.3V */
-	vmmc: fixedregulator@0 {
+	vmmc: regulator-vmmc {
 		compatible = "regulator-fixed";
 		regulator-name = "vmmc";
 		regulator-min-microvolt = <3300000>;
@@ -53,7 +53,7 @@
 		regulator-boot-on;
         };
 
-	veth: fixedregulator@0 {
+	veth: regulator-veth {
 		compatible = "regulator-fixed";
 		regulator-name = "veth";
 		regulator-min-microvolt = <3300000>;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/boot/dts/arm-realview-pb11mp.dts linux-libre-4.19.89-gnu/arch/arm/boot/dts/arm-realview-pb11mp.dts
--- linux-libre-4.19.88-gnu/arch/arm/boot/dts/arm-realview-pb11mp.dts	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/boot/dts/arm-realview-pb11mp.dts	2019-12-13 02:52:59.000000000 -0500
@@ -145,7 +145,7 @@
 	};
 
 	/* The voltage to the MMC card is hardwired at 3.3V */
-	vmmc: fixedregulator@0 {
+	vmmc: regulator-vmmc {
 		compatible = "regulator-fixed";
 		regulator-name = "vmmc";
 		regulator-min-microvolt = <3300000>;
@@ -153,7 +153,7 @@
 		regulator-boot-on;
         };
 
-	veth: fixedregulator@0 {
+	veth: regulator-veth {
 		compatible = "regulator-fixed";
 		regulator-name = "veth";
 		regulator-min-microvolt = <3300000>;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/boot/dts/arm-realview-pbx.dtsi linux-libre-4.19.89-gnu/arch/arm/boot/dts/arm-realview-pbx.dtsi
--- linux-libre-4.19.88-gnu/arch/arm/boot/dts/arm-realview-pbx.dtsi	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/boot/dts/arm-realview-pbx.dtsi	2019-12-13 02:52:59.000000000 -0500
@@ -44,7 +44,7 @@
 	};
 
 	/* The voltage to the MMC card is hardwired at 3.3V */
-	vmmc: fixedregulator@0 {
+	vmmc: regulator-vmmc {
 		compatible = "regulator-fixed";
 		regulator-name = "vmmc";
 		regulator-min-microvolt = <3300000>;
@@ -52,7 +52,7 @@
 		regulator-boot-on;
         };
 
-	veth: fixedregulator@0 {
+	veth: regulator-veth {
 		compatible = "regulator-fixed";
 		regulator-name = "veth";
 		regulator-min-microvolt = <3300000>;
@@ -567,4 +567,3 @@
 		};
 	};
 };
-
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/boot/dts/exynos3250.dtsi linux-libre-4.19.89-gnu/arch/arm/boot/dts/exynos3250.dtsi
--- linux-libre-4.19.88-gnu/arch/arm/boot/dts/exynos3250.dtsi	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/boot/dts/exynos3250.dtsi	2019-12-13 02:52:59.000000000 -0500
@@ -360,7 +360,7 @@
 		};
 
 		hsotg: hsotg@12480000 {
-			compatible = "snps,dwc2";
+			compatible = "samsung,s3c6400-hsotg", "snps,dwc2";
 			reg = <0x12480000 0x20000>;
 			interrupts = <GIC_SPI 141 IRQ_TYPE_LEVEL_HIGH>;
 			clocks = <&cmu CLK_USBOTG>;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/boot/dts/exynos5422-odroid-core.dtsi linux-libre-4.19.89-gnu/arch/arm/boot/dts/exynos5422-odroid-core.dtsi
--- linux-libre-4.19.88-gnu/arch/arm/boot/dts/exynos5422-odroid-core.dtsi	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/boot/dts/exynos5422-odroid-core.dtsi	2019-12-13 02:52:59.000000000 -0500
@@ -224,7 +224,7 @@
 
 			ldo13_reg: LDO13 {
 				regulator-name = "vddq_mmc2";
-				regulator-min-microvolt = <2800000>;
+				regulator-min-microvolt = <1800000>;
 				regulator-max-microvolt = <2800000>;
 			};
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6qdl-zii-rdu2.dtsi linux-libre-4.19.89-gnu/arch/arm/boot/dts/imx6qdl-zii-rdu2.dtsi
--- linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6qdl-zii-rdu2.dtsi	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/boot/dts/imx6qdl-zii-rdu2.dtsi	2019-12-13 02:52:59.000000000 -0500
@@ -609,13 +609,14 @@
 	};
 
 	touchscreen@2a {
-		compatible = "eeti,egalax_ts";
+		compatible = "eeti,exc3000";
 		pinctrl-names = "default";
 		pinctrl-0 = <&pinctrl_ts>;
 		reg = <0x2a>;
 		interrupt-parent = <&gpio1>;
 		interrupts = <8 IRQ_TYPE_LEVEL_LOW>;
-		wakeup-gpios = <&gpio1 8 GPIO_ACTIVE_LOW>;
+		touchscreen-inverted-x;
+		touchscreen-swapped-x-y;
 		status = "disabled";
 	};
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/boot/dts/mmp2.dtsi linux-libre-4.19.89-gnu/arch/arm/boot/dts/mmp2.dtsi
--- linux-libre-4.19.88-gnu/arch/arm/boot/dts/mmp2.dtsi	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/boot/dts/mmp2.dtsi	2019-12-13 02:52:59.000000000 -0500
@@ -180,7 +180,7 @@
 				clocks = <&soc_clocks MMP2_CLK_GPIO>;
 				resets = <&soc_clocks MMP2_CLK_GPIO>;
 				interrupt-controller;
-				#interrupt-cells = <1>;
+				#interrupt-cells = <2>;
 				ranges;
 
 				gcb0: gpio@d4019000 {
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/boot/dts/pxa27x.dtsi linux-libre-4.19.89-gnu/arch/arm/boot/dts/pxa27x.dtsi
--- linux-libre-4.19.88-gnu/arch/arm/boot/dts/pxa27x.dtsi	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/boot/dts/pxa27x.dtsi	2019-12-13 02:52:59.000000000 -0500
@@ -35,7 +35,7 @@
 			clocks = <&clks CLK_NONE>;
 		};
 
-		pxa27x_ohci: usb@4c000000 {
+		usb0: usb@4c000000 {
 			compatible = "marvell,pxa-ohci";
 			reg = <0x4c000000 0x10000>;
 			interrupts = <3>;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/boot/dts/pxa2xx.dtsi linux-libre-4.19.89-gnu/arch/arm/boot/dts/pxa2xx.dtsi
--- linux-libre-4.19.88-gnu/arch/arm/boot/dts/pxa2xx.dtsi	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/boot/dts/pxa2xx.dtsi	2019-12-13 02:52:59.000000000 -0500
@@ -117,13 +117,6 @@
 			status = "disabled";
 		};
 
-		usb0: ohci@4c000000 {
-			compatible = "marvell,pxa-ohci";
-			reg = <0x4c000000 0x10000>;
-			interrupts = <3>;
-			status = "disabled";
-		};
-
 		mmc0: mmc@41100000 {
 			compatible = "marvell,pxa-mmc";
 			reg = <0x41100000 0x1000>;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/boot/dts/pxa3xx.dtsi linux-libre-4.19.89-gnu/arch/arm/boot/dts/pxa3xx.dtsi
--- linux-libre-4.19.88-gnu/arch/arm/boot/dts/pxa3xx.dtsi	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/boot/dts/pxa3xx.dtsi	2019-12-13 02:52:59.000000000 -0500
@@ -204,7 +204,7 @@
 			status = "disabled";
 		};
 
-		pxa3xx_ohci: usb@4c000000 {
+		usb0: usb@4c000000 {
 			compatible = "marvell,pxa-ohci";
 			reg = <0x4c000000 0x10000>;
 			interrupts = <3>;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/boot/dts/r8a7790-lager.dts linux-libre-4.19.89-gnu/arch/arm/boot/dts/r8a7790-lager.dts
--- linux-libre-4.19.88-gnu/arch/arm/boot/dts/r8a7790-lager.dts	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/boot/dts/r8a7790-lager.dts	2019-12-13 02:52:59.000000000 -0500
@@ -489,8 +489,6 @@
 };
 
 &lvds1 {
-	status = "okay";
-
 	ports {
 		port@1 {
 			lvds_connector: endpoint {
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/boot/dts/r8a7791-koelsch.dts linux-libre-4.19.89-gnu/arch/arm/boot/dts/r8a7791-koelsch.dts
--- linux-libre-4.19.88-gnu/arch/arm/boot/dts/r8a7791-koelsch.dts	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/boot/dts/r8a7791-koelsch.dts	2019-12-13 02:52:59.000000000 -0500
@@ -479,8 +479,6 @@
 };
 
 &lvds0 {
-	status = "okay";
-
 	ports {
 		port@1 {
 			lvds_connector: endpoint {
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/boot/dts/r8a7791-porter.dts linux-libre-4.19.89-gnu/arch/arm/boot/dts/r8a7791-porter.dts
--- linux-libre-4.19.88-gnu/arch/arm/boot/dts/r8a7791-porter.dts	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/boot/dts/r8a7791-porter.dts	2019-12-13 02:52:59.000000000 -0500
@@ -482,8 +482,6 @@
 };
 
 &lvds0 {
-	status = "okay";
-
 	ports {
 		port@1 {
 			lvds_connector: endpoint {
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/boot/dts/rk3288-rock2-som.dtsi linux-libre-4.19.89-gnu/arch/arm/boot/dts/rk3288-rock2-som.dtsi
--- linux-libre-4.19.88-gnu/arch/arm/boot/dts/rk3288-rock2-som.dtsi	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/boot/dts/rk3288-rock2-som.dtsi	2019-12-13 02:52:59.000000000 -0500
@@ -25,7 +25,7 @@
 
 	vcc_flash: flash-regulator {
 		compatible = "regulator-fixed";
-		regulator-name = "vcc_sys";
+		regulator-name = "vcc_flash";
 		regulator-min-microvolt = <1800000>;
 		regulator-max-microvolt = <1800000>;
 		startup-delay-us = <150>;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/boot/dts/rv1108.dtsi linux-libre-4.19.89-gnu/arch/arm/boot/dts/rv1108.dtsi
--- linux-libre-4.19.88-gnu/arch/arm/boot/dts/rv1108.dtsi	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/boot/dts/rv1108.dtsi	2019-12-13 02:52:59.000000000 -0500
@@ -66,7 +66,7 @@
 
 	arm-pmu {
 		compatible = "arm,cortex-a7-pmu";
-		interrupts = <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
+		interrupts = <GIC_SPI 76 IRQ_TYPE_LEVEL_HIGH>;
 	};
 
 	timer {
@@ -541,7 +541,7 @@
 			compatible = "rockchip,gpio-bank";
 			reg = <0x20030000 0x100>;
 			interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
-			clocks = <&xin24m>;
+			clocks = <&cru PCLK_GPIO0_PMU>;
 
 			gpio-controller;
 			#gpio-cells = <2>;
@@ -554,7 +554,7 @@
 			compatible = "rockchip,gpio-bank";
 			reg = <0x10310000 0x100>;
 			interrupts = <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
-			clocks = <&xin24m>;
+			clocks = <&cru PCLK_GPIO1>;
 
 			gpio-controller;
 			#gpio-cells = <2>;
@@ -567,7 +567,7 @@
 			compatible = "rockchip,gpio-bank";
 			reg = <0x10320000 0x100>;
 			interrupts = <GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>;
-			clocks = <&xin24m>;
+			clocks = <&cru PCLK_GPIO2>;
 
 			gpio-controller;
 			#gpio-cells = <2>;
@@ -580,7 +580,7 @@
 			compatible = "rockchip,gpio-bank";
 			reg = <0x10330000 0x100>;
 			interrupts = <GIC_SPI 43 IRQ_TYPE_LEVEL_HIGH>;
-			clocks = <&xin24m>;
+			clocks = <&cru PCLK_GPIO3>;
 
 			gpio-controller;
 			#gpio-cells = <2>;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/boot/dts/sun4i-a10.dtsi linux-libre-4.19.89-gnu/arch/arm/boot/dts/sun4i-a10.dtsi
--- linux-libre-4.19.88-gnu/arch/arm/boot/dts/sun4i-a10.dtsi	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/boot/dts/sun4i-a10.dtsi	2019-12-13 02:52:59.000000000 -0500
@@ -530,8 +530,6 @@
 				};
 
 				hdmi_out: port@1 {
-					#address-cells = <1>;
-					#size-cells = <0>;
 					reg = <1>;
 				};
 			};
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/boot/dts/sun4i-a10-inet9f-rev03.dts linux-libre-4.19.89-gnu/arch/arm/boot/dts/sun4i-a10-inet9f-rev03.dts
--- linux-libre-4.19.88-gnu/arch/arm/boot/dts/sun4i-a10-inet9f-rev03.dts	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/boot/dts/sun4i-a10-inet9f-rev03.dts	2019-12-13 02:52:59.000000000 -0500
@@ -63,8 +63,6 @@
 		compatible = "gpio-keys-polled";
 		pinctrl-names = "default";
 		pinctrl-0 = <&key_pins_inet9f>;
-		#address-cells = <1>;
-		#size-cells = <0>;
 		poll-interval = <20>;
 
 		left-joystick-left {
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/boot/dts/sun4i-a10-pcduino.dts linux-libre-4.19.89-gnu/arch/arm/boot/dts/sun4i-a10-pcduino.dts
--- linux-libre-4.19.88-gnu/arch/arm/boot/dts/sun4i-a10-pcduino.dts	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/boot/dts/sun4i-a10-pcduino.dts	2019-12-13 02:52:59.000000000 -0500
@@ -76,8 +76,6 @@
 
 	gpio-keys {
 		compatible = "gpio-keys";
-		#address-cells = <1>;
-		#size-cells = <0>;
 
 		back {
 			label = "Key Back";
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/boot/dts/sun5i-a10s.dtsi linux-libre-4.19.89-gnu/arch/arm/boot/dts/sun5i-a10s.dtsi
--- linux-libre-4.19.88-gnu/arch/arm/boot/dts/sun5i-a10s.dtsi	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/boot/dts/sun5i-a10s.dtsi	2019-12-13 02:52:59.000000000 -0500
@@ -104,8 +104,6 @@
 				};
 
 				hdmi_out: port@1 {
-					#address-cells = <1>;
-					#size-cells = <0>;
 					reg = <1>;
 				};
 			};
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/boot/dts/sun6i-a31.dtsi linux-libre-4.19.89-gnu/arch/arm/boot/dts/sun6i-a31.dtsi
--- linux-libre-4.19.88-gnu/arch/arm/boot/dts/sun6i-a31.dtsi	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/boot/dts/sun6i-a31.dtsi	2019-12-13 02:52:59.000000000 -0500
@@ -201,7 +201,7 @@
 	};
 
 	pmu {
-		compatible = "arm,cortex-a7-pmu", "arm,cortex-a15-pmu";
+		compatible = "arm,cortex-a7-pmu";
 		interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>,
 			     <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>,
 			     <GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>,
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/boot/dts/sun7i-a20.dtsi linux-libre-4.19.89-gnu/arch/arm/boot/dts/sun7i-a20.dtsi
--- linux-libre-4.19.88-gnu/arch/arm/boot/dts/sun7i-a20.dtsi	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/boot/dts/sun7i-a20.dtsi	2019-12-13 02:52:59.000000000 -0500
@@ -183,7 +183,7 @@
 	};
 
 	pmu {
-		compatible = "arm,cortex-a7-pmu", "arm,cortex-a15-pmu";
+		compatible = "arm,cortex-a7-pmu";
 		interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>,
 			     <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>;
 	};
@@ -639,8 +639,6 @@
 				};
 
 				hdmi_out: port@1 {
-					#address-cells = <1>;
-					#size-cells = <0>;
 					reg = <1>;
 				};
 			};
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/boot/dts/sun8i-h3.dtsi linux-libre-4.19.89-gnu/arch/arm/boot/dts/sun8i-h3.dtsi
--- linux-libre-4.19.88-gnu/arch/arm/boot/dts/sun8i-h3.dtsi	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/boot/dts/sun8i-h3.dtsi	2019-12-13 02:52:59.000000000 -0500
@@ -47,19 +47,19 @@
 		compatible = "operating-points-v2";
 		opp-shared;
 
-		opp@648000000 {
+		opp-648000000 {
 			opp-hz = /bits/ 64 <648000000>;
 			opp-microvolt = <1040000 1040000 1300000>;
 			clock-latency-ns = <244144>; /* 8 32k periods */
 		};
 
-		opp@816000000 {
+		opp-816000000 {
 			opp-hz = /bits/ 64 <816000000>;
 			opp-microvolt = <1100000 1100000 1300000>;
 			clock-latency-ns = <244144>; /* 8 32k periods */
 		};
 
-		opp@1008000000 {
+		opp-1008000000 {
 			opp-hz = /bits/ 64 <1008000000>;
 			opp-microvolt = <1200000 1200000 1300000>;
 			clock-latency-ns = <244144>; /* 8 32k periods */
@@ -122,7 +122,7 @@
 	soc {
 		system-control@1c00000 {
 			compatible = "allwinner,sun8i-h3-system-control";
-			reg = <0x01c00000 0x30>;
+			reg = <0x01c00000 0x1000>;
 			#address-cells = <1>;
 			#size-cells = <1>;
 			ranges;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/boot/dts/sun8i-r16-bananapi-m2m.dts linux-libre-4.19.89-gnu/arch/arm/boot/dts/sun8i-r16-bananapi-m2m.dts
--- linux-libre-4.19.88-gnu/arch/arm/boot/dts/sun8i-r16-bananapi-m2m.dts	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/boot/dts/sun8i-r16-bananapi-m2m.dts	2019-12-13 02:52:59.000000000 -0500
@@ -103,13 +103,13 @@
 };
 
 &cpu0_opp_table {
-	opp@1104000000 {
+	opp-1104000000 {
 		opp-hz = /bits/ 64 <1104000000>;
 		opp-microvolt = <1320000>;
 		clock-latency-ns = <244144>; /* 8 32k periods */
 	};
 
-	opp@1200000000 {
+	opp-1200000000 {
 		opp-hz = /bits/ 64 <1200000000>;
 		opp-microvolt = <1320000>;
 		clock-latency-ns = <244144>; /* 8 32k periods */
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/boot/dts/sun8i-v3s.dtsi linux-libre-4.19.89-gnu/arch/arm/boot/dts/sun8i-v3s.dtsi
--- linux-libre-4.19.88-gnu/arch/arm/boot/dts/sun8i-v3s.dtsi	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/boot/dts/sun8i-v3s.dtsi	2019-12-13 02:52:59.000000000 -0500
@@ -292,17 +292,17 @@
 			interrupt-controller;
 			#interrupt-cells = <3>;
 
-			i2c0_pins: i2c0 {
+			i2c0_pins: i2c0-pins {
 				pins = "PB6", "PB7";
 				function = "i2c0";
 			};
 
-			uart0_pins_a: uart0@0 {
+			uart0_pb_pins: uart0-pb-pins {
 				pins = "PB8", "PB9";
 				function = "uart0";
 			};
 
-			mmc0_pins_a: mmc0@0 {
+			mmc0_pins: mmc0-pins {
 				pins = "PF0", "PF1", "PF2", "PF3",
 				       "PF4", "PF5";
 				function = "mmc0";
@@ -310,7 +310,7 @@
 				bias-pull-up;
 			};
 
-			mmc1_pins: mmc1 {
+			mmc1_pins: mmc1-pins {
 				pins = "PG0", "PG1", "PG2", "PG3",
 				       "PG4", "PG5";
 				function = "mmc1";
@@ -318,7 +318,7 @@
 				bias-pull-up;
 			};
 
-			spi0_pins: spi0 {
+			spi0_pins: spi0-pins {
 				pins = "PC0", "PC1", "PC2", "PC3";
 				function = "spi0";
 			};
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/boot/dts/sun8i-v3s-licheepi-zero.dts linux-libre-4.19.89-gnu/arch/arm/boot/dts/sun8i-v3s-licheepi-zero.dts
--- linux-libre-4.19.88-gnu/arch/arm/boot/dts/sun8i-v3s-licheepi-zero.dts	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/boot/dts/sun8i-v3s-licheepi-zero.dts	2019-12-13 02:52:59.000000000 -0500
@@ -78,7 +78,7 @@
 };
 
 &mmc0 {
-	pinctrl-0 = <&mmc0_pins_a>;
+	pinctrl-0 = <&mmc0_pins>;
 	pinctrl-names = "default";
 	broken-cd;
 	bus-width = <4>;
@@ -87,7 +87,7 @@
 };
 
 &uart0 {
-	pinctrl-0 = <&uart0_pins_a>;
+	pinctrl-0 = <&uart0_pb_pins>;
 	pinctrl-names = "default";
 	status = "okay";
 };
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/include/asm/uaccess.h linux-libre-4.19.89-gnu/arch/arm/include/asm/uaccess.h
--- linux-libre-4.19.88-gnu/arch/arm/include/asm/uaccess.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/include/asm/uaccess.h	2019-12-13 02:52:59.000000000 -0500
@@ -349,6 +349,13 @@ do {									\
 #define __get_user_asm_byte(x, addr, err)			\
 	__get_user_asm(x, addr, err, ldrb)
 
+#if __LINUX_ARM_ARCH__ >= 6
+
+#define __get_user_asm_half(x, addr, err)			\
+	__get_user_asm(x, addr, err, ldrh)
+
+#else
+
 #ifndef __ARMEB__
 #define __get_user_asm_half(x, __gu_addr, err)			\
 ({								\
@@ -367,6 +374,8 @@ do {									\
 })
 #endif
 
+#endif /* __LINUX_ARM_ARCH__ >= 6 */
+
 #define __get_user_asm_word(x, addr, err)			\
 	__get_user_asm(x, addr, err, ldr)
 #endif
@@ -442,6 +451,13 @@ do {									\
 #define __put_user_asm_byte(x, __pu_addr, err)			\
 	__put_user_asm(x, __pu_addr, err, strb)
 
+#if __LINUX_ARM_ARCH__ >= 6
+
+#define __put_user_asm_half(x, __pu_addr, err)			\
+	__put_user_asm(x, __pu_addr, err, strh)
+
+#else
+
 #ifndef __ARMEB__
 #define __put_user_asm_half(x, __pu_addr, err)			\
 ({								\
@@ -458,6 +474,8 @@ do {									\
 })
 #endif
 
+#endif /* __LINUX_ARM_ARCH__ >= 6 */
+
 #define __put_user_asm_word(x, __pu_addr, err)			\
 	__put_user_asm(x, __pu_addr, err, str)
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/Kconfig.debug linux-libre-4.19.89-gnu/arch/arm/Kconfig.debug
--- linux-libre-4.19.88-gnu/arch/arm/Kconfig.debug	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/Kconfig.debug	2019-12-13 02:52:59.000000000 -0500
@@ -1079,14 +1079,21 @@ choice
 		  Say Y here if you want kernel low-level debugging support
 		  on SOCFPGA(Cyclone 5 and Arria 5) based platforms.
 
-	config DEBUG_SOCFPGA_UART1
+	config DEBUG_SOCFPGA_ARRIA10_UART1
 		depends on ARCH_SOCFPGA
-		bool "Use SOCFPGA UART1 for low-level debug"
+		bool "Use SOCFPGA Arria10 UART1 for low-level debug"
 		select DEBUG_UART_8250
 		help
 		  Say Y here if you want kernel low-level debugging support
 		  on SOCFPGA(Arria 10) based platforms.
 
+	config DEBUG_SOCFPGA_CYCLONE5_UART1
+		depends on ARCH_SOCFPGA
+		bool "Use SOCFPGA Cyclone 5 UART1 for low-level debug"
+		select DEBUG_UART_8250
+		help
+		  Say Y here if you want kernel low-level debugging support
+		  on SOCFPGA(Cyclone 5 and Arria 5) based platforms.
 
 	config DEBUG_SUN9I_UART0
 		bool "Kernel low-level debugging messages via sun9i UART0"
@@ -1647,7 +1654,8 @@ config DEBUG_UART_PHYS
 	default 0xfe800000 if ARCH_IOP32X
 	default 0xff690000 if DEBUG_RK32_UART2
 	default 0xffc02000 if DEBUG_SOCFPGA_UART0
-	default 0xffc02100 if DEBUG_SOCFPGA_UART1
+	default 0xffc02100 if DEBUG_SOCFPGA_ARRIA10_UART1
+	default 0xffc03000 if DEBUG_SOCFPGA_CYCLONE5_UART1
 	default 0xffd82340 if ARCH_IOP13XX
 	default 0xffe40000 if DEBUG_RCAR_GEN1_SCIF0
 	default 0xffe42000 if DEBUG_RCAR_GEN1_SCIF2
@@ -1754,7 +1762,8 @@ config DEBUG_UART_VIRT
 	default 0xfeb30c00 if DEBUG_KEYSTONE_UART0
 	default 0xfeb31000 if DEBUG_KEYSTONE_UART1
 	default 0xfec02000 if DEBUG_SOCFPGA_UART0
-	default 0xfec02100 if DEBUG_SOCFPGA_UART1
+	default 0xfec02100 if DEBUG_SOCFPGA_ARRIA10_UART1
+	default 0xfec03000 if DEBUG_SOCFPGA_CYCLONE5_UART1
 	default 0xfec12000 if (DEBUG_MVEBU_UART0 || DEBUG_MVEBU_UART0_ALTERNATE) && ARCH_MVEBU
 	default 0xfec12100 if DEBUG_MVEBU_UART1_ALTERNATE
 	default 0xfec10000 if DEBUG_SIRFATLAS7_UART0
@@ -1803,9 +1812,9 @@ config DEBUG_UART_8250_WORD
 	depends on DEBUG_LL_UART_8250 || DEBUG_UART_8250
 	depends on DEBUG_UART_8250_SHIFT >= 2
 	default y if DEBUG_PICOXCELL_UART || \
-		DEBUG_SOCFPGA_UART0 || DEBUG_SOCFPGA_UART1 || \
-		DEBUG_KEYSTONE_UART0 || DEBUG_KEYSTONE_UART1 || \
-		DEBUG_ALPINE_UART0 || \
+		DEBUG_SOCFPGA_UART0 || DEBUG_SOCFPGA_ARRIA10_UART1 || \
+		DEBUG_SOCFPGA_CYCLONE5_UART1 || DEBUG_KEYSTONE_UART0 || \
+		DEBUG_KEYSTONE_UART1 || DEBUG_ALPINE_UART0 || \
 		DEBUG_DAVINCI_DMx_UART0 || DEBUG_DAVINCI_DA8XX_UART1 || \
 		DEBUG_DAVINCI_DA8XX_UART2 || DEBUG_BCM_IPROC_UART3 || \
 		DEBUG_BCM_KONA_UART || DEBUG_RK32_UART2
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/lib/getuser.S linux-libre-4.19.89-gnu/arch/arm/lib/getuser.S
--- linux-libre-4.19.88-gnu/arch/arm/lib/getuser.S	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/lib/getuser.S	2019-12-13 02:52:59.000000000 -0500
@@ -42,6 +42,12 @@ _ASM_NOKPROBE(__get_user_1)
 
 ENTRY(__get_user_2)
 	check_uaccess r0, 2, r1, r2, __get_user_bad
+#if __LINUX_ARM_ARCH__ >= 6
+
+2: TUSER(ldrh)	r2, [r0]
+
+#else
+
 #ifdef CONFIG_CPU_USE_DOMAINS
 rb	.req	ip
 2:	ldrbt	r2, [r0], #1
@@ -56,6 +62,9 @@ rb	.req	r0
 #else
 	orr	r2, rb, r2, lsl #8
 #endif
+
+#endif /* __LINUX_ARM_ARCH__ >= 6 */
+
 	mov	r0, #0
 	ret	lr
 ENDPROC(__get_user_2)
@@ -145,7 +154,9 @@ _ASM_NOKPROBE(__get_user_bad8)
 .pushsection __ex_table, "a"
 	.long	1b, __get_user_bad
 	.long	2b, __get_user_bad
+#if __LINUX_ARM_ARCH__ < 6
 	.long	3b, __get_user_bad
+#endif
 	.long	4b, __get_user_bad
 	.long	5b, __get_user_bad8
 	.long	6b, __get_user_bad8
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/lib/putuser.S linux-libre-4.19.89-gnu/arch/arm/lib/putuser.S
--- linux-libre-4.19.88-gnu/arch/arm/lib/putuser.S	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/lib/putuser.S	2019-12-13 02:52:59.000000000 -0500
@@ -41,16 +41,13 @@ ENDPROC(__put_user_1)
 
 ENTRY(__put_user_2)
 	check_uaccess r0, 2, r1, ip, __put_user_bad
-	mov	ip, r2, lsr #8
-#ifdef CONFIG_THUMB2_KERNEL
-#ifndef __ARMEB__
-2: TUSER(strb)	r2, [r0]
-3: TUSER(strb)	ip, [r0, #1]
+#if __LINUX_ARM_ARCH__ >= 6
+
+2: TUSER(strh)	r2, [r0]
+
 #else
-2: TUSER(strb)	ip, [r0]
-3: TUSER(strb)	r2, [r0, #1]
-#endif
-#else	/* !CONFIG_THUMB2_KERNEL */
+
+	mov	ip, r2, lsr #8
 #ifndef __ARMEB__
 2: TUSER(strb)	r2, [r0], #1
 3: TUSER(strb)	ip, [r0]
@@ -58,7 +55,8 @@ ENTRY(__put_user_2)
 2: TUSER(strb)	ip, [r0], #1
 3: TUSER(strb)	r2, [r0]
 #endif
-#endif	/* CONFIG_THUMB2_KERNEL */
+
+#endif /* __LINUX_ARM_ARCH__ >= 6 */
 	mov	r0, #0
 	ret	lr
 ENDPROC(__put_user_2)
@@ -91,7 +89,9 @@ ENDPROC(__put_user_bad)
 .pushsection __ex_table, "a"
 	.long	1b, __put_user_bad
 	.long	2b, __put_user_bad
+#if __LINUX_ARM_ARCH__ < 6
 	.long	3b, __put_user_bad
+#endif
 	.long	4b, __put_user_bad
 	.long	5b, __put_user_bad
 	.long	6b, __put_user_bad
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/mach-omap1/id.c linux-libre-4.19.89-gnu/arch/arm/mach-omap1/id.c
--- linux-libre-4.19.88-gnu/arch/arm/mach-omap1/id.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/mach-omap1/id.c	2019-12-13 02:52:59.000000000 -0500
@@ -200,10 +200,10 @@ void __init omap_check_revision(void)
 		printk(KERN_INFO "Unknown OMAP cpu type: 0x%02x\n", cpu_type);
 	}
 
-	printk(KERN_INFO "OMAP%04x", omap_revision >> 16);
+	pr_info("OMAP%04x", omap_revision >> 16);
 	if ((omap_revision >> 8) & 0xff)
-		printk(KERN_INFO "%x", (omap_revision >> 8) & 0xff);
-	printk(KERN_INFO " revision %i handled as %02xxx id: %08x%08x\n",
+		pr_cont("%x", (omap_revision >> 8) & 0xff);
+	pr_cont(" revision %i handled as %02xxx id: %08x%08x\n",
 	       die_rev, omap_revision & 0xff, system_serial_low,
 	       system_serial_high);
 }
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm/mach-omap2/id.c linux-libre-4.19.89-gnu/arch/arm/mach-omap2/id.c
--- linux-libre-4.19.88-gnu/arch/arm/mach-omap2/id.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm/mach-omap2/id.c	2019-12-13 02:52:59.000000000 -0500
@@ -199,8 +199,8 @@ void __init omap2xxx_check_revision(void
 
 	pr_info("%s", soc_name);
 	if ((omap_rev() >> 8) & 0x0f)
-		pr_info("%s", soc_rev);
-	pr_info("\n");
+		pr_cont("%s", soc_rev);
+	pr_cont("\n");
 }
 
 #define OMAP3_SHOW_FEATURE(feat)		\
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts linux-libre-4.19.89-gnu/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts
--- linux-libre-4.19.88-gnu/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm64/boot/dts/amlogic/meson-gxbb-nanopi-k2.dts	2019-12-13 02:52:59.000000000 -0500
@@ -191,7 +191,7 @@
 	pinctrl-names = "default";
 };
 
-&pinctrl_aobus {
+&gpio_ao {
 	gpio-line-names = "UART TX", "UART RX", "Power Control", "Power Key In",
 			  "VCCK En", "CON1 Header Pin31",
 			  "I2S Header Pin6", "IR In", "I2S Header Pin7",
@@ -201,7 +201,7 @@
 			  "";
 };
 
-&pinctrl_periphs {
+&gpio {
 	gpio-line-names = /* Bank GPIOZ */
 			  "Eth MDIO", "Eth MDC", "Eth RGMII RX Clk",
 			  "Eth RX DV", "Eth RX D0", "Eth RX D1", "Eth RX D2",
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts linux-libre-4.19.89-gnu/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts
--- linux-libre-4.19.88-gnu/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts	2019-12-13 02:52:59.000000000 -0500
@@ -187,7 +187,7 @@
 	pinctrl-names = "default";
 };
 
-&pinctrl_aobus {
+&gpio_ao {
 	gpio-line-names = "UART TX", "UART RX", "VCCK En", "TF 3V3/1V8 En",
 			  "USB HUB nRESET", "USB OTG Power En",
 			  "J7 Header Pin2", "IR In", "J7 Header Pin4",
@@ -197,7 +197,7 @@
 			  "";
 };
 
-&pinctrl_periphs {
+&gpio {
 	gpio-line-names = /* Bank GPIOZ */
 			  "Eth MDIO", "Eth MDC", "Eth RGMII RX Clk",
 			  "Eth RX DV", "Eth RX D0", "Eth RX D1", "Eth RX D2",
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts linux-libre-4.19.89-gnu/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts
--- linux-libre-4.19.88-gnu/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts	2019-12-13 02:52:59.000000000 -0500
@@ -112,7 +112,7 @@
 	linux,rc-map-name = "rc-geekbox";
 };
 
-&pinctrl_aobus {
+&gpio_ao {
 	gpio-line-names = "UART TX",
 			  "UART RX",
 			  "Power Key In",
@@ -127,7 +127,7 @@
 			  "";
 };
 
-&pinctrl_periphs {
+&gpio {
 	gpio-line-names = /* Bank GPIOZ */
 			  "", "", "", "", "", "", "",
 			  "", "", "", "", "", "", "",
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc.dts linux-libre-4.19.89-gnu/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc.dts
--- linux-libre-4.19.88-gnu/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc.dts	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc.dts	2019-12-13 02:52:59.000000000 -0500
@@ -163,7 +163,7 @@
 	};
 };
 
-&pinctrl_aobus {
+&gpio_ao {
 	gpio-line-names = "UART TX",
 			  "UART RX",
 			  "Blue LED",
@@ -178,7 +178,7 @@
 			  "7J1 Header Pin15";
 };
 
-&pinctrl_periphs {
+&gpio {
 	gpio-line-names = /* Bank GPIOZ */
 			  "", "", "", "", "", "", "",
 			  "", "", "", "", "", "", "",
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm64/boot/dts/exynos/exynos5433.dtsi linux-libre-4.19.89-gnu/arch/arm64/boot/dts/exynos/exynos5433.dtsi
--- linux-libre-4.19.88-gnu/arch/arm64/boot/dts/exynos/exynos5433.dtsi	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm64/boot/dts/exynos/exynos5433.dtsi	2019-12-13 02:52:59.000000000 -0500
@@ -18,8 +18,8 @@
 
 / {
 	compatible = "samsung,exynos5433";
-	#address-cells = <1>;
-	#size-cells = <1>;
+	#address-cells = <2>;
+	#size-cells = <2>;
 
 	interrupt-parent = <&gic>;
 
@@ -235,7 +235,7 @@
 		compatible = "simple-bus";
 		#address-cells = <1>;
 		#size-cells = <1>;
-		ranges;
+		ranges = <0x0 0x0 0x0 0x18000000>;
 
 		arm_a53_pmu {
 			compatible = "arm,cortex-a53-pmu", "arm,armv8-pmuv3";
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm64/boot/dts/exynos/exynos7.dtsi linux-libre-4.19.89-gnu/arch/arm64/boot/dts/exynos/exynos7.dtsi
--- linux-libre-4.19.88-gnu/arch/arm64/boot/dts/exynos/exynos7.dtsi	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm64/boot/dts/exynos/exynos7.dtsi	2019-12-13 02:52:59.000000000 -0500
@@ -12,8 +12,8 @@
 / {
 	compatible = "samsung,exynos7";
 	interrupt-parent = <&gic>;
-	#address-cells = <1>;
-	#size-cells = <1>;
+	#address-cells = <2>;
+	#size-cells = <2>;
 
 	aliases {
 		pinctrl0 = &pinctrl_alive;
@@ -70,7 +70,7 @@
 		compatible = "simple-bus";
 		#address-cells = <1>;
 		#size-cells = <1>;
-		ranges;
+		ranges = <0 0 0 0x18000000>;
 
 		chipid@10000000 {
 			compatible = "samsung,exynos4210-chipid";
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm64/boot/dts/nvidia/tegra210-p2597.dtsi linux-libre-4.19.89-gnu/arch/arm64/boot/dts/nvidia/tegra210-p2597.dtsi
--- linux-libre-4.19.88-gnu/arch/arm64/boot/dts/nvidia/tegra210-p2597.dtsi	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm64/boot/dts/nvidia/tegra210-p2597.dtsi	2019-12-13 02:52:59.000000000 -0500
@@ -1589,7 +1589,7 @@
 			regulator-name = "VDD_HDMI_5V0";
 			regulator-min-microvolt = <5000000>;
 			regulator-max-microvolt = <5000000>;
-			gpio = <&exp1 12 GPIO_ACTIVE_LOW>;
+			gpio = <&exp1 12 GPIO_ACTIVE_HIGH>;
 			enable-active-high;
 			vin-supply = <&vdd_5v0_sys>;
 		};
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm64/boot/dts/xilinx/zynqmp-clk.dtsi linux-libre-4.19.89-gnu/arch/arm64/boot/dts/xilinx/zynqmp-clk.dtsi
--- linux-libre-4.19.88-gnu/arch/arm64/boot/dts/xilinx/zynqmp-clk.dtsi	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm64/boot/dts/xilinx/zynqmp-clk.dtsi	2019-12-13 02:52:59.000000000 -0500
@@ -58,13 +58,13 @@
 		clock-accuracy = <100>;
 	};
 
-	dpdma_clk: dpdma_clk {
+	dpdma_clk: dpdma-clk {
 		compatible = "fixed-clock";
 		#clock-cells = <0x0>;
 		clock-frequency = <533000000>;
 	};
 
-	drm_clock: drm_clock {
+	drm_clock: drm-clock {
 		compatible = "fixed-clock";
 		#clock-cells = <0x0>;
 		clock-frequency = <262750000>;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm64/boot/dts/xilinx/zynqmp.dtsi linux-libre-4.19.89-gnu/arch/arm64/boot/dts/xilinx/zynqmp.dtsi
--- linux-libre-4.19.88-gnu/arch/arm64/boot/dts/xilinx/zynqmp.dtsi	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm64/boot/dts/xilinx/zynqmp.dtsi	2019-12-13 02:52:59.000000000 -0500
@@ -71,7 +71,7 @@
 		};
 	};
 
-	cpu_opp_table: cpu_opp_table {
+	cpu_opp_table: cpu-opp-table {
 		compatible = "operating-points-v2";
 		opp-shared;
 		opp00 {
@@ -124,7 +124,7 @@
 			     <1 10 0xf08>;
 	};
 
-	amba_apu: amba_apu@0 {
+	amba_apu: amba-apu@0 {
 		compatible = "simple-bus";
 		#address-cells = <2>;
 		#size-cells = <1>;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm64/boot/dts/xilinx/zynqmp-zcu100-revC.dts linux-libre-4.19.89-gnu/arch/arm64/boot/dts/xilinx/zynqmp-zcu100-revC.dts
--- linux-libre-4.19.88-gnu/arch/arm64/boot/dts/xilinx/zynqmp-zcu100-revC.dts	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm64/boot/dts/xilinx/zynqmp-zcu100-revC.dts	2019-12-13 02:52:59.000000000 -0500
@@ -82,7 +82,7 @@
 			linux,default-trigger = "bluetooth-power";
 		};
 
-		vbus_det { /* U5 USB5744 VBUS detection via MIO25 */
+		vbus-det { /* U5 USB5744 VBUS detection via MIO25 */
 			label = "vbus_det";
 			gpios = <&gpio 25 GPIO_ACTIVE_HIGH>;
 			default-state = "on";
@@ -98,7 +98,7 @@
 		regulator-boot-on;
 	};
 
-	sdio_pwrseq: sdio_pwrseq {
+	sdio_pwrseq: sdio-pwrseq {
 		compatible = "mmc-pwrseq-simple";
 		reset-gpios = <&gpio 7 GPIO_ACTIVE_LOW>; /* WIFI_EN */
 		post-power-on-delay-ms = <10>;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm64/boot/dts/xilinx/zynqmp-zcu102-revA.dts linux-libre-4.19.89-gnu/arch/arm64/boot/dts/xilinx/zynqmp-zcu102-revA.dts
--- linux-libre-4.19.88-gnu/arch/arm64/boot/dts/xilinx/zynqmp-zcu102-revA.dts	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm64/boot/dts/xilinx/zynqmp-zcu102-revA.dts	2019-12-13 02:52:59.000000000 -0500
@@ -53,7 +53,7 @@
 
 	leds {
 		compatible = "gpio-leds";
-		heartbeat_led {
+		heartbeat-led {
 			label = "heartbeat";
 			gpios = <&gpio 23 GPIO_ACTIVE_HIGH>;
 			linux,default-trigger = "heartbeat";
@@ -139,25 +139,25 @@
 		 * 7, 10 - 17 - not connected
 		 */
 
-		gtr_sel0 {
+		gtr-sel0 {
 			gpio-hog;
 			gpios = <0 0>;
 			output-low; /* PCIE = 0, DP = 1 */
 			line-name = "sel0";
 		};
-		gtr_sel1 {
+		gtr-sel1 {
 			gpio-hog;
 			gpios = <1 0>;
 			output-high; /* PCIE = 0, DP = 1 */
 			line-name = "sel1";
 		};
-		gtr_sel2 {
+		gtr-sel2 {
 			gpio-hog;
 			gpios = <2 0>;
 			output-high; /* PCIE = 0, USB0 = 1 */
 			line-name = "sel2";
 		};
-		gtr_sel3 {
+		gtr-sel3 {
 			gpio-hog;
 			gpios = <3 0>;
 			output-high; /* PCIE = 0, SATA = 1 */
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm64/boot/dts/xilinx/zynqmp-zcu106-revA.dts linux-libre-4.19.89-gnu/arch/arm64/boot/dts/xilinx/zynqmp-zcu106-revA.dts
--- linux-libre-4.19.88-gnu/arch/arm64/boot/dts/xilinx/zynqmp-zcu106-revA.dts	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm64/boot/dts/xilinx/zynqmp-zcu106-revA.dts	2019-12-13 02:52:59.000000000 -0500
@@ -53,7 +53,7 @@
 
 	leds {
 		compatible = "gpio-leds";
-		heartbeat_led {
+		heartbeat-led {
 			label = "heartbeat";
 			gpios = <&gpio 23 GPIO_ACTIVE_HIGH>;
 			linux,default-trigger = "heartbeat";
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/arm64/boot/dts/xilinx/zynqmp-zcu111-revA.dts linux-libre-4.19.89-gnu/arch/arm64/boot/dts/xilinx/zynqmp-zcu111-revA.dts
--- linux-libre-4.19.88-gnu/arch/arm64/boot/dts/xilinx/zynqmp-zcu111-revA.dts	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/arm64/boot/dts/xilinx/zynqmp-zcu111-revA.dts	2019-12-13 02:52:59.000000000 -0500
@@ -53,7 +53,7 @@
 
 	leds {
 		compatible = "gpio-leds";
-		heartbeat_led {
+		heartbeat-led {
 			label = "heartbeat";
 			gpios = <&gpio 23 GPIO_ACTIVE_HIGH>;
 			linux,default-trigger = "heartbeat";
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/mips/cavium-octeon/executive/cvmx-cmd-queue.c linux-libre-4.19.89-gnu/arch/mips/cavium-octeon/executive/cvmx-cmd-queue.c
--- linux-libre-4.19.88-gnu/arch/mips/cavium-octeon/executive/cvmx-cmd-queue.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/mips/cavium-octeon/executive/cvmx-cmd-queue.c	2019-12-13 02:52:59.000000000 -0500
@@ -266,7 +266,7 @@ int cvmx_cmd_queue_length(cvmx_cmd_queue
 		} else {
 			union cvmx_pko_mem_debug8 debug8;
 			debug8.u64 = cvmx_read_csr(CVMX_PKO_MEM_DEBUG8);
-			return debug8.cn58xx.doorbell;
+			return debug8.cn50xx.doorbell;
 		}
 	case CVMX_CMD_QUEUE_ZIP:
 	case CVMX_CMD_QUEUE_DFA:
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/mips/cavium-octeon/octeon-platform.c linux-libre-4.19.89-gnu/arch/mips/cavium-octeon/octeon-platform.c
--- linux-libre-4.19.88-gnu/arch/mips/cavium-octeon/octeon-platform.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/mips/cavium-octeon/octeon-platform.c	2019-12-13 02:52:59.000000000 -0500
@@ -501,7 +501,7 @@ static void __init octeon_fdt_set_phy(in
 	if (phy_addr >= 256 && alt_phy > 0) {
 		const struct fdt_property *phy_prop;
 		struct fdt_property *alt_prop;
-		u32 phy_handle_name;
+		fdt32_t phy_handle_name;
 
 		/* Use the alt phy node instead.*/
 		phy_prop = fdt_get_property(initial_boot_params, eth, "phy-handle", NULL);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/mips/include/asm/octeon/cvmx-pko.h linux-libre-4.19.89-gnu/arch/mips/include/asm/octeon/cvmx-pko.h
--- linux-libre-4.19.88-gnu/arch/mips/include/asm/octeon/cvmx-pko.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/mips/include/asm/octeon/cvmx-pko.h	2019-12-13 02:52:59.000000000 -0500
@@ -611,7 +611,7 @@ static inline void cvmx_pko_get_port_sta
 		pko_reg_read_idx.s.index = cvmx_pko_get_base_queue(port_num);
 		cvmx_write_csr(CVMX_PKO_REG_READ_IDX, pko_reg_read_idx.u64);
 		debug8.u64 = cvmx_read_csr(CVMX_PKO_MEM_DEBUG8);
-		status->doorbell = debug8.cn58xx.doorbell;
+		status->doorbell = debug8.cn50xx.doorbell;
 	}
 }
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/mips/Kconfig linux-libre-4.19.89-gnu/arch/mips/Kconfig
--- linux-libre-4.19.88-gnu/arch/mips/Kconfig	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/mips/Kconfig	2019-12-13 02:52:59.000000000 -0500
@@ -806,6 +806,7 @@ config SIBYTE_LITTLESUR
 	select SYS_SUPPORTS_BIG_ENDIAN
 	select SYS_SUPPORTS_HIGHMEM
 	select SYS_SUPPORTS_LITTLE_ENDIAN
+	select ZONE_DMA32 if 64BIT
 
 config SIBYTE_SENTOSA
 	bool "Sibyte BCM91250E-Sentosa"
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/nds32/kernel/setup.c linux-libre-4.19.89-gnu/arch/nds32/kernel/setup.c
--- linux-libre-4.19.88-gnu/arch/nds32/kernel/setup.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/nds32/kernel/setup.c	2019-12-13 02:52:59.000000000 -0500
@@ -71,8 +71,9 @@ static const char *hwcap_str[] = {
 	"div",
 	"mac",
 	"l2c",
-	"dx_regs",
+	"fpu_dp",
 	"v2",
+	"dx_regs",
 	NULL,
 };
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/powerpc/include/asm/sfp-machine.h linux-libre-4.19.89-gnu/arch/powerpc/include/asm/sfp-machine.h
--- linux-libre-4.19.88-gnu/arch/powerpc/include/asm/sfp-machine.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/powerpc/include/asm/sfp-machine.h	2019-12-13 02:52:59.000000000 -0500
@@ -213,30 +213,18 @@
  * respectively.  The result is placed in HIGH_SUM and LOW_SUM.  Overflow
  * (i.e. carry out) is not stored anywhere, and is lost.
  */
-#define add_ssaaaa(sh, sl, ah, al, bh, bl)				\
+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
   do {									\
     if (__builtin_constant_p (bh) && (bh) == 0)				\
-      __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2"		\
-	     : "=r" ((USItype)(sh)),					\
-	       "=&r" ((USItype)(sl))					\
-	     : "%r" ((USItype)(ah)),					\
-	       "%r" ((USItype)(al)),					\
-	       "rI" ((USItype)(bl)));					\
-    else if (__builtin_constant_p (bh) && (bh) ==~(USItype) 0)		\
-      __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2"		\
-	     : "=r" ((USItype)(sh)),					\
-	       "=&r" ((USItype)(sl))					\
-	     : "%r" ((USItype)(ah)),					\
-	       "%r" ((USItype)(al)),					\
-	       "rI" ((USItype)(bl)));					\
+      __asm__ ("add%I4c %1,%3,%4\n\taddze %0,%2"		\
+	     : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\
+    else if (__builtin_constant_p (bh) && (bh) == ~(USItype) 0)		\
+      __asm__ ("add%I4c %1,%3,%4\n\taddme %0,%2"		\
+	     : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\
     else								\
-      __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3"		\
-	     : "=r" ((USItype)(sh)),					\
-	       "=&r" ((USItype)(sl))					\
-	     : "%r" ((USItype)(ah)),					\
-	       "r" ((USItype)(bh)),					\
-	       "%r" ((USItype)(al)),					\
-	       "rI" ((USItype)(bl)));					\
+      __asm__ ("add%I5c %1,%4,%5\n\tadde %0,%2,%3"		\
+	     : "=r" (sh), "=&r" (sl)					\
+	     : "%r" (ah), "r" (bh), "%r" (al), "rI" (bl));		\
   } while (0)
 
 /* sub_ddmmss is used in op-2.h and udivmodti4.c and should be equivalent to
@@ -248,44 +236,24 @@
  * and LOW_DIFFERENCE.  Overflow (i.e. carry out) is not stored anywhere,
  * and is lost.
  */
-#define sub_ddmmss(sh, sl, ah, al, bh, bl)				\
+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
   do {									\
     if (__builtin_constant_p (ah) && (ah) == 0)				\
-      __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfze|subfze} %0,%2"	\
-	       : "=r" ((USItype)(sh)),					\
-		 "=&r" ((USItype)(sl))					\
-	       : "r" ((USItype)(bh)),					\
-		 "rI" ((USItype)(al)),					\
-		 "r" ((USItype)(bl)));					\
-    else if (__builtin_constant_p (ah) && (ah) ==~(USItype) 0)		\
-      __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfme|subfme} %0,%2"	\
-	       : "=r" ((USItype)(sh)),					\
-		 "=&r" ((USItype)(sl))					\
-	       : "r" ((USItype)(bh)),					\
-		 "rI" ((USItype)(al)),					\
-		 "r" ((USItype)(bl)));					\
+      __asm__ ("subf%I3c %1,%4,%3\n\tsubfze %0,%2"	\
+	       : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\
+    else if (__builtin_constant_p (ah) && (ah) == ~(USItype) 0)		\
+      __asm__ ("subf%I3c %1,%4,%3\n\tsubfme %0,%2"	\
+	       : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\
     else if (__builtin_constant_p (bh) && (bh) == 0)			\
-      __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{ame|addme} %0,%2"		\
-	       : "=r" ((USItype)(sh)),					\
-		 "=&r" ((USItype)(sl))					\
-	       : "r" ((USItype)(ah)),					\
-		 "rI" ((USItype)(al)),					\
-		 "r" ((USItype)(bl)));					\
-    else if (__builtin_constant_p (bh) && (bh) ==~(USItype) 0)		\
-      __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{aze|addze} %0,%2"		\
-	       : "=r" ((USItype)(sh)),					\
-		 "=&r" ((USItype)(sl))					\
-	       : "r" ((USItype)(ah)),					\
-		 "rI" ((USItype)(al)),					\
-		 "r" ((USItype)(bl)));					\
+      __asm__ ("subf%I3c %1,%4,%3\n\taddme %0,%2"		\
+	       : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\
+    else if (__builtin_constant_p (bh) && (bh) == ~(USItype) 0)		\
+      __asm__ ("subf%I3c %1,%4,%3\n\taddze %0,%2"		\
+	       : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\
     else								\
-      __asm__ ("{sf%I4|subf%I4c} %1,%5,%4\n\t{sfe|subfe} %0,%3,%2"	\
-	       : "=r" ((USItype)(sh)),					\
-		 "=&r" ((USItype)(sl))					\
-	       : "r" ((USItype)(ah)),					\
-		 "r" ((USItype)(bh)),					\
-		 "rI" ((USItype)(al)),					\
-		 "r" ((USItype)(bl)));					\
+      __asm__ ("subf%I4c %1,%5,%4\n\tsubfe %0,%3,%2"	\
+	       : "=r" (sh), "=&r" (sl)					\
+	       : "r" (ah), "r" (bh), "rI" (al), "r" (bl));		\
   } while (0)
 
 /* asm fragments for mul and div */
@@ -294,13 +262,10 @@
  * UWtype integers MULTIPLER and MULTIPLICAND, and generates a two UWtype
  * word product in HIGH_PROD and LOW_PROD.
  */
-#define umul_ppmm(ph, pl, m0, m1)					\
+#define umul_ppmm(ph, pl, m0, m1) \
   do {									\
     USItype __m0 = (m0), __m1 = (m1);					\
-    __asm__ ("mulhwu %0,%1,%2"						\
-	     : "=r" ((USItype)(ph))					\
-	     : "%r" (__m0),						\
-               "r" (__m1));						\
+    __asm__ ("mulhwu %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1));	\
     (pl) = __m0 * __m1;							\
   } while (0)
 
@@ -312,9 +277,10 @@
  * significant bit of DENOMINATOR must be 1, then the pre-processor symbol
  * UDIV_NEEDS_NORMALIZATION is defined to 1.
  */
-#define udiv_qrnnd(q, r, n1, n0, d)					\
+#define udiv_qrnnd(q, r, n1, n0, d) \
   do {									\
-    UWtype __d1, __d0, __q1, __q0, __r1, __r0, __m;			\
+    UWtype __d1, __d0, __q1, __q0;					\
+    UWtype __r1, __r0, __m;						\
     __d1 = __ll_highpart (d);						\
     __d0 = __ll_lowpart (d);						\
 									\
@@ -325,7 +291,7 @@
     if (__r1 < __m)							\
       {									\
 	__q1--, __r1 += (d);						\
-	if (__r1 >= (d)) /* we didn't get carry when adding to __r1 */	\
+	if (__r1 >= (d)) /* i.e. we didn't get carry when adding to __r1 */\
 	  if (__r1 < __m)						\
 	    __q1--, __r1 += (d);					\
       }									\
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/sparc/include/asm/io_64.h linux-libre-4.19.89-gnu/arch/sparc/include/asm/io_64.h
--- linux-libre-4.19.88-gnu/arch/sparc/include/asm/io_64.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/sparc/include/asm/io_64.h	2019-12-13 02:52:59.000000000 -0500
@@ -409,6 +409,7 @@ static inline void __iomem *ioremap(unsi
 }
 
 #define ioremap_nocache(X,Y)		ioremap((X),(Y))
+#define ioremap_uc(X,Y)			ioremap((X),(Y))
 #define ioremap_wc(X,Y)			ioremap((X),(Y))
 #define ioremap_wt(X,Y)			ioremap((X),(Y))
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/sparc/net/bpf_jit_comp_64.c linux-libre-4.19.89-gnu/arch/sparc/net/bpf_jit_comp_64.c
--- linux-libre-4.19.88-gnu/arch/sparc/net/bpf_jit_comp_64.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/sparc/net/bpf_jit_comp_64.c	2019-12-13 02:52:59.000000000 -0500
@@ -1270,6 +1270,9 @@ static int build_insn(const struct bpf_i
 		const u8 tmp2 = bpf2sparc[TMP_REG_2];
 		u32 opcode = 0, rs2;
 
+		if (insn->dst_reg == BPF_REG_FP)
+			ctx->saw_frame_pointer = true;
+
 		ctx->tmp_2_used = true;
 		emit_loadimm(imm, tmp2, ctx);
 
@@ -1308,6 +1311,9 @@ static int build_insn(const struct bpf_i
 		const u8 tmp = bpf2sparc[TMP_REG_1];
 		u32 opcode = 0, rs2;
 
+		if (insn->dst_reg == BPF_REG_FP)
+			ctx->saw_frame_pointer = true;
+
 		switch (BPF_SIZE(code)) {
 		case BPF_W:
 			opcode = ST32;
@@ -1340,6 +1346,9 @@ static int build_insn(const struct bpf_i
 		const u8 tmp2 = bpf2sparc[TMP_REG_2];
 		const u8 tmp3 = bpf2sparc[TMP_REG_3];
 
+		if (insn->dst_reg == BPF_REG_FP)
+			ctx->saw_frame_pointer = true;
+
 		ctx->tmp_1_used = true;
 		ctx->tmp_2_used = true;
 		ctx->tmp_3_used = true;
@@ -1360,6 +1369,9 @@ static int build_insn(const struct bpf_i
 		const u8 tmp2 = bpf2sparc[TMP_REG_2];
 		const u8 tmp3 = bpf2sparc[TMP_REG_3];
 
+		if (insn->dst_reg == BPF_REG_FP)
+			ctx->saw_frame_pointer = true;
+
 		ctx->tmp_1_used = true;
 		ctx->tmp_2_used = true;
 		ctx->tmp_3_used = true;
@@ -1425,12 +1437,12 @@ struct bpf_prog *bpf_int_jit_compile(str
 	struct bpf_prog *tmp, *orig_prog = prog;
 	struct sparc64_jit_data *jit_data;
 	struct bpf_binary_header *header;
+	u32 prev_image_size, image_size;
 	bool tmp_blinded = false;
 	bool extra_pass = false;
 	struct jit_ctx ctx;
-	u32 image_size;
 	u8 *image_ptr;
-	int pass;
+	int pass, i;
 
 	if (!prog->jit_requested)
 		return orig_prog;
@@ -1461,61 +1473,82 @@ struct bpf_prog *bpf_int_jit_compile(str
 		header = jit_data->header;
 		extra_pass = true;
 		image_size = sizeof(u32) * ctx.idx;
+		prev_image_size = image_size;
+		pass = 1;
 		goto skip_init_ctx;
 	}
 
 	memset(&ctx, 0, sizeof(ctx));
 	ctx.prog = prog;
 
-	ctx.offset = kcalloc(prog->len, sizeof(unsigned int), GFP_KERNEL);
+	ctx.offset = kmalloc_array(prog->len, sizeof(unsigned int), GFP_KERNEL);
 	if (ctx.offset == NULL) {
 		prog = orig_prog;
 		goto out_off;
 	}
 
-	/* Fake pass to detect features used, and get an accurate assessment
-	 * of what the final image size will be.
+	/* Longest sequence emitted is for bswap32, 12 instructions.  Pre-cook
+	 * the offset array so that we converge faster.
 	 */
-	if (build_body(&ctx)) {
-		prog = orig_prog;
-		goto out_off;
-	}
-	build_prologue(&ctx);
-	build_epilogue(&ctx);
-
-	/* Now we know the actual image size. */
-	image_size = sizeof(u32) * ctx.idx;
-	header = bpf_jit_binary_alloc(image_size, &image_ptr,
-				      sizeof(u32), jit_fill_hole);
-	if (header == NULL) {
-		prog = orig_prog;
-		goto out_off;
-	}
+	for (i = 0; i < prog->len; i++)
+		ctx.offset[i] = i * (12 * 4);
 
-	ctx.image = (u32 *)image_ptr;
-skip_init_ctx:
-	for (pass = 1; pass < 3; pass++) {
+	prev_image_size = ~0U;
+	for (pass = 1; pass < 40; pass++) {
 		ctx.idx = 0;
 
 		build_prologue(&ctx);
-
 		if (build_body(&ctx)) {
-			bpf_jit_binary_free(header);
 			prog = orig_prog;
 			goto out_off;
 		}
-
 		build_epilogue(&ctx);
 
 		if (bpf_jit_enable > 1)
-			pr_info("Pass %d: shrink = %d, seen = [%c%c%c%c%c%c]\n", pass,
-				image_size - (ctx.idx * 4),
+			pr_info("Pass %d: size = %u, seen = [%c%c%c%c%c%c]\n", pass,
+				ctx.idx * 4,
 				ctx.tmp_1_used ? '1' : ' ',
 				ctx.tmp_2_used ? '2' : ' ',
 				ctx.tmp_3_used ? '3' : ' ',
 				ctx.saw_frame_pointer ? 'F' : ' ',
 				ctx.saw_call ? 'C' : ' ',
 				ctx.saw_tail_call ? 'T' : ' ');
+
+		if (ctx.idx * 4 == prev_image_size)
+			break;
+		prev_image_size = ctx.idx * 4;
+		cond_resched();
+	}
+
+	/* Now we know the actual image size. */
+	image_size = sizeof(u32) * ctx.idx;
+	header = bpf_jit_binary_alloc(image_size, &image_ptr,
+				      sizeof(u32), jit_fill_hole);
+	if (header == NULL) {
+		prog = orig_prog;
+		goto out_off;
+	}
+
+	ctx.image = (u32 *)image_ptr;
+skip_init_ctx:
+	ctx.idx = 0;
+
+	build_prologue(&ctx);
+
+	if (build_body(&ctx)) {
+		bpf_jit_binary_free(header);
+		prog = orig_prog;
+		goto out_off;
+	}
+
+	build_epilogue(&ctx);
+
+	if (ctx.idx * 4 != prev_image_size) {
+		pr_err("bpf_jit: Failed to converge, prev_size=%u size=%d\n",
+		       prev_image_size, ctx.idx * 4);
+		bpf_jit_binary_free(header);
+		prog = orig_prog;
+		goto out_off;
 	}
 
 	if (bpf_jit_enable > 1)
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/x86/kvm/cpuid.c linux-libre-4.19.89-gnu/arch/x86/kvm/cpuid.c
--- linux-libre-4.19.88-gnu/arch/x86/kvm/cpuid.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/x86/kvm/cpuid.c	2019-12-13 02:52:59.000000000 -0500
@@ -420,7 +420,7 @@ static inline int __do_cpuid_ent(struct
 
 	r = -E2BIG;
 
-	if (*nent >= maxnent)
+	if (WARN_ON(*nent >= maxnent))
 		goto out;
 
 	do_cpuid_1_ent(entry, function, index);
@@ -729,6 +729,9 @@ out:
 static int do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 func,
 			u32 idx, int *nent, int maxnent, unsigned int type)
 {
+	if (*nent >= maxnent)
+		return -E2BIG;
+
 	if (type == KVM_GET_EMULATED_CPUID)
 		return __do_cpuid_ent_emulated(entry, func, idx, nent, maxnent);
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/x86/kvm/x86.c linux-libre-4.19.89-gnu/arch/x86/kvm/x86.c
--- linux-libre-4.19.88-gnu/arch/x86/kvm/x86.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/x86/kvm/x86.c	2019-12-13 02:52:59.000000000 -0500
@@ -290,13 +290,14 @@ int kvm_set_shared_msr(unsigned slot, u6
 	struct kvm_shared_msrs *smsr = per_cpu_ptr(shared_msrs, cpu);
 	int err;
 
-	if (((value ^ smsr->values[slot].curr) & mask) == 0)
+	value = (value & mask) | (smsr->values[slot].host & ~mask);
+	if (value == smsr->values[slot].curr)
 		return 0;
-	smsr->values[slot].curr = value;
 	err = wrmsrl_safe(shared_msrs_global.msrs[slot], value);
 	if (err)
 		return 1;
 
+	smsr->values[slot].curr = value;
 	if (!smsr->registered) {
 		smsr->urn.on_user_return = kvm_on_user_return;
 		user_return_notifier_register(&smsr->urn);
@@ -1173,10 +1174,15 @@ u64 kvm_get_arch_capabilities(void)
 	 * If TSX is disabled on the system, guests are also mitigated against
 	 * TAA and clear CPU buffer mitigation is not required for guests.
 	 */
-	if (boot_cpu_has_bug(X86_BUG_TAA) && boot_cpu_has(X86_FEATURE_RTM) &&
-	    (data & ARCH_CAP_TSX_CTRL_MSR))
+	if (!boot_cpu_has(X86_FEATURE_RTM))
+		data &= ~ARCH_CAP_TAA_NO;
+	else if (!boot_cpu_has_bug(X86_BUG_TAA))
+		data |= ARCH_CAP_TAA_NO;
+	else if (data & ARCH_CAP_TSX_CTRL_MSR)
 		data &= ~ARCH_CAP_MDS_NO;
 
+	/* KVM does not emulate MSR_IA32_TSX_CTRL.  */
+	data &= ~ARCH_CAP_TSX_CTRL_MSR;
 	return data;
 }
 
@@ -4111,6 +4117,7 @@ long kvm_arch_vcpu_ioctl(struct file *fi
 	case KVM_SET_NESTED_STATE: {
 		struct kvm_nested_state __user *user_kvm_nested_state = argp;
 		struct kvm_nested_state kvm_state;
+		int idx;
 
 		r = -EINVAL;
 		if (!kvm_x86_ops->set_nested_state)
@@ -4132,7 +4139,9 @@ long kvm_arch_vcpu_ioctl(struct file *fi
 		if (kvm_state.flags == KVM_STATE_NESTED_RUN_PENDING)
 			break;
 
+		idx = srcu_read_lock(&vcpu->kvm->srcu);
 		r = kvm_x86_ops->set_nested_state(vcpu, user_kvm_nested_state, &kvm_state);
+		srcu_read_unlock(&vcpu->kvm->srcu, idx);
 		break;
 	}
 	default:
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/x86/mm/fault.c linux-libre-4.19.89-gnu/arch/x86/mm/fault.c
--- linux-libre-4.19.88-gnu/arch/x86/mm/fault.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/x86/mm/fault.c	2019-12-13 02:52:59.000000000 -0500
@@ -281,7 +281,7 @@ void vmalloc_sync_all(void)
 		return;
 
 	for (address = VMALLOC_START & PMD_MASK;
-	     address >= TASK_SIZE_MAX && address < FIXADDR_TOP;
+	     address >= TASK_SIZE_MAX && address < VMALLOC_END;
 	     address += PMD_SIZE) {
 		struct page *page;
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/arch/x86/pci/fixup.c linux-libre-4.19.89-gnu/arch/x86/pci/fixup.c
--- linux-libre-4.19.88-gnu/arch/x86/pci/fixup.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/arch/x86/pci/fixup.c	2019-12-13 02:52:59.000000000 -0500
@@ -589,6 +589,17 @@ static void pci_fixup_amd_ehci_pme(struc
 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, 0x7808, pci_fixup_amd_ehci_pme);
 
 /*
+ * Device [1022:7914]
+ * When in D0, PME# doesn't get asserted when plugging USB 2.0 device.
+ */
+static void pci_fixup_amd_fch_xhci_pme(struct pci_dev *dev)
+{
+	dev_info(&dev->dev, "PME# does not work under D0, disabling it\n");
+	dev->pme_support &= ~(PCI_PM_CAP_PME_D0 >> PCI_PM_CAP_PME_SHIFT);
+}
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, 0x7914, pci_fixup_amd_fch_xhci_pme);
+
+/*
  * Apple MacBook Pro: Avoid [mem 0x7fa00000-0x7fbfffff]
  *
  * Using the [mem 0x7fa00000-0x7fbfffff] region, e.g., by assigning it to
diff -druNp --no-dereference linux-libre-4.19.88-gnu/crypto/af_alg.c linux-libre-4.19.89-gnu/crypto/af_alg.c
--- linux-libre-4.19.88-gnu/crypto/af_alg.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/crypto/af_alg.c	2019-12-13 02:52:59.000000000 -0500
@@ -1058,7 +1058,7 @@ void af_alg_async_cb(struct crypto_async
 	af_alg_free_resources(areq);
 	sock_put(sk);
 
-	iocb->ki_complete(iocb, err ? err : resultlen, 0);
+	iocb->ki_complete(iocb, err ? err : (int)resultlen, 0);
 }
 EXPORT_SYMBOL_GPL(af_alg_async_cb);
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/crypto/crypto_user.c linux-libre-4.19.89-gnu/crypto/crypto_user.c
--- linux-libre-4.19.88-gnu/crypto/crypto_user.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/crypto/crypto_user.c	2019-12-13 02:52:59.000000000 -0500
@@ -288,8 +288,10 @@ static int crypto_report(struct sk_buff
 drop_alg:
 	crypto_mod_put(alg);
 
-	if (err)
+	if (err) {
+		kfree_skb(skb);
 		return err;
+	}
 
 	return nlmsg_unicast(crypto_nlsk, skb, NETLINK_CB(in_skb).portid);
 }
diff -druNp --no-dereference linux-libre-4.19.88-gnu/crypto/ecc.c linux-libre-4.19.89-gnu/crypto/ecc.c
--- linux-libre-4.19.88-gnu/crypto/ecc.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/crypto/ecc.c	2019-12-13 02:52:59.000000000 -0500
@@ -906,36 +906,50 @@ static void ecc_point_mult(struct ecc_po
 static inline void ecc_swap_digits(const u64 *in, u64 *out,
 				   unsigned int ndigits)
 {
+	const __be64 *src = (__force __be64 *)in;
 	int i;
 
 	for (i = 0; i < ndigits; i++)
-		out[i] = __swab64(in[ndigits - 1 - i]);
+		out[i] = be64_to_cpu(src[ndigits - 1 - i]);
 }
 
-int ecc_is_key_valid(unsigned int curve_id, unsigned int ndigits,
-		     const u64 *private_key, unsigned int private_key_len)
+static int __ecc_is_key_valid(const struct ecc_curve *curve,
+			      const u64 *private_key, unsigned int ndigits)
 {
-	int nbytes;
-	const struct ecc_curve *curve = ecc_get_curve(curve_id);
+	u64 one[ECC_MAX_DIGITS] = { 1, };
+	u64 res[ECC_MAX_DIGITS];
 
 	if (!private_key)
 		return -EINVAL;
 
-	nbytes = ndigits << ECC_DIGITS_TO_BYTES_SHIFT;
-
-	if (private_key_len != nbytes)
+	if (curve->g.ndigits != ndigits)
 		return -EINVAL;
 
-	if (vli_is_zero(private_key, ndigits))
+	/* Make sure the private key is in the range [2, n-3]. */
+	if (vli_cmp(one, private_key, ndigits) != -1)
 		return -EINVAL;
-
-	/* Make sure the private key is in the range [1, n-1]. */
-	if (vli_cmp(curve->n, private_key, ndigits) != 1)
+	vli_sub(res, curve->n, one, ndigits);
+	vli_sub(res, res, one, ndigits);
+	if (vli_cmp(res, private_key, ndigits) != 1)
 		return -EINVAL;
 
 	return 0;
 }
 
+int ecc_is_key_valid(unsigned int curve_id, unsigned int ndigits,
+		     const u64 *private_key, unsigned int private_key_len)
+{
+	int nbytes;
+	const struct ecc_curve *curve = ecc_get_curve(curve_id);
+
+	nbytes = ndigits << ECC_DIGITS_TO_BYTES_SHIFT;
+
+	if (private_key_len != nbytes)
+		return -EINVAL;
+
+	return __ecc_is_key_valid(curve, private_key, ndigits);
+}
+
 /*
  * ECC private keys are generated using the method of extra random bits,
  * equivalent to that described in FIPS 186-4, Appendix B.4.1.
@@ -979,11 +993,8 @@ int ecc_gen_privkey(unsigned int curve_i
 	if (err)
 		return err;
 
-	if (vli_is_zero(priv, ndigits))
-		return -EINVAL;
-
-	/* Make sure the private key is in the range [1, n-1]. */
-	if (vli_cmp(curve->n, priv, ndigits) != 1)
+	/* Make sure the private key is in the valid range. */
+	if (__ecc_is_key_valid(curve, priv, ndigits))
 		return -EINVAL;
 
 	ecc_swap_digits(priv, privkey, ndigits);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/Documentation/devicetree/bindings/rtc/abracon,abx80x.txt linux-libre-4.19.89-gnu/Documentation/devicetree/bindings/rtc/abracon,abx80x.txt
--- linux-libre-4.19.88-gnu/Documentation/devicetree/bindings/rtc/abracon,abx80x.txt	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/Documentation/devicetree/bindings/rtc/abracon,abx80x.txt	2019-12-13 02:52:59.000000000 -0500
@@ -27,4 +27,4 @@ and valid to enable charging:
 
  - "abracon,tc-diode": should be "standard" (0.6V) or "schottky" (0.3V)
  - "abracon,tc-resistor": should be <0>, <3>, <6> or <11>. 0 disables the output
-                          resistor, the other values are in ohm.
+                          resistor, the other values are in kOhm.
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/android/binder_alloc.c linux-libre-4.19.89-gnu/drivers/android/binder_alloc.c
--- linux-libre-4.19.88-gnu/drivers/android/binder_alloc.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/android/binder_alloc.c	2019-12-13 02:52:59.000000000 -0500
@@ -295,8 +295,7 @@ static int binder_update_page_range(stru
 	return 0;
 
 free_range:
-	for (page_addr = end - PAGE_SIZE; page_addr >= start;
-	     page_addr -= PAGE_SIZE) {
+	for (page_addr = end - PAGE_SIZE; 1; page_addr -= PAGE_SIZE) {
 		bool ret;
 		size_t index;
 
@@ -309,6 +308,8 @@ free_range:
 		WARN_ON(!ret);
 
 		trace_binder_free_lru_end(alloc, index);
+		if (page_addr == start)
+			break;
 		continue;
 
 err_vm_insert_page_failed:
@@ -318,7 +319,8 @@ err_map_kernel_failed:
 		page->page_ptr = NULL;
 err_alloc_page_failed:
 err_page_ptr_cleared:
-		;
+		if (page_addr == start)
+			break;
 	}
 err_no_vma:
 	if (mm) {
@@ -880,14 +882,20 @@ void binder_alloc_print_pages(struct seq
 	int free = 0;
 
 	mutex_lock(&alloc->mutex);
-	for (i = 0; i < alloc->buffer_size / PAGE_SIZE; i++) {
-		page = &alloc->pages[i];
-		if (!page->page_ptr)
-			free++;
-		else if (list_empty(&page->lru))
-			active++;
-		else
-			lru++;
+	/*
+	 * Make sure the binder_alloc is fully initialized, otherwise we might
+	 * read inconsistent state.
+	 */
+	if (binder_alloc_get_vma(alloc) != NULL) {
+		for (i = 0; i < alloc->buffer_size / PAGE_SIZE; i++) {
+			page = &alloc->pages[i];
+			if (!page->page_ptr)
+				free++;
+			else if (list_empty(&page->lru))
+				active++;
+			else
+				lru++;
+		}
 	}
 	mutex_unlock(&alloc->mutex);
 	seq_printf(m, "  pages: %d:%d:%d\n", active, lru, free);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/block/rsxx/core.c linux-libre-4.19.89-gnu/drivers/block/rsxx/core.c
--- linux-libre-4.19.88-gnu/drivers/block/rsxx/core.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/block/rsxx/core.c	2019-12-13 02:52:59.000000000 -0500
@@ -1014,8 +1014,10 @@ static void rsxx_pci_remove(struct pci_d
 
 	cancel_work_sync(&card->event_work);
 
+	destroy_workqueue(card->event_wq);
 	rsxx_destroy_dev(card);
 	rsxx_dma_destroy(card);
+	destroy_workqueue(card->creg_ctrl.creg_wq);
 
 	spin_lock_irqsave(&card->irq_lock, flags);
 	rsxx_disable_ier_and_isr(card, CR_INTR_ALL);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/bus/ti-sysc.c linux-libre-4.19.89-gnu/drivers/bus/ti-sysc.c
--- linux-libre-4.19.88-gnu/drivers/bus/ti-sysc.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/bus/ti-sysc.c	2019-12-13 02:52:59.000000000 -0500
@@ -217,8 +217,13 @@ static int sysc_get_clocks(struct sysc *
 	if (!ddata->clocks)
 		return -ENOMEM;
 
-	for (i = 0; i < ddata->nr_clocks; i++) {
-		error = sysc_get_one_clock(ddata, ddata->clock_roles[i]);
+	for (i = 0; i < SYSC_MAX_CLOCKS; i++) {
+		const char *name = ddata->clock_roles[i];
+
+		if (!name)
+			continue;
+
+		error = sysc_get_one_clock(ddata, name);
 		if (error && error != -ENOENT)
 			return error;
 	}
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/char/lp.c linux-libre-4.19.89-gnu/drivers/char/lp.c
--- linux-libre-4.19.88-gnu/drivers/char/lp.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/char/lp.c	2019-12-13 02:52:59.000000000 -0500
@@ -708,6 +708,10 @@ static int lp_set_timeout64(unsigned int
 	if (copy_from_user(karg, arg, sizeof(karg)))
 		return -EFAULT;
 
+	/* sparc64 suseconds_t is 32-bit only */
+	if (IS_ENABLED(CONFIG_SPARC64) && !in_compat_syscall())
+		karg[1] >>= 32;
+
 	return lp_set_timeout(minor, karg[0], karg[1]);
 }
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/clk/mediatek/clk-cpumux.c linux-libre-4.19.89-gnu/drivers/clk/mediatek/clk-cpumux.c
--- linux-libre-4.19.88-gnu/drivers/clk/mediatek/clk-cpumux.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/clk/mediatek/clk-cpumux.c	2019-12-13 02:52:59.000000000 -0500
@@ -53,7 +53,7 @@ static const struct clk_ops clk_cpumux_o
 	.set_parent = clk_cpumux_set_parent,
 };
 
-static struct clk __init *
+static struct clk *
 mtk_clk_register_cpumux(const struct mtk_composite *mux,
 			struct regmap *regmap)
 {
@@ -84,9 +84,9 @@ mtk_clk_register_cpumux(const struct mtk
 	return clk;
 }
 
-int __init mtk_clk_register_cpumuxes(struct device_node *node,
-				     const struct mtk_composite *clks, int num,
-				     struct clk_onecell_data *clk_data)
+int mtk_clk_register_cpumuxes(struct device_node *node,
+			      const struct mtk_composite *clks, int num,
+			      struct clk_onecell_data *clk_data)
 {
 	int i;
 	struct clk *clk;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/clk/mediatek/clk-mt7622.c linux-libre-4.19.89-gnu/drivers/clk/mediatek/clk-mt7622.c
--- linux-libre-4.19.88-gnu/drivers/clk/mediatek/clk-mt7622.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/clk/mediatek/clk-mt7622.c	2019-12-13 02:52:59.000000000 -0500
@@ -513,7 +513,7 @@ static const struct mtk_gate peri_clks[]
 	GATE_PERI1(CLK_PERI_IRTX_PD, "peri_irtx_pd", "irtx_sel", 2),
 };
 
-static struct mtk_composite infra_muxes[] __initdata = {
+static struct mtk_composite infra_muxes[] = {
 	MUX(CLK_INFRA_MUX1_SEL, "infra_mux1_sel", infra_mux1_parents,
 	    0x000, 2, 2),
 };
@@ -652,7 +652,7 @@ static int mtk_topckgen_init(struct plat
 	return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
 }
 
-static int __init mtk_infrasys_init(struct platform_device *pdev)
+static int mtk_infrasys_init(struct platform_device *pdev)
 {
 	struct device_node *node = pdev->dev.of_node;
 	struct clk_onecell_data *clk_data;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/clk/meson/gxbb.c linux-libre-4.19.89-gnu/drivers/clk/meson/gxbb.c
--- linux-libre-4.19.88-gnu/drivers/clk/meson/gxbb.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/clk/meson/gxbb.c	2019-12-13 02:52:59.000000000 -0500
@@ -295,6 +295,12 @@ static struct clk_regmap gxl_hdmi_pll =
 			.shift   = 9,
 			.width   = 5,
 		},
+		/*
+		 * On gxl, there is a register shift due to
+		 * HHI_HDMI_PLL_CNTL1 which does not exist on gxbb,
+		 * so we use the HHI_HDMI_PLL_CNTL2 define from GXBB
+		 * instead which is defined at the same offset.
+		 */
 		.frac = {
 			/*
 			 * On gxl, there is a register shift due to
@@ -304,7 +310,7 @@ static struct clk_regmap gxl_hdmi_pll =
 			 */
 			.reg_off = HHI_HDMI_PLL_CNTL + 4,
 			.shift   = 0,
-			.width   = 12,
+			.width   = 10,
 		},
 		.od = {
 			.reg_off = HHI_HDMI_PLL_CNTL + 8,
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/clk/meson/meson8b.c linux-libre-4.19.89-gnu/drivers/clk/meson/meson8b.c
--- linux-libre-4.19.88-gnu/drivers/clk/meson/meson8b.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/clk/meson/meson8b.c	2019-12-13 02:52:59.000000000 -0500
@@ -144,7 +144,7 @@ static struct clk_regmap meson8b_vid_pll
 		},
 		.n = {
 			.reg_off = HHI_VID_PLL_CNTL,
-			.shift   = 9,
+			.shift   = 10,
 			.width   = 5,
 		},
 		.od = {
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/clk/qcom/gcc-msm8998.c linux-libre-4.19.89-gnu/drivers/clk/qcom/gcc-msm8998.c
--- linux-libre-4.19.88-gnu/drivers/clk/qcom/gcc-msm8998.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/clk/qcom/gcc-msm8998.c	2019-12-13 02:52:59.000000000 -0500
@@ -2402,7 +2402,7 @@ static struct clk_branch gcc_ufs_phy_aux
 
 static struct clk_branch gcc_ufs_rx_symbol_0_clk = {
 	.halt_reg = 0x75014,
-	.halt_check = BRANCH_HALT,
+	.halt_check = BRANCH_HALT_SKIP,
 	.clkr = {
 		.enable_reg = 0x75014,
 		.enable_mask = BIT(0),
@@ -2415,7 +2415,7 @@ static struct clk_branch gcc_ufs_rx_symb
 
 static struct clk_branch gcc_ufs_rx_symbol_1_clk = {
 	.halt_reg = 0x7605c,
-	.halt_check = BRANCH_HALT,
+	.halt_check = BRANCH_HALT_SKIP,
 	.clkr = {
 		.enable_reg = 0x7605c,
 		.enable_mask = BIT(0),
@@ -2428,7 +2428,7 @@ static struct clk_branch gcc_ufs_rx_symb
 
 static struct clk_branch gcc_ufs_tx_symbol_0_clk = {
 	.halt_reg = 0x75010,
-	.halt_check = BRANCH_HALT,
+	.halt_check = BRANCH_HALT_SKIP,
 	.clkr = {
 		.enable_reg = 0x75010,
 		.enable_mask = BIT(0),
@@ -2743,25 +2743,25 @@ static struct gdsc *gcc_msm8998_gdscs[]
 };
 
 static const struct qcom_reset_map gcc_msm8998_resets[] = {
-	[GCC_BLSP1_QUP1_BCR] = { 0x102400 },
-	[GCC_BLSP1_QUP2_BCR] = { 0x110592 },
-	[GCC_BLSP1_QUP3_BCR] = { 0x118784 },
-	[GCC_BLSP1_QUP4_BCR] = { 0x126976 },
-	[GCC_BLSP1_QUP5_BCR] = { 0x135168 },
-	[GCC_BLSP1_QUP6_BCR] = { 0x143360 },
-	[GCC_BLSP2_QUP1_BCR] = { 0x155648 },
-	[GCC_BLSP2_QUP2_BCR] = { 0x163840 },
-	[GCC_BLSP2_QUP3_BCR] = { 0x172032 },
-	[GCC_BLSP2_QUP4_BCR] = { 0x180224 },
-	[GCC_BLSP2_QUP5_BCR] = { 0x188416 },
-	[GCC_BLSP2_QUP6_BCR] = { 0x196608 },
-	[GCC_PCIE_0_BCR] = { 0x438272 },
-	[GCC_PDM_BCR] = { 0x208896 },
-	[GCC_SDCC2_BCR] = { 0x81920 },
-	[GCC_SDCC4_BCR] = { 0x90112 },
-	[GCC_TSIF_BCR] = { 0x221184 },
-	[GCC_UFS_BCR] = { 0x479232 },
-	[GCC_USB_30_BCR] = { 0x61440 },
+	[GCC_BLSP1_QUP1_BCR] = { 0x19000 },
+	[GCC_BLSP1_QUP2_BCR] = { 0x1b000 },
+	[GCC_BLSP1_QUP3_BCR] = { 0x1d000 },
+	[GCC_BLSP1_QUP4_BCR] = { 0x1f000 },
+	[GCC_BLSP1_QUP5_BCR] = { 0x21000 },
+	[GCC_BLSP1_QUP6_BCR] = { 0x23000 },
+	[GCC_BLSP2_QUP1_BCR] = { 0x26000 },
+	[GCC_BLSP2_QUP2_BCR] = { 0x28000 },
+	[GCC_BLSP2_QUP3_BCR] = { 0x2a000 },
+	[GCC_BLSP2_QUP4_BCR] = { 0x2c000 },
+	[GCC_BLSP2_QUP5_BCR] = { 0x2e000 },
+	[GCC_BLSP2_QUP6_BCR] = { 0x30000 },
+	[GCC_PCIE_0_BCR] = { 0x6b000 },
+	[GCC_PDM_BCR] = { 0x33000 },
+	[GCC_SDCC2_BCR] = { 0x14000 },
+	[GCC_SDCC4_BCR] = { 0x16000 },
+	[GCC_TSIF_BCR] = { 0x36000 },
+	[GCC_UFS_BCR] = { 0x75000 },
+	[GCC_USB_30_BCR] = { 0xf000 },
 };
 
 static const struct regmap_config gcc_msm8998_regmap_config = {
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/clk/renesas/r8a77990-cpg-mssr.c linux-libre-4.19.89-gnu/drivers/clk/renesas/r8a77990-cpg-mssr.c
--- linux-libre-4.19.88-gnu/drivers/clk/renesas/r8a77990-cpg-mssr.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/clk/renesas/r8a77990-cpg-mssr.c	2019-12-13 02:52:59.000000000 -0500
@@ -175,8 +175,8 @@ static const struct mssr_mod_clk r8a7799
 	DEF_MOD("ehci0",		 703,	R8A77990_CLK_S3D4),
 	DEF_MOD("hsusb",		 704,	R8A77990_CLK_S3D4),
 	DEF_MOD("csi40",		 716,	R8A77990_CLK_CSI0),
-	DEF_MOD("du1",			 723,	R8A77990_CLK_S2D1),
-	DEF_MOD("du0",			 724,	R8A77990_CLK_S2D1),
+	DEF_MOD("du1",			 723,	R8A77990_CLK_S1D1),
+	DEF_MOD("du0",			 724,	R8A77990_CLK_S1D1),
 	DEF_MOD("lvds",			 727,	R8A77990_CLK_S2D1),
 
 	DEF_MOD("vin5",			 806,	R8A77990_CLK_S1D2),
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/clk/renesas/r8a77995-cpg-mssr.c linux-libre-4.19.89-gnu/drivers/clk/renesas/r8a77995-cpg-mssr.c
--- linux-libre-4.19.88-gnu/drivers/clk/renesas/r8a77995-cpg-mssr.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/clk/renesas/r8a77995-cpg-mssr.c	2019-12-13 02:52:59.000000000 -0500
@@ -141,8 +141,8 @@ static const struct mssr_mod_clk r8a7799
 	DEF_MOD("vspbs",		 627,	R8A77995_CLK_S0D1),
 	DEF_MOD("ehci0",		 703,	R8A77995_CLK_S3D2),
 	DEF_MOD("hsusb",		 704,	R8A77995_CLK_S3D2),
-	DEF_MOD("du1",			 723,	R8A77995_CLK_S2D1),
-	DEF_MOD("du0",			 724,	R8A77995_CLK_S2D1),
+	DEF_MOD("du1",			 723,	R8A77995_CLK_S1D1),
+	DEF_MOD("du0",			 724,	R8A77995_CLK_S1D1),
 	DEF_MOD("lvds",			 727,	R8A77995_CLK_S2D1),
 	DEF_MOD("vin7",			 804,	R8A77995_CLK_S1D2),
 	DEF_MOD("vin6",			 805,	R8A77995_CLK_S1D2),
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/clk/renesas/rcar-gen3-cpg.c linux-libre-4.19.89-gnu/drivers/clk/renesas/rcar-gen3-cpg.c
--- linux-libre-4.19.88-gnu/drivers/clk/renesas/rcar-gen3-cpg.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/clk/renesas/rcar-gen3-cpg.c	2019-12-13 02:52:59.000000000 -0500
@@ -361,7 +361,7 @@ static struct clk * __init cpg_sd_clk_re
 	struct sd_clock *clock;
 	struct clk *clk;
 	unsigned int i;
-	u32 sd_fc;
+	u32 val;
 
 	clock = kzalloc(sizeof(*clock), GFP_KERNEL);
 	if (!clock)
@@ -378,17 +378,9 @@ static struct clk * __init cpg_sd_clk_re
 	clock->div_table = cpg_sd_div_table;
 	clock->div_num = ARRAY_SIZE(cpg_sd_div_table);
 
-	sd_fc = readl(clock->csn.reg) & CPG_SD_FC_MASK;
-	for (i = 0; i < clock->div_num; i++)
-		if (sd_fc == (clock->div_table[i].val & CPG_SD_FC_MASK))
-			break;
-
-	if (WARN_ON(i >= clock->div_num)) {
-		kfree(clock);
-		return ERR_PTR(-EINVAL);
-	}
-
-	clock->cur_div_idx = i;
+	val = readl(clock->csn.reg) & ~CPG_SD_FC_MASK;
+	val |= CPG_SD_STP_MASK | (clock->div_table[0].val & CPG_SD_FC_MASK);
+	writel(val, clock->csn.reg);
 
 	clock->div_max = clock->div_table[0].div;
 	clock->div_min = clock->div_max;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/clk/rockchip/clk-rk3188.c linux-libre-4.19.89-gnu/drivers/clk/rockchip/clk-rk3188.c
--- linux-libre-4.19.88-gnu/drivers/clk/rockchip/clk-rk3188.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/clk/rockchip/clk-rk3188.c	2019-12-13 02:52:59.000000000 -0500
@@ -362,8 +362,8 @@ static struct rockchip_clk_branch common
 			RK2928_CLKGATE_CON(2), 5, GFLAGS),
 	MUX(SCLK_MAC, "sclk_macref", mux_sclk_macref_p, CLK_SET_RATE_PARENT,
 			RK2928_CLKSEL_CON(21), 4, 1, MFLAGS),
-	GATE(0, "sclk_mac_lbtest", "sclk_macref",
-			RK2928_CLKGATE_CON(2), 12, 0, GFLAGS),
+	GATE(0, "sclk_mac_lbtest", "sclk_macref", 0,
+			RK2928_CLKGATE_CON(2), 12, GFLAGS),
 
 	COMPOSITE(0, "hsadc_src", mux_pll_src_gpll_cpll_p, 0,
 			RK2928_CLKSEL_CON(22), 0, 1, MFLAGS, 8, 8, DFLAGS,
@@ -391,8 +391,8 @@ static struct rockchip_clk_branch common
 	 * Clock-Architecture Diagram 4
 	 */
 
-	GATE(SCLK_SMC, "sclk_smc", "hclk_peri",
-			RK2928_CLKGATE_CON(2), 4, 0, GFLAGS),
+	GATE(SCLK_SMC, "sclk_smc", "hclk_peri", 0,
+			RK2928_CLKGATE_CON(2), 4, GFLAGS),
 
 	COMPOSITE_NOMUX(SCLK_SPI0, "sclk_spi0", "pclk_peri", 0,
 			RK2928_CLKSEL_CON(25), 0, 7, DFLAGS,
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/clk/rockchip/clk-rk3328.c linux-libre-4.19.89-gnu/drivers/clk/rockchip/clk-rk3328.c
--- linux-libre-4.19.88-gnu/drivers/clk/rockchip/clk-rk3328.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/clk/rockchip/clk-rk3328.c	2019-12-13 02:52:59.000000000 -0500
@@ -392,7 +392,7 @@ static struct rockchip_clk_branch rk3328
 			RK3328_CLKGATE_CON(1), 5, GFLAGS,
 			&rk3328_i2s1_fracmux),
 	GATE(SCLK_I2S1, "clk_i2s1", "i2s1_pre", CLK_SET_RATE_PARENT,
-			RK3328_CLKGATE_CON(0), 6, GFLAGS),
+			RK3328_CLKGATE_CON(1), 6, GFLAGS),
 	COMPOSITE_NODIV(SCLK_I2S1_OUT, "i2s1_out", mux_i2s1out_p, 0,
 			RK3328_CLKSEL_CON(8), 12, 1, MFLAGS,
 			RK3328_CLKGATE_CON(1), 7, GFLAGS),
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/clk/sunxi-ng/ccu-sun50i-a64.c linux-libre-4.19.89-gnu/drivers/clk/sunxi-ng/ccu-sun50i-a64.c
--- linux-libre-4.19.88-gnu/drivers/clk/sunxi-ng/ccu-sun50i-a64.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/clk/sunxi-ng/ccu-sun50i-a64.c	2019-12-13 02:52:59.000000000 -0500
@@ -582,7 +582,7 @@ static const char * const dsi_dphy_paren
 static const u8 dsi_dphy_table[] = { 0, 2, };
 static SUNXI_CCU_M_WITH_MUX_TABLE_GATE(dsi_dphy_clk, "dsi-dphy",
 				       dsi_dphy_parents, dsi_dphy_table,
-				       0x168, 0, 4, 8, 2, BIT(31), CLK_SET_RATE_PARENT);
+				       0x168, 0, 4, 8, 2, BIT(15), CLK_SET_RATE_PARENT);
 
 static SUNXI_CCU_M_WITH_GATE(gpu_clk, "gpu", "pll-gpu",
 			     0x1a0, 0, 3, BIT(31), CLK_SET_RATE_PARENT);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/clk/sunxi-ng/ccu-sun8i-h3.c linux-libre-4.19.89-gnu/drivers/clk/sunxi-ng/ccu-sun8i-h3.c
--- linux-libre-4.19.88-gnu/drivers/clk/sunxi-ng/ccu-sun8i-h3.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/clk/sunxi-ng/ccu-sun8i-h3.c	2019-12-13 02:52:59.000000000 -0500
@@ -475,7 +475,7 @@ static const char * const csi_sclk_paren
 static SUNXI_CCU_M_WITH_MUX_GATE(csi_sclk_clk, "csi-sclk", csi_sclk_parents,
 				 0x134, 16, 4, 24, 3, BIT(31), 0);
 
-static const char * const csi_mclk_parents[] = { "osc24M", "pll-video", "pll-periph0" };
+static const char * const csi_mclk_parents[] = { "osc24M", "pll-video", "pll-periph1" };
 static SUNXI_CCU_M_WITH_MUX_GATE(csi_mclk_clk, "csi-mclk", csi_mclk_parents,
 				 0x134, 0, 5, 8, 3, BIT(15), 0);
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/crypto/amcc/crypto4xx_core.c linux-libre-4.19.89-gnu/drivers/crypto/amcc/crypto4xx_core.c
--- linux-libre-4.19.88-gnu/drivers/crypto/amcc/crypto4xx_core.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/crypto/amcc/crypto4xx_core.c	2019-12-13 02:52:59.000000000 -0500
@@ -373,12 +373,8 @@ static u32 crypto4xx_build_sdr(struct cr
 		dma_alloc_coherent(dev->core_dev->device,
 			PPC4XX_SD_BUFFER_SIZE * PPC4XX_NUM_SD,
 			&dev->scatter_buffer_pa, GFP_ATOMIC);
-	if (!dev->scatter_buffer_va) {
-		dma_free_coherent(dev->core_dev->device,
-				  sizeof(struct ce_sd) * PPC4XX_NUM_SD,
-				  dev->sdr, dev->sdr_pa);
+	if (!dev->scatter_buffer_va)
 		return -ENOMEM;
-	}
 
 	for (i = 0; i < PPC4XX_NUM_SD; i++) {
 		dev->sdr[i].ptr = dev->scatter_buffer_pa +
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/crypto/atmel-aes.c linux-libre-4.19.89-gnu/drivers/crypto/atmel-aes.c
--- linux-libre-4.19.88-gnu/drivers/crypto/atmel-aes.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/crypto/atmel-aes.c	2019-12-13 02:52:59.000000000 -0500
@@ -493,6 +493,29 @@ static inline bool atmel_aes_is_encrypt(
 static void atmel_aes_authenc_complete(struct atmel_aes_dev *dd, int err);
 #endif
 
+static void atmel_aes_set_iv_as_last_ciphertext_block(struct atmel_aes_dev *dd)
+{
+	struct ablkcipher_request *req = ablkcipher_request_cast(dd->areq);
+	struct atmel_aes_reqctx *rctx = ablkcipher_request_ctx(req);
+	struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req);
+	unsigned int ivsize = crypto_ablkcipher_ivsize(ablkcipher);
+
+	if (req->nbytes < ivsize)
+		return;
+
+	if (rctx->mode & AES_FLAGS_ENCRYPT) {
+		scatterwalk_map_and_copy(req->info, req->dst,
+					 req->nbytes - ivsize, ivsize, 0);
+	} else {
+		if (req->src == req->dst)
+			memcpy(req->info, rctx->lastc, ivsize);
+		else
+			scatterwalk_map_and_copy(req->info, req->src,
+						 req->nbytes - ivsize,
+						 ivsize, 0);
+	}
+}
+
 static inline int atmel_aes_complete(struct atmel_aes_dev *dd, int err)
 {
 #ifdef CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
@@ -503,26 +526,8 @@ static inline int atmel_aes_complete(str
 	clk_disable(dd->iclk);
 	dd->flags &= ~AES_FLAGS_BUSY;
 
-	if (!dd->ctx->is_aead) {
-		struct ablkcipher_request *req =
-			ablkcipher_request_cast(dd->areq);
-		struct atmel_aes_reqctx *rctx = ablkcipher_request_ctx(req);
-		struct crypto_ablkcipher *ablkcipher =
-			crypto_ablkcipher_reqtfm(req);
-		int ivsize = crypto_ablkcipher_ivsize(ablkcipher);
-
-		if (rctx->mode & AES_FLAGS_ENCRYPT) {
-			scatterwalk_map_and_copy(req->info, req->dst,
-				req->nbytes - ivsize, ivsize, 0);
-		} else {
-			if (req->src == req->dst) {
-				memcpy(req->info, rctx->lastc, ivsize);
-			} else {
-				scatterwalk_map_and_copy(req->info, req->src,
-					req->nbytes - ivsize, ivsize, 0);
-			}
-		}
-	}
+	if (!dd->ctx->is_aead)
+		atmel_aes_set_iv_as_last_ciphertext_block(dd);
 
 	if (dd->is_async)
 		dd->areq->complete(dd->areq, err);
@@ -1128,10 +1133,12 @@ static int atmel_aes_crypt(struct ablkci
 	rctx->mode = mode;
 
 	if (!(mode & AES_FLAGS_ENCRYPT) && (req->src == req->dst)) {
-		int ivsize = crypto_ablkcipher_ivsize(ablkcipher);
+		unsigned int ivsize = crypto_ablkcipher_ivsize(ablkcipher);
 
-		scatterwalk_map_and_copy(rctx->lastc, req->src,
-			(req->nbytes - ivsize), ivsize, 0);
+		if (req->nbytes >= ivsize)
+			scatterwalk_map_and_copy(rctx->lastc, req->src,
+						 req->nbytes - ivsize,
+						 ivsize, 0);
 	}
 
 	return atmel_aes_handle_queue(dd, &req->base);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/crypto/bcm/cipher.c linux-libre-4.19.89-gnu/drivers/crypto/bcm/cipher.c
--- linux-libre-4.19.88-gnu/drivers/crypto/bcm/cipher.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/crypto/bcm/cipher.c	2019-12-13 02:52:59.000000000 -0500
@@ -4634,12 +4634,16 @@ static int spu_register_ahash(struct ipr
 	hash->halg.statesize = sizeof(struct spu_hash_export_s);
 
 	if (driver_alg->auth_info.mode != HASH_MODE_HMAC) {
-		hash->setkey = ahash_setkey;
 		hash->init = ahash_init;
 		hash->update = ahash_update;
 		hash->final = ahash_final;
 		hash->finup = ahash_finup;
 		hash->digest = ahash_digest;
+		if ((driver_alg->auth_info.alg == HASH_ALG_AES) &&
+		    ((driver_alg->auth_info.mode == HASH_MODE_XCBC) ||
+		    (driver_alg->auth_info.mode == HASH_MODE_CMAC))) {
+			hash->setkey = ahash_setkey;
+		}
 	} else {
 		hash->setkey = ahash_hmac_setkey;
 		hash->init = ahash_hmac_init;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/crypto/ccp/ccp-dmaengine.c linux-libre-4.19.89-gnu/drivers/crypto/ccp/ccp-dmaengine.c
--- linux-libre-4.19.88-gnu/drivers/crypto/ccp/ccp-dmaengine.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/crypto/ccp/ccp-dmaengine.c	2019-12-13 02:52:59.000000000 -0500
@@ -340,6 +340,7 @@ static struct ccp_dma_desc *ccp_alloc_dm
 	desc->tx_desc.flags = flags;
 	desc->tx_desc.tx_submit = ccp_tx_submit;
 	desc->ccp = chan->ccp;
+	INIT_LIST_HEAD(&desc->entry);
 	INIT_LIST_HEAD(&desc->pending);
 	INIT_LIST_HEAD(&desc->active);
 	desc->status = DMA_IN_PROGRESS;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/dma/coh901318.c linux-libre-4.19.89-gnu/drivers/dma/coh901318.c
--- linux-libre-4.19.88-gnu/drivers/dma/coh901318.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/dma/coh901318.c	2019-12-13 02:52:59.000000000 -0500
@@ -1797,13 +1797,10 @@ static struct dma_chan *coh901318_xlate(
 static int coh901318_config(struct coh901318_chan *cohc,
 			    struct coh901318_params *param)
 {
-	unsigned long flags;
 	const struct coh901318_params *p;
 	int channel = cohc->id;
 	void __iomem *virtbase = cohc->base->virtbase;
 
-	spin_lock_irqsave(&cohc->lock, flags);
-
 	if (param)
 		p = param;
 	else
@@ -1823,8 +1820,6 @@ static int coh901318_config(struct coh90
 	coh901318_set_conf(cohc, p->config);
 	coh901318_set_ctrl(cohc, p->ctrl_lli_last);
 
-	spin_unlock_irqrestore(&cohc->lock, flags);
-
 	return 0;
 }
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/dma/dw/core.c linux-libre-4.19.89-gnu/drivers/dma/dw/core.c
--- linux-libre-4.19.88-gnu/drivers/dma/dw/core.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/dma/dw/core.c	2019-12-13 02:52:59.000000000 -0500
@@ -160,12 +160,14 @@ static void dwc_initialize_chan_idma32(s
 
 static void dwc_initialize_chan_dw(struct dw_dma_chan *dwc)
 {
+	struct dw_dma *dw = to_dw_dma(dwc->chan.device);
 	u32 cfghi = DWC_CFGH_FIFO_MODE;
 	u32 cfglo = DWC_CFGL_CH_PRIOR(dwc->priority);
 	bool hs_polarity = dwc->dws.hs_polarity;
 
 	cfghi |= DWC_CFGH_DST_PER(dwc->dws.dst_id);
 	cfghi |= DWC_CFGH_SRC_PER(dwc->dws.src_id);
+	cfghi |= DWC_CFGH_PROTCTL(dw->pdata->protctl);
 
 	/* Set polarity of handshake interface */
 	cfglo |= hs_polarity ? DWC_CFGL_HS_DST_POL | DWC_CFGL_HS_SRC_POL : 0;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/dma/dw/platform.c linux-libre-4.19.89-gnu/drivers/dma/dw/platform.c
--- linux-libre-4.19.88-gnu/drivers/dma/dw/platform.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/dma/dw/platform.c	2019-12-13 02:52:59.000000000 -0500
@@ -162,6 +162,12 @@ dw_dma_parse_dt(struct platform_device *
 			pdata->multi_block[tmp] = 1;
 	}
 
+	if (!of_property_read_u32(np, "snps,dma-protection-control", &tmp)) {
+		if (tmp > CHAN_PROTCTL_MASK)
+			return NULL;
+		pdata->protctl = tmp;
+	}
+
 	return pdata;
 }
 #else
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/dma/dw/regs.h linux-libre-4.19.89-gnu/drivers/dma/dw/regs.h
--- linux-libre-4.19.88-gnu/drivers/dma/dw/regs.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/dma/dw/regs.h	2019-12-13 02:52:59.000000000 -0500
@@ -200,6 +200,10 @@ enum dw_dma_msize {
 #define DWC_CFGH_FCMODE		(1 << 0)
 #define DWC_CFGH_FIFO_MODE	(1 << 1)
 #define DWC_CFGH_PROTCTL(x)	((x) << 2)
+#define DWC_CFGH_PROTCTL_DATA	(0 << 2)	/* data access - always set */
+#define DWC_CFGH_PROTCTL_PRIV	(1 << 2)	/* privileged -> AHB HPROT[1] */
+#define DWC_CFGH_PROTCTL_BUFFER	(2 << 2)	/* bufferable -> AHB HPROT[2] */
+#define DWC_CFGH_PROTCTL_CACHE	(4 << 2)	/* cacheable  -> AHB HPROT[3] */
 #define DWC_CFGH_DS_UPD_EN	(1 << 5)
 #define DWC_CFGH_SS_UPD_EN	(1 << 6)
 #define DWC_CFGH_SRC_PER(x)	((x) << 7)
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/extcon/extcon-max8997.c linux-libre-4.19.89-gnu/drivers/extcon/extcon-max8997.c
--- linux-libre-4.19.88-gnu/drivers/extcon/extcon-max8997.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/extcon/extcon-max8997.c	2019-12-13 02:52:59.000000000 -0500
@@ -321,12 +321,10 @@ static int max8997_muic_handle_usb(struc
 {
 	int ret = 0;
 
-	if (usb_type == MAX8997_USB_HOST) {
-		ret = max8997_muic_set_path(info, info->path_usb, attached);
-		if (ret < 0) {
-			dev_err(info->dev, "failed to update muic register\n");
-			return ret;
-		}
+	ret = max8997_muic_set_path(info, info->path_usb, attached);
+	if (ret < 0) {
+		dev_err(info->dev, "failed to update muic register\n");
+		return ret;
 	}
 
 	switch (usb_type) {
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/firmware/raspberrypi.c linux-libre-4.19.89-gnu/drivers/firmware/raspberrypi.c
--- linux-libre-4.19.88-gnu/drivers/firmware/raspberrypi.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/firmware/raspberrypi.c	2019-12-13 02:52:59.000000000 -0500
@@ -14,6 +14,7 @@
 #include <linux/module.h>
 #include <linux/of_platform.h>
 #include <linux/platform_device.h>
+#include <linux/slab.h>
 #include <soc/bcm2835/raspberrypi-firmware.h>
 
 #define MBOX_MSG(chan, data28)		(((data28) & ~0xf) | ((chan) & 0xf))
@@ -21,8 +22,6 @@
 #define MBOX_DATA28(msg)		((msg) & ~0xf)
 #define MBOX_CHAN_PROPERTY		8
 
-#define MAX_RPI_FW_PROP_BUF_SIZE	32
-
 static struct platform_device *rpi_hwmon;
 
 struct rpi_firmware {
@@ -144,28 +143,30 @@ EXPORT_SYMBOL_GPL(rpi_firmware_property_
 int rpi_firmware_property(struct rpi_firmware *fw,
 			  u32 tag, void *tag_data, size_t buf_size)
 {
-	/* Single tags are very small (generally 8 bytes), so the
-	 * stack should be safe.
-	 */
-	u8 data[sizeof(struct rpi_firmware_property_tag_header) +
-		MAX_RPI_FW_PROP_BUF_SIZE];
-	struct rpi_firmware_property_tag_header *header =
-		(struct rpi_firmware_property_tag_header *)data;
+	struct rpi_firmware_property_tag_header *header;
 	int ret;
 
-	if (WARN_ON(buf_size > sizeof(data) - sizeof(*header)))
-		return -EINVAL;
+	/* Some mailboxes can use over 1k bytes. Rather than checking
+	 * size and using stack or kmalloc depending on requirements,
+	 * just use kmalloc. Mailboxes don't get called enough to worry
+	 * too much about the time taken in the allocation.
+	 */
+	void *data = kmalloc(sizeof(*header) + buf_size, GFP_KERNEL);
 
+	if (!data)
+		return -ENOMEM;
+
+	header = data;
 	header->tag = tag;
 	header->buf_size = buf_size;
 	header->req_resp_size = 0;
-	memcpy(data + sizeof(struct rpi_firmware_property_tag_header),
-	       tag_data, buf_size);
+	memcpy(data + sizeof(*header), tag_data, buf_size);
 
-	ret = rpi_firmware_property_list(fw, &data, buf_size + sizeof(*header));
-	memcpy(tag_data,
-	       data + sizeof(struct rpi_firmware_property_tag_header),
-	       buf_size);
+	ret = rpi_firmware_property_list(fw, data, buf_size + sizeof(*header));
+
+	memcpy(tag_data, data + sizeof(*header), buf_size);
+
+	kfree(data);
 
 	return ret;
 }
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/gpu/drm/i810/i810_dma.c linux-libre-4.19.89-gnu/drivers/gpu/drm/i810/i810_dma.c
--- linux-libre-4.19.88-gnu/drivers/gpu/drm/i810/i810_dma.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/gpu/drm/i810/i810_dma.c	2019-12-13 02:52:59.000000000 -0500
@@ -721,7 +721,7 @@ static void i810_dma_dispatch_vertex(str
 	if (nbox > I810_NR_SAREA_CLIPRECTS)
 		nbox = I810_NR_SAREA_CLIPRECTS;
 
-	if (used > 4 * 1024)
+	if (used < 0 || used > 4 * 1024)
 		used = 0;
 
 	if (sarea_priv->dirty)
@@ -1041,7 +1041,7 @@ static void i810_dma_dispatch_mc(struct
 	if (u != I810_BUF_CLIENT)
 		DRM_DEBUG("MC found buffer that isn't mine!\n");
 
-	if (used > 4 * 1024)
+	if (used < 0 || used > 4 * 1024)
 		used = 0;
 
 	sarea_priv->dirty = 0x7f;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/gpu/drm/msm/msm_debugfs.c linux-libre-4.19.89-gnu/drivers/gpu/drm/msm/msm_debugfs.c
--- linux-libre-4.19.88-gnu/drivers/gpu/drm/msm/msm_debugfs.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/gpu/drm/msm/msm_debugfs.c	2019-12-13 02:52:59.000000000 -0500
@@ -53,12 +53,8 @@ static int msm_gpu_release(struct inode
 	struct msm_gpu_show_priv *show_priv = m->private;
 	struct msm_drm_private *priv = show_priv->dev->dev_private;
 	struct msm_gpu *gpu = priv->gpu;
-	int ret;
-
-	ret = mutex_lock_interruptible(&show_priv->dev->struct_mutex);
-	if (ret)
-		return ret;
 
+	mutex_lock(&show_priv->dev->struct_mutex);
 	gpu->funcs->gpu_state_put(show_priv->state);
 	mutex_unlock(&show_priv->dev->struct_mutex);
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/gpu/drm/sun4i/sun4i_tcon.c linux-libre-4.19.89-gnu/drivers/gpu/drm/sun4i/sun4i_tcon.c
--- linux-libre-4.19.88-gnu/drivers/gpu/drm/sun4i/sun4i_tcon.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/gpu/drm/sun4i/sun4i_tcon.c	2019-12-13 02:52:59.000000000 -0500
@@ -423,7 +423,7 @@ static void sun4i_tcon0_mode_set_rgb(str
 
 	WARN_ON(!tcon->quirks->has_channel_0);
 
-	tcon->dclk_min_div = 6;
+	tcon->dclk_min_div = 1;
 	tcon->dclk_max_div = 127;
 	sun4i_tcon0_mode_set_common(tcon, mode);
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/gpu/host1x/hw/hw_host1x06_uclass.h linux-libre-4.19.89-gnu/drivers/gpu/host1x/hw/hw_host1x06_uclass.h
--- linux-libre-4.19.88-gnu/drivers/gpu/host1x/hw/hw_host1x06_uclass.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/gpu/host1x/hw/hw_host1x06_uclass.h	2019-12-13 02:52:59.000000000 -0500
@@ -59,7 +59,7 @@ static inline u32 host1x_uclass_incr_syn
 	host1x_uclass_incr_syncpt_r()
 static inline u32 host1x_uclass_incr_syncpt_cond_f(u32 v)
 {
-	return (v & 0xff) << 8;
+	return (v & 0xff) << 10;
 }
 #define HOST1X_UCLASS_INCR_SYNCPT_COND_F(v) \
 	host1x_uclass_incr_syncpt_cond_f(v)
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/hwtracing/coresight/coresight-etm4x-sysfs.c linux-libre-4.19.89-gnu/drivers/hwtracing/coresight/coresight-etm4x-sysfs.c
--- linux-libre-4.19.88-gnu/drivers/hwtracing/coresight/coresight-etm4x-sysfs.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/hwtracing/coresight/coresight-etm4x-sysfs.c	2019-12-13 02:52:59.000000000 -0500
@@ -655,10 +655,13 @@ static ssize_t cyc_threshold_store(struc
 
 	if (kstrtoul(buf, 16, &val))
 		return -EINVAL;
+
+	/* mask off max threshold before checking min value */
+	val &= ETM_CYC_THRESHOLD_MASK;
 	if (val < drvdata->ccitmin)
 		return -EINVAL;
 
-	config->ccctlr = val & ETM_CYC_THRESHOLD_MASK;
+	config->ccctlr = val;
 	return size;
 }
 static DEVICE_ATTR_RW(cyc_threshold);
@@ -689,14 +692,16 @@ static ssize_t bb_ctrl_store(struct devi
 		return -EINVAL;
 	if (!drvdata->nr_addr_cmp)
 		return -EINVAL;
+
 	/*
-	 * Bit[7:0] selects which address range comparator is used for
-	 * branch broadcast control.
+	 * Bit[8] controls include(1) / exclude(0), bits[0-7] select
+	 * individual range comparators. If include then at least 1
+	 * range must be selected.
 	 */
-	if (BMVAL(val, 0, 7) > drvdata->nr_addr_cmp)
+	if ((val & BIT(8)) && (BMVAL(val, 0, 7) == 0))
 		return -EINVAL;
 
-	config->bb_ctrl = val;
+	config->bb_ctrl = val & GENMASK(8, 0);
 	return size;
 }
 static DEVICE_ATTR_RW(bb_ctrl);
@@ -1329,8 +1334,8 @@ static ssize_t seq_event_store(struct de
 
 	spin_lock(&drvdata->spinlock);
 	idx = config->seq_idx;
-	/* RST, bits[7:0] */
-	config->seq_ctrl[idx] = val & 0xFF;
+	/* Seq control has two masks B[15:8] F[7:0] */
+	config->seq_ctrl[idx] = val & 0xFFFF;
 	spin_unlock(&drvdata->spinlock);
 	return size;
 }
@@ -1585,7 +1590,7 @@ static ssize_t res_ctrl_store(struct dev
 	if (idx % 2 != 0)
 		/* PAIRINV, bit[21] */
 		val &= ~BIT(21);
-	config->res_ctrl[idx] = val;
+	config->res_ctrl[idx] = val & GENMASK(21, 0);
 	spin_unlock(&drvdata->spinlock);
 	return size;
 }
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/i2c/busses/i2c-imx.c linux-libre-4.19.89-gnu/drivers/i2c/busses/i2c-imx.c
--- linux-libre-4.19.88-gnu/drivers/i2c/busses/i2c-imx.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/i2c/busses/i2c-imx.c	2019-12-13 02:52:59.000000000 -0500
@@ -1090,7 +1090,8 @@ static int i2c_imx_probe(struct platform
 	/* Get I2C clock */
 	i2c_imx->clk = devm_clk_get(&pdev->dev, NULL);
 	if (IS_ERR(i2c_imx->clk)) {
-		dev_err(&pdev->dev, "can't get I2C clock\n");
+		if (PTR_ERR(i2c_imx->clk) != -EPROBE_DEFER)
+			dev_err(&pdev->dev, "can't get I2C clock\n");
 		return PTR_ERR(i2c_imx->clk);
 	}
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/i2c/i2c-core-of.c linux-libre-4.19.89-gnu/drivers/i2c/i2c-core-of.c
--- linux-libre-4.19.88-gnu/drivers/i2c/i2c-core-of.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/i2c/i2c-core-of.c	2019-12-13 02:52:59.000000000 -0500
@@ -253,14 +253,14 @@ static int of_i2c_notify(struct notifier
 		}
 
 		client = of_i2c_register_device(adap, rd->dn);
-		put_device(&adap->dev);
-
 		if (IS_ERR(client)) {
 			dev_err(&adap->dev, "failed to create client for '%pOF'\n",
 				 rd->dn);
+			put_device(&adap->dev);
 			of_node_clear_flag(rd->dn, OF_POPULATED);
 			return notifier_from_errno(PTR_ERR(client));
 		}
+		put_device(&adap->dev);
 		break;
 	case OF_RECONFIG_CHANGE_REMOVE:
 		/* already depopulated? */
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/infiniband/hw/cxgb4/cm.c linux-libre-4.19.89-gnu/drivers/infiniband/hw/cxgb4/cm.c
--- linux-libre-4.19.88-gnu/drivers/infiniband/hw/cxgb4/cm.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/infiniband/hw/cxgb4/cm.c	2019-12-13 02:52:59.000000000 -0500
@@ -2798,7 +2798,8 @@ static int peer_abort(struct c4iw_dev *d
 		break;
 	case MPA_REQ_SENT:
 		(void)stop_ep_timer(ep);
-		if (mpa_rev == 1 || (mpa_rev == 2 && ep->tried_with_mpa_v1))
+		if (status != CPL_ERR_CONN_RESET || mpa_rev == 1 ||
+		    (mpa_rev == 2 && ep->tried_with_mpa_v1))
 			connect_reply_upcall(ep, -ECONNRESET);
 		else {
 			/*
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/infiniband/hw/hfi1/chip.c linux-libre-4.19.89-gnu/drivers/infiniband/hw/hfi1/chip.c
--- linux-libre-4.19.88-gnu/drivers/infiniband/hw/hfi1/chip.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/infiniband/hw/hfi1/chip.c	2019-12-13 02:52:59.000000000 -0500
@@ -1074,6 +1074,8 @@ static void log_state_transition(struct
 static void log_physical_state(struct hfi1_pportdata *ppd, u32 state);
 static int wait_physical_linkstate(struct hfi1_pportdata *ppd, u32 state,
 				   int msecs);
+static int wait_phys_link_out_of_offline(struct hfi1_pportdata *ppd,
+					 int msecs);
 static void read_planned_down_reason_code(struct hfi1_devdata *dd, u8 *pdrrc);
 static void read_link_down_reason(struct hfi1_devdata *dd, u8 *ldr);
 static void handle_temp_err(struct hfi1_devdata *dd);
@@ -10769,13 +10771,15 @@ int set_link_state(struct hfi1_pportdata
 			break;
 
 		ppd->port_error_action = 0;
-		ppd->host_link_state = HLS_DN_POLL;
 
 		if (quick_linkup) {
 			/* quick linkup does not go into polling */
 			ret = do_quick_linkup(dd);
 		} else {
 			ret1 = set_physical_link_state(dd, PLS_POLLING);
+			if (!ret1)
+				ret1 = wait_phys_link_out_of_offline(ppd,
+								     3000);
 			if (ret1 != HCMD_SUCCESS) {
 				dd_dev_err(dd,
 					   "Failed to transition to Polling link state, return 0x%x\n",
@@ -10783,6 +10787,14 @@ int set_link_state(struct hfi1_pportdata
 				ret = -EINVAL;
 			}
 		}
+
+		/*
+		 * Change the host link state after requesting DC8051 to
+		 * change its physical state so that we can ignore any
+		 * interrupt with stale LNI(XX) error, which will not be
+		 * cleared until DC8051 transitions to Polling state.
+		 */
+		ppd->host_link_state = HLS_DN_POLL;
 		ppd->offline_disabled_reason =
 			HFI1_ODR_MASK(OPA_LINKDOWN_REASON_NONE);
 		/*
@@ -12907,6 +12919,39 @@ static int wait_phys_link_offline_substa
 				   read_state, msecs);
 			return -ETIMEDOUT;
 		}
+		usleep_range(1950, 2050); /* sleep 2ms-ish */
+	}
+
+	log_state_transition(ppd, read_state);
+	return read_state;
+}
+
+/*
+ * wait_phys_link_out_of_offline - wait for any out of offline state
+ * @ppd: port device
+ * @msecs: the number of milliseconds to wait
+ *
+ * Wait up to msecs milliseconds for any out of offline physical link
+ * state change to occur.
+ * Returns 0 if at least one state is reached, otherwise -ETIMEDOUT.
+ */
+static int wait_phys_link_out_of_offline(struct hfi1_pportdata *ppd,
+					 int msecs)
+{
+	u32 read_state;
+	unsigned long timeout;
+
+	timeout = jiffies + msecs_to_jiffies(msecs);
+	while (1) {
+		read_state = read_physical_state(ppd->dd);
+		if ((read_state & 0xF0) != PLS_OFFLINE)
+			break;
+		if (time_after(jiffies, timeout)) {
+			dd_dev_err(ppd->dd,
+				   "timeout waiting for phy link out of offline. Read state 0x%x, %dms\n",
+				   read_state, msecs);
+			return -ETIMEDOUT;
+		}
 		usleep_range(1950, 2050); /* sleep 2ms-ish */
 	}
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/infiniband/hw/hfi1/vnic_sdma.c linux-libre-4.19.89-gnu/drivers/infiniband/hw/hfi1/vnic_sdma.c
--- linux-libre-4.19.88-gnu/drivers/infiniband/hw/hfi1/vnic_sdma.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/infiniband/hw/hfi1/vnic_sdma.c	2019-12-13 02:52:59.000000000 -0500
@@ -57,7 +57,6 @@
 
 #define HFI1_VNIC_TXREQ_NAME_LEN   32
 #define HFI1_VNIC_SDMA_DESC_WTRMRK 64
-#define HFI1_VNIC_SDMA_RETRY_COUNT 1
 
 /*
  * struct vnic_txreq - VNIC transmit descriptor
@@ -67,7 +66,6 @@
  * @pad: pad buffer
  * @plen: pad length
  * @pbc_val: pbc value
- * @retry_count: tx retry count
  */
 struct vnic_txreq {
 	struct sdma_txreq       txreq;
@@ -77,8 +75,6 @@ struct vnic_txreq {
 	unsigned char           pad[HFI1_VNIC_MAX_PAD];
 	u16                     plen;
 	__le64                  pbc_val;
-
-	u32                     retry_count;
 };
 
 static void vnic_sdma_complete(struct sdma_txreq *txreq,
@@ -196,7 +192,6 @@ int hfi1_vnic_send_dma(struct hfi1_devda
 	ret = build_vnic_tx_desc(sde, tx, pbc);
 	if (unlikely(ret))
 		goto free_desc;
-	tx->retry_count = 0;
 
 	ret = sdma_send_txreq(sde, &vnic_sdma->wait, &tx->txreq,
 			      vnic_sdma->pkts_sent);
@@ -238,14 +233,14 @@ static int hfi1_vnic_sdma_sleep(struct s
 	struct hfi1_vnic_sdma *vnic_sdma =
 		container_of(wait, struct hfi1_vnic_sdma, wait);
 	struct hfi1_ibdev *dev = &vnic_sdma->dd->verbs_dev;
-	struct vnic_txreq *tx = container_of(txreq, struct vnic_txreq, txreq);
 
-	if (sdma_progress(sde, seq, txreq))
-		if (tx->retry_count++ < HFI1_VNIC_SDMA_RETRY_COUNT)
-			return -EAGAIN;
+	write_seqlock(&dev->iowait_lock);
+	if (sdma_progress(sde, seq, txreq)) {
+		write_sequnlock(&dev->iowait_lock);
+		return -EAGAIN;
+	}
 
 	vnic_sdma->state = HFI1_VNIC_SDMA_Q_DEFERRED;
-	write_seqlock(&dev->iowait_lock);
 	if (list_empty(&vnic_sdma->wait.list))
 		iowait_queue(pkts_sent, wait, &sde->dmawait);
 	write_sequnlock(&dev->iowait_lock);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/infiniband/hw/hns/hns_roce_hem.h linux-libre-4.19.89-gnu/drivers/infiniband/hw/hns/hns_roce_hem.h
--- linux-libre-4.19.88-gnu/drivers/infiniband/hw/hns/hns_roce_hem.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/infiniband/hw/hns/hns_roce_hem.h	2019-12-13 02:52:59.000000000 -0500
@@ -54,7 +54,7 @@ enum {
 
 #define HNS_ROCE_HEM_CHUNK_LEN	\
 	 ((256 - sizeof(struct list_head) - 2 * sizeof(int)) /	 \
-	 (sizeof(struct scatterlist)))
+	 (sizeof(struct scatterlist) + sizeof(void *)))
 
 #define check_whether_bt_num_3(type, hop_num) \
 	(type < HEM_TYPE_MTT && hop_num == 2)
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/infiniband/hw/mlx4/sysfs.c linux-libre-4.19.89-gnu/drivers/infiniband/hw/mlx4/sysfs.c
--- linux-libre-4.19.88-gnu/drivers/infiniband/hw/mlx4/sysfs.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/infiniband/hw/mlx4/sysfs.c	2019-12-13 02:52:59.000000000 -0500
@@ -353,16 +353,12 @@ err:
 
 static void get_name(struct mlx4_ib_dev *dev, char *name, int i, int max)
 {
-	char base_name[9];
-
-	/* pci_name format is: bus:dev:func -> xxxx:yy:zz.n */
-	strlcpy(name, pci_name(dev->dev->persist->pdev), max);
-	strncpy(base_name, name, 8); /*till xxxx:yy:*/
-	base_name[8] = '\0';
-	/* with no ARI only 3 last bits are used so when the fn is higher than 8
+	/* pci_name format is: bus:dev:func -> xxxx:yy:zz.n
+	 * with no ARI only 3 last bits are used so when the fn is higher than 8
 	 * need to add it to the dev num, so count in the last number will be
 	 * modulo 8 */
-	sprintf(name, "%s%.2d.%d", base_name, (i/8), (i%8));
+	snprintf(name, max, "%.8s%.2d.%d", pci_name(dev->dev->persist->pdev),
+		 i / 8, i % 8);
 }
 
 struct mlx4_port {
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/infiniband/hw/qib/qib_sysfs.c linux-libre-4.19.89-gnu/drivers/infiniband/hw/qib/qib_sysfs.c
--- linux-libre-4.19.88-gnu/drivers/infiniband/hw/qib/qib_sysfs.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/infiniband/hw/qib/qib_sysfs.c	2019-12-13 02:52:59.000000000 -0500
@@ -301,6 +301,9 @@ static ssize_t qib_portattr_show(struct
 	struct qib_pportdata *ppd =
 		container_of(kobj, struct qib_pportdata, pport_kobj);
 
+	if (!pattr->show)
+		return -EIO;
+
 	return pattr->show(ppd, buf);
 }
 
@@ -312,6 +315,9 @@ static ssize_t qib_portattr_store(struct
 	struct qib_pportdata *ppd =
 		container_of(kobj, struct qib_pportdata, pport_kobj);
 
+	if (!pattr->store)
+		return -EIO;
+
 	return pattr->store(ppd, buf, len);
 }
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/input/joystick/psxpad-spi.c linux-libre-4.19.89-gnu/drivers/input/joystick/psxpad-spi.c
--- linux-libre-4.19.88-gnu/drivers/input/joystick/psxpad-spi.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/input/joystick/psxpad-spi.c	2019-12-13 02:52:59.000000000 -0500
@@ -292,7 +292,7 @@ static int psxpad_spi_probe(struct spi_d
 	if (!pad)
 		return -ENOMEM;
 
-	pdev = input_allocate_polled_device();
+	pdev = devm_input_allocate_polled_device(&spi->dev);
 	if (!pdev) {
 		dev_err(&spi->dev, "failed to allocate input device\n");
 		return -ENOMEM;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/input/mouse/synaptics.c linux-libre-4.19.89-gnu/drivers/input/mouse/synaptics.c
--- linux-libre-4.19.88-gnu/drivers/input/mouse/synaptics.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/input/mouse/synaptics.c	2019-12-13 02:52:59.000000000 -0500
@@ -175,6 +175,7 @@ static const char * const smbus_pnp_ids[
 	"LEN0071", /* T480 */
 	"LEN0072", /* X1 Carbon Gen 5 (2017) - Elan/ALPS trackpoint */
 	"LEN0073", /* X1 Carbon G5 (Elantech) */
+	"LEN0091", /* X1 Carbon 6 */
 	"LEN0092", /* X1 Carbon 6 */
 	"LEN0093", /* T480 */
 	"LEN0096", /* X280 */
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/input/rmi4/rmi_f34v7.c linux-libre-4.19.89-gnu/drivers/input/rmi4/rmi_f34v7.c
--- linux-libre-4.19.88-gnu/drivers/input/rmi4/rmi_f34v7.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/input/rmi4/rmi_f34v7.c	2019-12-13 02:52:59.000000000 -0500
@@ -1192,6 +1192,9 @@ int rmi_f34v7_do_reflash(struct f34_data
 {
 	int ret;
 
+	f34->fn->rmi_dev->driver->set_irq_bits(f34->fn->rmi_dev,
+					       f34->fn->irq_mask);
+
 	rmi_f34v7_read_queries_bl_version(f34);
 
 	f34->v7.image = fw->data;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/input/rmi4/rmi_smbus.c linux-libre-4.19.89-gnu/drivers/input/rmi4/rmi_smbus.c
--- linux-libre-4.19.88-gnu/drivers/input/rmi4/rmi_smbus.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/input/rmi4/rmi_smbus.c	2019-12-13 02:52:59.000000000 -0500
@@ -166,7 +166,6 @@ static int rmi_smb_write_block(struct rm
 		/* prepare to write next block of bytes */
 		cur_len -= SMB_MAX_COUNT;
 		databuff += SMB_MAX_COUNT;
-		rmiaddr += SMB_MAX_COUNT;
 	}
 exit:
 	mutex_unlock(&rmi_smb->page_mutex);
@@ -218,7 +217,6 @@ static int rmi_smb_read_block(struct rmi
 		/* prepare to read next block of bytes */
 		cur_len -= SMB_MAX_COUNT;
 		databuff += SMB_MAX_COUNT;
-		rmiaddr += SMB_MAX_COUNT;
 	}
 
 	retval = 0;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/input/touchscreen/cyttsp4_core.c linux-libre-4.19.89-gnu/drivers/input/touchscreen/cyttsp4_core.c
--- linux-libre-4.19.88-gnu/drivers/input/touchscreen/cyttsp4_core.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/input/touchscreen/cyttsp4_core.c	2019-12-13 02:52:59.000000000 -0500
@@ -2000,11 +2000,6 @@ static int cyttsp4_mt_probe(struct cytts
 
 	/* get sysinfo */
 	md->si = &cd->sysinfo;
-	if (!md->si) {
-		dev_err(dev, "%s: Fail get sysinfo pointer from core p=%p\n",
-			__func__, md->si);
-		goto error_get_sysinfo;
-	}
 
 	rc = cyttsp4_setup_input_device(cd);
 	if (rc)
@@ -2014,8 +2009,6 @@ static int cyttsp4_mt_probe(struct cytts
 
 error_init_input:
 	input_free_device(md->input);
-error_get_sysinfo:
-	input_set_drvdata(md->input, NULL);
 error_alloc_failed:
 	dev_err(dev, "%s failed.\n", __func__);
 	return rc;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/input/touchscreen/goodix.c linux-libre-4.19.89-gnu/drivers/input/touchscreen/goodix.c
--- linux-libre-4.19.88-gnu/drivers/input/touchscreen/goodix.c	2019-12-05 06:47:15.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/input/touchscreen/goodix.c	2019-12-13 18:05:36.000000000 -0500
@@ -128,6 +128,15 @@ static const unsigned long goodix_irq_fl
 static const struct dmi_system_id rotated_screen[] = {
 #if defined(CONFIG_DMI) && defined(CONFIG_X86)
 	{
+		.ident = "Teclast X89",
+		.matches = {
+			/* tPAD is too generic, also match on bios date */
+			DMI_MATCH(DMI_BOARD_VENDOR, "TECLAST"),
+			DMI_MATCH(DMI_BOARD_NAME, "tPAD"),
+			DMI_MATCH(DMI_BIOS_DATE, "12/19/2014"),
+		},
+	},
+	{
 		.ident = "WinBook TW100",
 		.matches = {
 			DMI_MATCH(DMI_SYS_VENDOR, "WinBook"),
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/iommu/amd_iommu.c linux-libre-4.19.89-gnu/drivers/iommu/amd_iommu.c
--- linux-libre-4.19.88-gnu/drivers/iommu/amd_iommu.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/iommu/amd_iommu.c	2019-12-13 02:52:59.000000000 -0500
@@ -549,7 +549,7 @@ static void amd_iommu_report_page_fault(
 		dev_data = get_dev_data(&pdev->dev);
 
 	if (dev_data && __ratelimit(&dev_data->rs)) {
-		dev_err(&pdev->dev, "AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x%04x address=0x%016llx flags=0x%04x]\n",
+		dev_err(&pdev->dev, "Event logged [IO_PAGE_FAULT domain=0x%04x address=0x%016llx flags=0x%04x]\n",
 			domain_id, address, flags);
 	} else if (printk_ratelimit()) {
 		pr_err("AMD-Vi: Event logged [IO_PAGE_FAULT device=%02x:%02x.%x domain=0x%04x address=0x%016llx flags=0x%04x]\n",
@@ -589,43 +589,41 @@ retry:
 	if (type == EVENT_TYPE_IO_FAULT) {
 		amd_iommu_report_page_fault(devid, pasid, address, flags);
 		return;
-	} else {
-		dev_err(dev, "AMD-Vi: Event logged [");
 	}
 
 	switch (type) {
 	case EVENT_TYPE_ILL_DEV:
-		dev_err(dev, "ILLEGAL_DEV_TABLE_ENTRY device=%02x:%02x.%x pasid=0x%05x address=0x%016llx flags=0x%04x]\n",
+		dev_err(dev, "Event logged [ILLEGAL_DEV_TABLE_ENTRY device=%02x:%02x.%x pasid=0x%05x address=0x%016llx flags=0x%04x]\n",
 			PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid),
 			pasid, address, flags);
 		dump_dte_entry(devid);
 		break;
 	case EVENT_TYPE_DEV_TAB_ERR:
-		dev_err(dev, "DEV_TAB_HARDWARE_ERROR device=%02x:%02x.%x "
+		dev_err(dev, "Event logged [DEV_TAB_HARDWARE_ERROR device=%02x:%02x.%x "
 			"address=0x%016llx flags=0x%04x]\n",
 			PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid),
 			address, flags);
 		break;
 	case EVENT_TYPE_PAGE_TAB_ERR:
-		dev_err(dev, "PAGE_TAB_HARDWARE_ERROR device=%02x:%02x.%x domain=0x%04x address=0x%016llx flags=0x%04x]\n",
+		dev_err(dev, "Event logged [PAGE_TAB_HARDWARE_ERROR device=%02x:%02x.%x domain=0x%04x address=0x%016llx flags=0x%04x]\n",
 			PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid),
 			pasid, address, flags);
 		break;
 	case EVENT_TYPE_ILL_CMD:
-		dev_err(dev, "ILLEGAL_COMMAND_ERROR address=0x%016llx]\n", address);
+		dev_err(dev, "Event logged [ILLEGAL_COMMAND_ERROR address=0x%016llx]\n", address);
 		dump_command(address);
 		break;
 	case EVENT_TYPE_CMD_HARD_ERR:
-		dev_err(dev, "COMMAND_HARDWARE_ERROR address=0x%016llx flags=0x%04x]\n",
+		dev_err(dev, "Event logged [COMMAND_HARDWARE_ERROR address=0x%016llx flags=0x%04x]\n",
 			address, flags);
 		break;
 	case EVENT_TYPE_IOTLB_INV_TO:
-		dev_err(dev, "IOTLB_INV_TIMEOUT device=%02x:%02x.%x address=0x%016llx]\n",
+		dev_err(dev, "Event logged [IOTLB_INV_TIMEOUT device=%02x:%02x.%x address=0x%016llx]\n",
 			PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid),
 			address);
 		break;
 	case EVENT_TYPE_INV_DEV_REQ:
-		dev_err(dev, "INVALID_DEVICE_REQUEST device=%02x:%02x.%x pasid=0x%05x address=0x%016llx flags=0x%04x]\n",
+		dev_err(dev, "Event logged [INVALID_DEVICE_REQUEST device=%02x:%02x.%x pasid=0x%05x address=0x%016llx flags=0x%04x]\n",
 			PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid),
 			pasid, address, flags);
 		break;
@@ -633,12 +631,12 @@ retry:
 		pasid = ((event[0] >> 16) & 0xFFFF)
 			| ((event[1] << 6) & 0xF0000);
 		tag = event[1] & 0x03FF;
-		dev_err(dev, "INVALID_PPR_REQUEST device=%02x:%02x.%x pasid=0x%05x address=0x%016llx flags=0x%04x]\n",
+		dev_err(dev, "Event logged [INVALID_PPR_REQUEST device=%02x:%02x.%x pasid=0x%05x address=0x%016llx flags=0x%04x]\n",
 			PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid),
 			pasid, address, flags);
 		break;
 	default:
-		dev_err(dev, "UNKNOWN event[0]=0x%08x event[1]=0x%08x event[2]=0x%08x event[3]=0x%08x\n",
+		dev_err(dev, "Event logged [UNKNOWN event[0]=0x%08x event[1]=0x%08x event[2]=0x%08x event[3]=0x%08x\n",
 			event[0], event[1], event[2], event[3]);
 	}
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/md/raid0.c linux-libre-4.19.89-gnu/drivers/md/raid0.c
--- linux-libre-4.19.88-gnu/drivers/md/raid0.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/md/raid0.c	2019-12-13 02:52:59.000000000 -0500
@@ -620,7 +620,7 @@ static bool raid0_make_request(struct md
 		tmp_dev = map_sector(mddev, zone, sector, &sector);
 		break;
 	default:
-		WARN("md/raid0:%s: Invalid layout\n", mdname(mddev));
+		WARN(1, "md/raid0:%s: Invalid layout\n", mdname(mddev));
 		bio_io_error(bio);
 		return true;
 	}
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/media/cec/cec-adap.c linux-libre-4.19.89-gnu/drivers/media/cec/cec-adap.c
--- linux-libre-4.19.88-gnu/drivers/media/cec/cec-adap.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/media/cec/cec-adap.c	2019-12-13 02:52:59.000000000 -0500
@@ -1437,6 +1437,13 @@ configured:
 			las->log_addr[i],
 			cec_phys_addr_exp(adap->phys_addr));
 		cec_transmit_msg_fh(adap, &msg, NULL, false);
+
+		/* Report Vendor ID */
+		if (adap->log_addrs.vendor_id != CEC_VENDOR_ID_NONE) {
+			cec_msg_device_vendor_id(&msg,
+						 adap->log_addrs.vendor_id);
+			cec_transmit_msg_fh(adap, &msg, NULL, false);
+		}
 	}
 	adap->kthread_config = NULL;
 	complete(&adap->config_completion);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/media/platform/coda/coda-common.c linux-libre-4.19.89-gnu/drivers/media/platform/coda/coda-common.c
--- linux-libre-4.19.88-gnu/drivers/media/platform/coda/coda-common.c	2019-12-05 06:33:28.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/media/platform/coda/coda-common.c	2019-12-13 17:52:27.000000000 -0500
@@ -17,6 +17,7 @@
 #include <linux/firmware.h>
 #include <linux/gcd.h>
 #include <linux/genalloc.h>
+#include <linux/idr.h>
 #include <linux/interrupt.h>
 #include <linux/io.h>
 #include <linux/irq.h>
@@ -2101,17 +2102,6 @@ int coda_decoder_queue_init(void *priv,
 	return coda_queue_init(priv, dst_vq);
 }
 
-static int coda_next_free_instance(struct coda_dev *dev)
-{
-	int idx = ffz(dev->instance_mask);
-
-	if ((idx < 0) ||
-	    (dev->devtype->product == CODA_DX6 && idx > CODADX6_MAX_INSTANCES))
-		return -EBUSY;
-
-	return idx;
-}
-
 /*
  * File operations
  */
@@ -2120,7 +2110,8 @@ static int coda_open(struct file *file)
 {
 	struct video_device *vdev = video_devdata(file);
 	struct coda_dev *dev = video_get_drvdata(vdev);
-	struct coda_ctx *ctx = NULL;
+	struct coda_ctx *ctx;
+	unsigned int max = ~0;
 	char *name;
 	int ret;
 	int idx;
@@ -2129,12 +2120,13 @@ static int coda_open(struct file *file)
 	if (!ctx)
 		return -ENOMEM;
 
-	idx = coda_next_free_instance(dev);
+	if (dev->devtype->product == CODA_DX6)
+		max = CODADX6_MAX_INSTANCES - 1;
+	idx = ida_alloc_max(&dev->ida, max, GFP_KERNEL);
 	if (idx < 0) {
 		ret = idx;
 		goto err_coda_max;
 	}
-	set_bit(idx, &dev->instance_mask);
 
 	name = kasprintf(GFP_KERNEL, "context%d", idx);
 	if (!name) {
@@ -2243,8 +2235,8 @@ err_clk_per:
 err_pm_get:
 	v4l2_fh_del(&ctx->fh);
 	v4l2_fh_exit(&ctx->fh);
-	clear_bit(ctx->idx, &dev->instance_mask);
 err_coda_name_init:
+	ida_free(&dev->ida, ctx->idx);
 err_coda_max:
 	kfree(ctx);
 	return ret;
@@ -2286,7 +2278,7 @@ static int coda_release(struct file *fil
 	pm_runtime_put_sync(&dev->plat_dev->dev);
 	v4l2_fh_del(&ctx->fh);
 	v4l2_fh_exit(&ctx->fh);
-	clear_bit(ctx->idx, &dev->instance_mask);
+	ida_free(&dev->ida, ctx->idx);
 	if (ctx->ops->release)
 		ctx->ops->release(ctx);
 	debugfs_remove_recursive(ctx->debugfs_entry);
@@ -2747,6 +2739,7 @@ static int coda_probe(struct platform_de
 
 	mutex_init(&dev->dev_mutex);
 	mutex_init(&dev->coda_mutex);
+	ida_init(&dev->ida);
 
 	dev->debugfs_root = debugfs_create_dir("coda", NULL);
 	if (!dev->debugfs_root)
@@ -2834,6 +2827,7 @@ static int coda_remove(struct platform_d
 	coda_free_aux_buf(dev, &dev->tempbuf);
 	coda_free_aux_buf(dev, &dev->workbuf);
 	debugfs_remove_recursive(dev->debugfs_root);
+	ida_destroy(&dev->ida);
 	return 0;
 }
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/media/platform/coda/coda.h linux-libre-4.19.89-gnu/drivers/media/platform/coda/coda.h
--- linux-libre-4.19.88-gnu/drivers/media/platform/coda/coda.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/media/platform/coda/coda.h	2019-12-13 02:52:59.000000000 -0500
@@ -16,6 +16,7 @@
 #define __CODA_H__
 
 #include <linux/debugfs.h>
+#include <linux/idr.h>
 #include <linux/irqreturn.h>
 #include <linux/mutex.h>
 #include <linux/kfifo.h>
@@ -95,7 +96,7 @@ struct coda_dev {
 	struct workqueue_struct	*workqueue;
 	struct v4l2_m2m_dev	*m2m_dev;
 	struct list_head	instances;
-	unsigned long		instance_mask;
+	struct ida		ida;
 	struct dentry		*debugfs_root;
 };
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/media/platform/vimc/vimc-common.c linux-libre-4.19.89-gnu/drivers/media/platform/vimc/vimc-common.c
--- linux-libre-4.19.88-gnu/drivers/media/platform/vimc/vimc-common.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/media/platform/vimc/vimc-common.c	2019-12-13 02:52:59.000000000 -0500
@@ -241,6 +241,8 @@ int vimc_pipeline_s_stream(struct media_
 
 		/* Start the stream in the subdevice direct connected */
 		pad = media_entity_remote_pad(&ent->pads[i]);
+		if (!pad)
+			continue;
 
 		if (!is_media_entity_v4l2_subdev(pad->entity))
 			return -EINVAL;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/media/spi/cxd2880-spi.c linux-libre-4.19.89-gnu/drivers/media/spi/cxd2880-spi.c
--- linux-libre-4.19.88-gnu/drivers/media/spi/cxd2880-spi.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/media/spi/cxd2880-spi.c	2019-12-13 02:52:59.000000000 -0500
@@ -536,6 +536,7 @@ cxd2880_spi_probe(struct spi_device *spi
 
 	if (!dvb_attach(cxd2880_attach, &dvb_spi->dvb_fe, &config)) {
 		pr_err("cxd2880_attach failed\n");
+		ret = -ENODEV;
 		goto fail_attach;
 	}
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/media/usb/pulse8-cec/pulse8-cec.c linux-libre-4.19.89-gnu/drivers/media/usb/pulse8-cec/pulse8-cec.c
--- linux-libre-4.19.88-gnu/drivers/media/usb/pulse8-cec/pulse8-cec.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/media/usb/pulse8-cec/pulse8-cec.c	2019-12-13 02:52:59.000000000 -0500
@@ -585,7 +585,7 @@ unlock:
 	else
 		pulse8->config_pending = true;
 	mutex_unlock(&pulse8->config_lock);
-	return err;
+	return log_addr == CEC_LOG_ADDR_INVALID ? 0 : err;
 }
 
 static int pulse8_cec_adap_transmit(struct cec_adapter *adap, u8 attempts,
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/media/usb/stkwebcam/stk-webcam.c linux-libre-4.19.89-gnu/drivers/media/usb/stkwebcam/stk-webcam.c
--- linux-libre-4.19.88-gnu/drivers/media/usb/stkwebcam/stk-webcam.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/media/usb/stkwebcam/stk-webcam.c	2019-12-13 02:52:59.000000000 -0500
@@ -164,7 +164,11 @@ int stk_camera_read_reg(struct stk_camer
 		*value = *buf;
 
 	kfree(buf);
-	return ret;
+
+	if (ret < 0)
+		return ret;
+	else
+		return 0;
 }
 
 static int stk_start_stream(struct stk_camera *dev)
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/media/usb/uvc/uvc_driver.c linux-libre-4.19.89-gnu/drivers/media/usb/uvc/uvc_driver.c
--- linux-libre-4.19.88-gnu/drivers/media/usb/uvc/uvc_driver.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/media/usb/uvc/uvc_driver.c	2019-12-13 02:52:59.000000000 -0500
@@ -391,6 +391,39 @@ static struct uvc_streaming *uvc_stream_
 }
 
 /* ------------------------------------------------------------------------
+ * Streaming Object Management
+ */
+
+static void uvc_stream_delete(struct uvc_streaming *stream)
+{
+	mutex_destroy(&stream->mutex);
+
+	usb_put_intf(stream->intf);
+
+	kfree(stream->format);
+	kfree(stream->header.bmaControls);
+	kfree(stream);
+}
+
+static struct uvc_streaming *uvc_stream_new(struct uvc_device *dev,
+					    struct usb_interface *intf)
+{
+	struct uvc_streaming *stream;
+
+	stream = kzalloc(sizeof(*stream), GFP_KERNEL);
+	if (stream == NULL)
+		return NULL;
+
+	mutex_init(&stream->mutex);
+
+	stream->dev = dev;
+	stream->intf = usb_get_intf(intf);
+	stream->intfnum = intf->cur_altsetting->desc.bInterfaceNumber;
+
+	return stream;
+}
+
+/* ------------------------------------------------------------------------
  * Descriptors parsing
  */
 
@@ -682,17 +715,12 @@ static int uvc_parse_streaming(struct uv
 		return -EINVAL;
 	}
 
-	streaming = kzalloc(sizeof(*streaming), GFP_KERNEL);
+	streaming = uvc_stream_new(dev, intf);
 	if (streaming == NULL) {
 		usb_driver_release_interface(&uvc_driver.driver, intf);
-		return -EINVAL;
+		return -ENOMEM;
 	}
 
-	mutex_init(&streaming->mutex);
-	streaming->dev = dev;
-	streaming->intf = usb_get_intf(intf);
-	streaming->intfnum = intf->cur_altsetting->desc.bInterfaceNumber;
-
 	/* The Pico iMage webcam has its class-specific interface descriptors
 	 * after the endpoint descriptors.
 	 */
@@ -899,10 +927,7 @@ static int uvc_parse_streaming(struct uv
 
 error:
 	usb_driver_release_interface(&uvc_driver.driver, intf);
-	usb_put_intf(intf);
-	kfree(streaming->format);
-	kfree(streaming->header.bmaControls);
-	kfree(streaming);
+	uvc_stream_delete(streaming);
 	return ret;
 }
 
@@ -1818,7 +1843,7 @@ static int uvc_scan_device(struct uvc_de
  * is released.
  *
  * As this function is called after or during disconnect(), all URBs have
- * already been canceled by the USB core. There is no need to kill the
+ * already been cancelled by the USB core. There is no need to kill the
  * interrupt URB manually.
  */
 static void uvc_delete(struct kref *kref)
@@ -1856,10 +1881,7 @@ static void uvc_delete(struct kref *kref
 		streaming = list_entry(p, struct uvc_streaming, list);
 		usb_driver_release_interface(&uvc_driver.driver,
 			streaming->intf);
-		usb_put_intf(streaming->intf);
-		kfree(streaming->format);
-		kfree(streaming->header.bmaControls);
-		kfree(streaming);
+		uvc_stream_delete(streaming);
 	}
 
 	kfree(dev);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/misc/altera-stapl/altera.c linux-libre-4.19.89-gnu/drivers/misc/altera-stapl/altera.c
--- linux-libre-4.19.88-gnu/drivers/misc/altera-stapl/altera.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/misc/altera-stapl/altera.c	2019-12-13 02:52:59.000000000 -0500
@@ -2176,8 +2176,7 @@ static int altera_get_note(u8 *p, s32 pr
 			key_ptr = &p[note_strings +
 					get_unaligned_be32(
 					&p[note_table + (8 * i)])];
-			if ((strncasecmp(key, key_ptr, strlen(key_ptr)) == 0) &&
-						(key != NULL)) {
+			if (key && !strncasecmp(key, key_ptr, strlen(key_ptr))) {
 				status = 0;
 
 				value_ptr = &p[note_strings +
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/net/can/slcan.c linux-libre-4.19.89-gnu/drivers/net/can/slcan.c
--- linux-libre-4.19.88-gnu/drivers/net/can/slcan.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/net/can/slcan.c	2019-12-13 02:52:59.000000000 -0500
@@ -613,6 +613,7 @@ err_free_chan:
 	sl->tty = NULL;
 	tty->disc_data = NULL;
 	clear_bit(SLF_INUSE, &sl->flags);
+	slc_free_netdev(sl->dev);
 	free_netdev(sl->dev);
 
 err_exit:
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/net/can/usb/ucan.c linux-libre-4.19.89-gnu/drivers/net/can/usb/ucan.c
--- linux-libre-4.19.88-gnu/drivers/net/can/usb/ucan.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/net/can/usb/ucan.c	2019-12-13 02:52:59.000000000 -0500
@@ -796,7 +796,7 @@ resubmit:
 			  up);
 
 	usb_anchor_urb(urb, &up->rx_urbs);
-	ret = usb_submit_urb(urb, GFP_KERNEL);
+	ret = usb_submit_urb(urb, GFP_ATOMIC);
 
 	if (ret < 0) {
 		netdev_err(up->netdev,
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/net/can/xilinx_can.c linux-libre-4.19.89-gnu/drivers/net/can/xilinx_can.c
--- linux-libre-4.19.88-gnu/drivers/net/can/xilinx_can.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/net/can/xilinx_can.c	2019-12-13 02:52:59.000000000 -0500
@@ -612,7 +612,7 @@ static int xcan_start_xmit_mailbox(struc
  *
  * Return: NETDEV_TX_OK on success and NETDEV_TX_BUSY when the tx queue is full
  */
-static int xcan_start_xmit(struct sk_buff *skb, struct net_device *ndev)
+static netdev_tx_t xcan_start_xmit(struct sk_buff *skb, struct net_device *ndev)
 {
 	struct xcan_priv *priv = netdev_priv(ndev);
 	int ret;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/net/dsa/mv88e6xxx/chip.c linux-libre-4.19.89-gnu/drivers/net/dsa/mv88e6xxx/chip.c
--- linux-libre-4.19.88-gnu/drivers/net/dsa/mv88e6xxx/chip.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/net/dsa/mv88e6xxx/chip.c	2019-12-13 02:52:59.000000000 -0500
@@ -2645,11 +2645,22 @@ static int mv88e6xxx_mdio_read(struct mi
 	mutex_unlock(&chip->reg_lock);
 
 	if (reg == MII_PHYSID2) {
-		/* Some internal PHYS don't have a model number.  Use
-		 * the mv88e6390 family model number instead.
-		 */
-		if (!(val & 0x3f0))
-			val |= MV88E6XXX_PORT_SWITCH_ID_PROD_6390 >> 4;
+		/* Some internal PHYs don't have a model number. */
+		if (chip->info->family != MV88E6XXX_FAMILY_6165)
+			/* Then there is the 6165 family. It gets is
+			 * PHYs correct. But it can also have two
+			 * SERDES interfaces in the PHY address
+			 * space. And these don't have a model
+			 * number. But they are not PHYs, so we don't
+			 * want to give them something a PHY driver
+			 * will recognise.
+			 *
+			 * Use the mv88e6390 family model number
+			 * instead, for anything which really could be
+			 * a PHY,
+			 */
+			if (!(val & 0x3f0))
+				val |= MV88E6XXX_PORT_SWITCH_ID_PROD_6390 >> 4;
 	}
 
 	return err ? err : val;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h linux-libre-4.19.89-gnu/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h
--- linux-libre-4.19.88-gnu/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/net/ethernet/aquantia/atlantic/aq_cfg.h	2019-12-13 02:52:59.000000000 -0500
@@ -42,8 +42,8 @@
 #define AQ_CFG_IS_LRO_DEF           1U
 
 /* RSS */
-#define AQ_CFG_RSS_INDIRECTION_TABLE_MAX  128U
-#define AQ_CFG_RSS_HASHKEY_SIZE           320U
+#define AQ_CFG_RSS_INDIRECTION_TABLE_MAX  64U
+#define AQ_CFG_RSS_HASHKEY_SIZE           40U
 
 #define AQ_CFG_IS_RSS_DEF           1U
 #define AQ_CFG_NUM_RSS_QUEUES_DEF   AQ_CFG_VECS_DEF
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/net/ethernet/aquantia/atlantic/aq_nic.c linux-libre-4.19.89-gnu/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
--- linux-libre-4.19.88-gnu/drivers/net/ethernet/aquantia/atlantic/aq_nic.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/net/ethernet/aquantia/atlantic/aq_nic.c	2019-12-13 02:52:59.000000000 -0500
@@ -44,7 +44,7 @@ static void aq_nic_rss_init(struct aq_ni
 	struct aq_rss_parameters *rss_params = &cfg->aq_rss;
 	int i = 0;
 
-	static u8 rss_key[40] = {
+	static u8 rss_key[AQ_CFG_RSS_HASHKEY_SIZE] = {
 		0x1e, 0xad, 0x71, 0x87, 0x65, 0xfc, 0x26, 0x7d,
 		0x0d, 0x45, 0x67, 0x74, 0xcd, 0x06, 0x1a, 0x18,
 		0xb6, 0xc1, 0xf0, 0xc7, 0xbb, 0x18, 0xbe, 0xf8,
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c linux-libre-4.19.89-gnu/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c
--- linux-libre-4.19.88-gnu/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c	2019-12-13 02:52:59.000000000 -0500
@@ -722,6 +722,10 @@ static int adapter_up(struct adapter *ad
 
 		if (adapter->flags & USING_MSIX)
 			name_msix_vecs(adapter);
+
+		/* Initialize hash mac addr list*/
+		INIT_LIST_HEAD(&adapter->mac_hlist);
+
 		adapter->flags |= FULL_INIT_DONE;
 	}
 
@@ -747,8 +751,6 @@ static int adapter_up(struct adapter *ad
 	enable_rx(adapter);
 	t4vf_sge_start(adapter);
 
-	/* Initialize hash mac addr list*/
-	INIT_LIST_HEAD(&adapter->mac_hlist);
 	return 0;
 }
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/net/ethernet/cirrus/ep93xx_eth.c linux-libre-4.19.89-gnu/drivers/net/ethernet/cirrus/ep93xx_eth.c
--- linux-libre-4.19.88-gnu/drivers/net/ethernet/cirrus/ep93xx_eth.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/net/ethernet/cirrus/ep93xx_eth.c	2019-12-13 02:52:59.000000000 -0500
@@ -767,6 +767,7 @@ static int ep93xx_eth_remove(struct plat
 {
 	struct net_device *dev;
 	struct ep93xx_priv *ep;
+	struct resource *mem;
 
 	dev = platform_get_drvdata(pdev);
 	if (dev == NULL)
@@ -782,8 +783,8 @@ static int ep93xx_eth_remove(struct plat
 		iounmap(ep->base_addr);
 
 	if (ep->res != NULL) {
-		release_resource(ep->res);
-		kfree(ep->res);
+		mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+		release_mem_region(mem->start, resource_size(mem));
 	}
 
 	free_netdev(dev);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/net/ethernet/huawei/hinic/hinic_main.c linux-libre-4.19.89-gnu/drivers/net/ethernet/huawei/hinic/hinic_main.c
--- linux-libre-4.19.88-gnu/drivers/net/ethernet/huawei/hinic/hinic_main.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/net/ethernet/huawei/hinic/hinic_main.c	2019-12-13 02:52:59.000000000 -0500
@@ -600,9 +600,6 @@ static int add_mac_addr(struct net_devic
 	u16 vid = 0;
 	int err;
 
-	if (!is_valid_ether_addr(addr))
-		return -EADDRNOTAVAIL;
-
 	netif_info(nic_dev, drv, netdev, "set mac addr = %02x %02x %02x %02x %02x %02x\n",
 		   addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
 
@@ -726,6 +723,7 @@ static void set_rx_mode(struct work_stru
 {
 	struct hinic_rx_mode_work *rx_mode_work = work_to_rx_mode_work(work);
 	struct hinic_dev *nic_dev = rx_mode_work_to_nic_dev(rx_mode_work);
+	struct netdev_hw_addr *ha;
 
 	netif_info(nic_dev, drv, nic_dev->netdev, "set rx mode work\n");
 
@@ -733,6 +731,9 @@ static void set_rx_mode(struct work_stru
 
 	__dev_uc_sync(nic_dev->netdev, add_mac_addr, remove_mac_addr);
 	__dev_mc_sync(nic_dev->netdev, add_mac_addr, remove_mac_addr);
+
+	netdev_for_each_mc_addr(ha, nic_dev->netdev)
+		add_mac_addr(nic_dev->netdev, ha->addr);
 }
 
 static void hinic_set_rx_mode(struct net_device *netdev)
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/net/ethernet/huawei/hinic/hinic_rx.c linux-libre-4.19.89-gnu/drivers/net/ethernet/huawei/hinic/hinic_rx.c
--- linux-libre-4.19.88-gnu/drivers/net/ethernet/huawei/hinic/hinic_rx.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/net/ethernet/huawei/hinic/hinic_rx.c	2019-12-13 02:52:59.000000000 -0500
@@ -207,9 +207,9 @@ skb_out:
 		wmb();  /* write all the wqes before update PI */
 
 		hinic_rq_update(rxq->rq, prod_idx);
+		tasklet_schedule(&rxq->rx_task);
 	}
 
-	tasklet_schedule(&rxq->rx_task);
 	return i;
 }
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/net/ethernet/intel/i40e/i40e_ethtool.c linux-libre-4.19.89-gnu/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
--- linux-libre-4.19.88-gnu/drivers/net/ethernet/intel/i40e/i40e_ethtool.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/net/ethernet/intel/i40e/i40e_ethtool.c	2019-12-13 02:52:59.000000000 -0500
@@ -1136,6 +1136,7 @@ static int i40e_set_pauseparam(struct ne
 	i40e_status status;
 	u8 aq_failures;
 	int err = 0;
+	u32 is_an;
 
 	/* Changing the port's flow control is not supported if this isn't the
 	 * port's controlling PF
@@ -1148,15 +1149,14 @@ static int i40e_set_pauseparam(struct ne
 	if (vsi != pf->vsi[pf->lan_vsi])
 		return -EOPNOTSUPP;
 
-	if (pause->autoneg != ((hw_link_info->an_info & I40E_AQ_AN_COMPLETED) ?
-	    AUTONEG_ENABLE : AUTONEG_DISABLE)) {
+	is_an = hw_link_info->an_info & I40E_AQ_AN_COMPLETED;
+	if (pause->autoneg != is_an) {
 		netdev_info(netdev, "To change autoneg please use: ethtool -s <dev> autoneg <on|off>\n");
 		return -EOPNOTSUPP;
 	}
 
 	/* If we have link and don't have autoneg */
-	if (!test_bit(__I40E_DOWN, pf->state) &&
-	    !(hw_link_info->an_info & I40E_AQ_AN_COMPLETED)) {
+	if (!test_bit(__I40E_DOWN, pf->state) && !is_an) {
 		/* Send message that it might not necessarily work*/
 		netdev_info(netdev, "Autoneg did not complete so changing settings may not result in an actual change.\n");
 	}
@@ -1207,7 +1207,7 @@ static int i40e_set_pauseparam(struct ne
 		err = -EAGAIN;
 	}
 
-	if (!test_bit(__I40E_DOWN, pf->state)) {
+	if (!test_bit(__I40E_DOWN, pf->state) && is_an) {
 		/* Give it a little more time to try to come back */
 		msleep(75);
 		if (!test_bit(__I40E_DOWN, pf->state))
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h linux-libre-4.19.89-gnu/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h
--- linux-libre-4.19.88-gnu/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/net/ethernet/intel/ice/ice_adminq_cmd.h	2019-12-13 02:52:59.000000000 -0500
@@ -1056,10 +1056,10 @@ struct ice_aqc_nvm {
 #define ICE_AQC_NVM_LAST_CMD		BIT(0)
 #define ICE_AQC_NVM_PCIR_REQ		BIT(0)	/* Used by NVM Update reply */
 #define ICE_AQC_NVM_PRESERVATION_S	1
-#define ICE_AQC_NVM_PRESERVATION_M	(3 << CSR_AQ_NVM_PRESERVATION_S)
-#define ICE_AQC_NVM_NO_PRESERVATION	(0 << CSR_AQ_NVM_PRESERVATION_S)
+#define ICE_AQC_NVM_PRESERVATION_M	(3 << ICE_AQC_NVM_PRESERVATION_S)
+#define ICE_AQC_NVM_NO_PRESERVATION	(0 << ICE_AQC_NVM_PRESERVATION_S)
 #define ICE_AQC_NVM_PRESERVE_ALL	BIT(1)
-#define ICE_AQC_NVM_PRESERVE_SELECTED	(3 << CSR_AQ_NVM_PRESERVATION_S)
+#define ICE_AQC_NVM_PRESERVE_SELECTED	(3 << ICE_AQC_NVM_PRESERVATION_S)
 #define ICE_AQC_NVM_FLASH_ONLY		BIT(7)
 	__le16 module_typeid;
 	__le16 length;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/net/ethernet/intel/ice/ice_switch.c linux-libre-4.19.89-gnu/drivers/net/ethernet/intel/ice/ice_switch.c
--- linux-libre-4.19.88-gnu/drivers/net/ethernet/intel/ice/ice_switch.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/net/ethernet/intel/ice/ice_switch.c	2019-12-13 02:52:59.000000000 -0500
@@ -1023,6 +1023,9 @@ ice_handle_vsi_list_mgmt(struct ice_hw *
 		u16 vsi_id = new_fltr->fwd_id.vsi_id;
 		enum ice_adminq_opc opcode;
 
+		if (!m_entry->vsi_list_info)
+			return ICE_ERR_CFG;
+
 		/* A rule already exists with the new VSI being added */
 		if (test_bit(vsi_id, m_entry->vsi_list_info->vsi_map))
 			return 0;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/net/ethernet/intel/ice/ice_txrx.c linux-libre-4.19.89-gnu/drivers/net/ethernet/intel/ice/ice_txrx.c
--- linux-libre-4.19.88-gnu/drivers/net/ethernet/intel/ice/ice_txrx.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/net/ethernet/intel/ice/ice_txrx.c	2019-12-13 02:52:59.000000000 -0500
@@ -1106,7 +1106,8 @@ int ice_napi_poll(struct napi_struct *na
 	napi_complete_done(napi, work_done);
 	if (test_bit(ICE_FLAG_MSIX_ENA, pf->flags))
 		ice_irq_dynamic_ena(&vsi->back->hw, vsi, q_vector);
-	return 0;
+
+	return min(work_done, budget - 1);
 }
 
 /* helper function for building cmd/type/offset */
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/net/ethernet/mellanox/mlx4/main.c linux-libre-4.19.89-gnu/drivers/net/ethernet/mellanox/mlx4/main.c
--- linux-libre-4.19.88-gnu/drivers/net/ethernet/mellanox/mlx4/main.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/net/ethernet/mellanox/mlx4/main.c	2019-12-13 02:52:59.000000000 -0500
@@ -313,7 +313,7 @@ int mlx4_check_port_params(struct mlx4_d
 		for (i = 0; i < dev->caps.num_ports - 1; i++) {
 			if (port_type[i] != port_type[i + 1]) {
 				mlx4_err(dev, "Only same port types supported on this HCA, aborting\n");
-				return -EINVAL;
+				return -EOPNOTSUPP;
 			}
 		}
 	}
@@ -322,7 +322,7 @@ int mlx4_check_port_params(struct mlx4_d
 		if (!(port_type[i] & dev->caps.supported_type[i+1])) {
 			mlx4_err(dev, "Requested port type for port %d is not supported on this HCA\n",
 				 i + 1);
-			return -EINVAL;
+			return -EOPNOTSUPP;
 		}
 	}
 	return 0;
@@ -1188,8 +1188,7 @@ static int __set_port_type(struct mlx4_p
 		mlx4_err(mdev,
 			 "Requested port type for port %d is not supported on this HCA\n",
 			 info->port);
-		err = -EINVAL;
-		goto err_sup;
+		return -EOPNOTSUPP;
 	}
 
 	mlx4_stop_sense(mdev);
@@ -1211,7 +1210,7 @@ static int __set_port_type(struct mlx4_p
 		for (i = 1; i <= mdev->caps.num_ports; i++) {
 			if (mdev->caps.possible_type[i] == MLX4_PORT_TYPE_AUTO) {
 				mdev->caps.possible_type[i] = mdev->caps.port_type[i];
-				err = -EINVAL;
+				err = -EOPNOTSUPP;
 			}
 		}
 	}
@@ -1237,7 +1236,7 @@ static int __set_port_type(struct mlx4_p
 out:
 	mlx4_start_sense(mdev);
 	mutex_unlock(&priv->port_mutex);
-err_sup:
+
 	return err;
 }
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/net/ethernet/mellanox/mlx5/core/qp.c linux-libre-4.19.89-gnu/drivers/net/ethernet/mellanox/mlx5/core/qp.c
--- linux-libre-4.19.88-gnu/drivers/net/ethernet/mellanox/mlx5/core/qp.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/net/ethernet/mellanox/mlx5/core/qp.c	2019-12-13 02:52:59.000000000 -0500
@@ -132,7 +132,7 @@ void mlx5_rsc_event(struct mlx5_core_dev
 	if (!is_event_type_allowed((rsn >> MLX5_USER_INDEX_LEN), event_type)) {
 		mlx5_core_warn(dev, "event 0x%.2x is not allowed on resource 0x%.8x\n",
 			       event_type, rsn);
-		return;
+		goto out;
 	}
 
 	switch (common->res) {
@@ -150,7 +150,7 @@ void mlx5_rsc_event(struct mlx5_core_dev
 	default:
 		mlx5_core_warn(dev, "invalid resource type for 0x%x\n", rsn);
 	}
-
+out:
 	mlx5_core_put_rsc(common);
 }
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c linux-libre-4.19.89-gnu/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
--- linux-libre-4.19.88-gnu/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c	2019-12-13 02:52:59.000000000 -0500
@@ -1215,15 +1215,12 @@ mlxsw_sp_ipip_entry_matches_decap(struct
 {
 	u32 ul_tb_id = l3mdev_fib_table(ul_dev) ? : RT_TABLE_MAIN;
 	enum mlxsw_sp_ipip_type ipipt = ipip_entry->ipipt;
-	struct net_device *ipip_ul_dev;
 
 	if (mlxsw_sp->router->ipip_ops_arr[ipipt]->ul_proto != ul_proto)
 		return false;
 
-	ipip_ul_dev = __mlxsw_sp_ipip_netdev_ul_dev_get(ipip_entry->ol_dev);
 	return mlxsw_sp_ipip_entry_saddr_matches(mlxsw_sp, ul_proto, ul_dip,
-						 ul_tb_id, ipip_entry) &&
-	       (!ipip_ul_dev || ipip_ul_dev == ul_dev);
+						 ul_tb_id, ipip_entry);
 }
 
 /* Given decap parameters, find the corresponding IPIP entry. */
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c linux-libre-4.19.89-gnu/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c
--- linux-libre-4.19.88-gnu/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c	2019-12-13 02:52:59.000000000 -0500
@@ -301,10 +301,13 @@ static int rmnet_changelink(struct net_d
 	struct rmnet_port *port;
 	u16 mux_id;
 
+	if (!dev)
+		return -ENODEV;
+
 	real_dev = __dev_get_by_index(dev_net(dev),
 				      nla_get_u32(tb[IFLA_LINK]));
 
-	if (!real_dev || !dev || !rmnet_is_real_dev_registered(real_dev))
+	if (!real_dev || !rmnet_is_real_dev_registered(real_dev))
 		return -ENODEV;
 
 	port = rmnet_get_port_rtnl(real_dev);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/net/ethernet/renesas/ravb.h linux-libre-4.19.89-gnu/drivers/net/ethernet/renesas/ravb.h
--- linux-libre-4.19.88-gnu/drivers/net/ethernet/renesas/ravb.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/net/ethernet/renesas/ravb.h	2019-12-13 02:52:59.000000000 -0500
@@ -1029,7 +1029,6 @@ struct ravb_private {
 	phy_interface_t phy_interface;
 	int msg_enable;
 	int speed;
-	int duplex;
 	int emac_irq;
 	enum ravb_chip_id chip_id;
 	int rx_irqs[NUM_RX_QUEUE];
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/net/ethernet/renesas/ravb_main.c linux-libre-4.19.89-gnu/drivers/net/ethernet/renesas/ravb_main.c
--- linux-libre-4.19.88-gnu/drivers/net/ethernet/renesas/ravb_main.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/net/ethernet/renesas/ravb_main.c	2019-12-13 02:52:59.000000000 -0500
@@ -82,13 +82,6 @@ static int ravb_config(struct net_device
 	return error;
 }
 
-static void ravb_set_duplex(struct net_device *ndev)
-{
-	struct ravb_private *priv = netdev_priv(ndev);
-
-	ravb_modify(ndev, ECMR, ECMR_DM, priv->duplex ? ECMR_DM : 0);
-}
-
 static void ravb_set_rate(struct net_device *ndev)
 {
 	struct ravb_private *priv = netdev_priv(ndev);
@@ -398,13 +391,11 @@ error:
 /* E-MAC init function */
 static void ravb_emac_init(struct net_device *ndev)
 {
-	struct ravb_private *priv = netdev_priv(ndev);
-
 	/* Receive frame limit set register */
 	ravb_write(ndev, ndev->mtu + ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN, RFLR);
 
 	/* EMAC Mode: PAUSE prohibition; Duplex; RX Checksum; TX; RX */
-	ravb_write(ndev, ECMR_ZPF | (priv->duplex ? ECMR_DM : 0) |
+	ravb_write(ndev, ECMR_ZPF | ECMR_DM |
 		   (ndev->features & NETIF_F_RXCSUM ? ECMR_RCSC : 0) |
 		   ECMR_TE | ECMR_RE, ECMR);
 
@@ -992,12 +983,6 @@ static void ravb_adjust_link(struct net_
 		ravb_rcv_snd_disable(ndev);
 
 	if (phydev->link) {
-		if (phydev->duplex != priv->duplex) {
-			new_state = true;
-			priv->duplex = phydev->duplex;
-			ravb_set_duplex(ndev);
-		}
-
 		if (phydev->speed != priv->speed) {
 			new_state = true;
 			priv->speed = phydev->speed;
@@ -1012,7 +997,6 @@ static void ravb_adjust_link(struct net_
 		new_state = true;
 		priv->link = 0;
 		priv->speed = 0;
-		priv->duplex = -1;
 	}
 
 	/* Enable TX and RX right over here, if E-MAC change is ignored */
@@ -1042,7 +1026,6 @@ static int ravb_phy_init(struct net_devi
 
 	priv->link = 0;
 	priv->speed = 0;
-	priv->duplex = -1;
 
 	/* Try connecting to PHY */
 	pn = of_parse_phandle(np, "phy-handle", 0);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/net/ethernet/ti/cpts.c linux-libre-4.19.89-gnu/drivers/net/ethernet/ti/cpts.c
--- linux-libre-4.19.88-gnu/drivers/net/ethernet/ti/cpts.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/net/ethernet/ti/cpts.c	2019-12-13 02:52:59.000000000 -0500
@@ -119,9 +119,7 @@ static bool cpts_match_tx_ts(struct cpts
 
 		if (time_after(jiffies, skb_cb->tmo)) {
 			/* timeout any expired skbs over 1s */
-			dev_dbg(cpts->dev,
-				"expiring tx timestamp mtype %u seqid %04x\n",
-				mtype, seqid);
+			dev_dbg(cpts->dev, "expiring tx timestamp from txq\n");
 			__skb_unlink(skb, &cpts->txq);
 			dev_consume_skb_any(skb);
 		}
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/net/wireless/intel/iwlwifi/iwl-prph.h linux-libre-4.19.89-gnu/drivers/net/wireless/intel/iwlwifi/iwl-prph.h
--- linux-libre-4.19.88-gnu/drivers/net/wireless/intel/iwlwifi/iwl-prph.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/net/wireless/intel/iwlwifi/iwl-prph.h	2019-12-13 02:52:59.000000000 -0500
@@ -8,6 +8,7 @@
  * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
  * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
  * Copyright(c) 2016        Intel Deutschland GmbH
+ * Copyright (C) 2018 Intel Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -35,6 +36,7 @@
  * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
  * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
  * Copyright(c) 2016        Intel Deutschland GmbH
+ * Copyright (C) 2018 Intel Corporation
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -399,6 +401,7 @@ enum aux_misc_master1_en {
 #define AUX_MISC_MASTER1_SMPHR_STATUS	0xA20800
 #define RSA_ENABLE			0xA24B08
 #define PREG_AUX_BUS_WPROT_0		0xA04CC0
+#define PREG_PRPH_WPROT_0		0xA04CE0
 #define SB_CPU_1_STATUS			0xA01E30
 #define SB_CPU_2_STATUS			0xA01E34
 #define UMAG_SB_CPU_1_STATUS		0xA038C0
@@ -425,4 +428,8 @@ enum {
 #define UREG_CHICK		(0xA05C00)
 #define UREG_CHICK_MSI_ENABLE	BIT(24)
 #define UREG_CHICK_MSIX_ENABLE	BIT(25)
+
+#define HPM_DEBUG			0xA03440
+#define PERSISTENCE_BIT			BIT(12)
+#define PREG_WFPM_ACCESS		BIT(12)
 #endif				/* __iwl_prph_h__ */
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c linux-libre-4.19.89-gnu/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
--- linux-libre-4.19.88-gnu/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c	2019-12-13 02:52:59.000000000 -0500
@@ -820,6 +820,21 @@ static void iwl_mvm_mac_tx(struct ieee80
 	    !ieee80211_is_bufferable_mmpdu(hdr->frame_control))
 		sta = NULL;
 
+	/* If there is no sta, and it's not offchannel - send through AP */
+	if (info->control.vif->type == NL80211_IFTYPE_STATION &&
+	    info->hw_queue != IWL_MVM_OFFCHANNEL_QUEUE && !sta) {
+		struct iwl_mvm_vif *mvmvif =
+			iwl_mvm_vif_from_mac80211(info->control.vif);
+		u8 ap_sta_id = READ_ONCE(mvmvif->ap_sta_id);
+
+		if (ap_sta_id < IWL_MVM_STATION_COUNT) {
+			/* mac80211 holds rcu read lock */
+			sta = rcu_dereference(mvm->fw_id_to_mac_id[ap_sta_id]);
+			if (IS_ERR_OR_NULL(sta))
+				goto drop;
+		}
+	}
+
 	if (sta) {
 		if (iwl_mvm_defer_tx(mvm, sta, skb))
 			return;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/net/wireless/intel/iwlwifi/mvm/sta.c linux-libre-4.19.89-gnu/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
--- linux-libre-4.19.88-gnu/drivers/net/wireless/intel/iwlwifi/mvm/sta.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/net/wireless/intel/iwlwifi/mvm/sta.c	2019-12-13 02:52:59.000000000 -0500
@@ -440,6 +440,16 @@ static int iwl_mvm_remove_sta_queue_mark
 
 	rcu_read_unlock();
 
+	/*
+	 * The TX path may have been using this TXQ_ID from the tid_data,
+	 * so make sure it's no longer running so that we can safely reuse
+	 * this TXQ later. We've set all the TIDs to IWL_MVM_INVALID_QUEUE
+	 * above, but nothing guarantees we've stopped using them. Thus,
+	 * without this, we could get to iwl_mvm_disable_txq() and remove
+	 * the queue while still sending frames to it.
+	 */
+	synchronize_net();
+
 	return disable_agg_tids;
 }
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/net/wireless/intel/iwlwifi/pcie/drv.c linux-libre-4.19.89-gnu/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
--- linux-libre-4.19.88-gnu/drivers/net/wireless/intel/iwlwifi/pcie/drv.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/net/wireless/intel/iwlwifi/pcie/drv.c	2019-12-13 02:52:59.000000000 -0500
@@ -888,7 +888,7 @@ static const struct pci_device_id iwl_hw
 	{IWL_PCI_DEVICE(0x34F0, 0x0040, iwl22000_2ax_cfg_hr)},
 	{IWL_PCI_DEVICE(0x34F0, 0x0070, iwl22000_2ax_cfg_hr)},
 	{IWL_PCI_DEVICE(0x34F0, 0x0078, iwl22000_2ax_cfg_hr)},
-	{IWL_PCI_DEVICE(0x34F0, 0x0310, iwl22000_2ac_cfg_jf)},
+	{IWL_PCI_DEVICE(0x34F0, 0x0310, iwl22000_2ax_cfg_hr)},
 	{IWL_PCI_DEVICE(0x40C0, 0x0000, iwl22560_2ax_cfg_su_cdb)},
 	{IWL_PCI_DEVICE(0x40C0, 0x0010, iwl22560_2ax_cfg_su_cdb)},
 	{IWL_PCI_DEVICE(0x40c0, 0x0090, iwl22560_2ax_cfg_su_cdb)},
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/net/wireless/intel/iwlwifi/pcie/trans.c linux-libre-4.19.89-gnu/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
--- linux-libre-4.19.88-gnu/drivers/net/wireless/intel/iwlwifi/pcie/trans.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/net/wireless/intel/iwlwifi/pcie/trans.c	2019-12-13 02:52:59.000000000 -0500
@@ -1747,6 +1747,7 @@ static int iwl_pcie_init_msix_handler(st
 static int _iwl_trans_pcie_start_hw(struct iwl_trans *trans, bool low_power)
 {
 	struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
+	u32 hpm;
 	int err;
 
 	lockdep_assert_held(&trans_pcie->mutex);
@@ -1757,6 +1758,17 @@ static int _iwl_trans_pcie_start_hw(stru
 		return err;
 	}
 
+	hpm = iwl_trans_read_prph(trans, HPM_DEBUG);
+	if (hpm != 0xa5a5a5a0 && (hpm & PERSISTENCE_BIT)) {
+		if (iwl_trans_read_prph(trans, PREG_PRPH_WPROT_0) &
+		    PREG_WFPM_ACCESS) {
+			IWL_ERR(trans,
+				"Error, can not clear persistence bit\n");
+			return -EPERM;
+		}
+		iwl_trans_write_prph(trans, HPM_DEBUG, hpm & ~PERSISTENCE_BIT);
+	}
+
 	iwl_trans_pcie_sw_reset(trans);
 
 	err = iwl_pcie_apm_init(trans);
@@ -3403,8 +3415,26 @@ struct iwl_trans *iwl_trans_pcie_alloc(s
 #if IS_ENABLED(CONFIG_IWLMVM)
 	trans->hw_rf_id = iwl_read32(trans, CSR_HW_RF_ID);
 
-	if (CSR_HW_RF_ID_TYPE_CHIP_ID(trans->hw_rf_id) ==
-	    CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_HR)) {
+	if (cfg == &iwl22000_2ax_cfg_hr) {
+		if (CSR_HW_RF_ID_TYPE_CHIP_ID(trans->hw_rf_id) ==
+		    CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_HR)) {
+			trans->cfg = &iwl22000_2ax_cfg_hr;
+		} else if (CSR_HW_RF_ID_TYPE_CHIP_ID(trans->hw_rf_id) ==
+			   CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_JF)) {
+			trans->cfg = &iwl22000_2ax_cfg_jf;
+		} else if (CSR_HW_RF_ID_TYPE_CHIP_ID(trans->hw_rf_id) ==
+			   CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_HRCDB)) {
+			IWL_ERR(trans, "RF ID HRCDB is not supported\n");
+			ret = -EINVAL;
+			goto out_no_pci;
+		} else {
+			IWL_ERR(trans, "Unrecognized RF ID 0x%08x\n",
+				CSR_HW_RF_ID_TYPE_CHIP_ID(trans->hw_rf_id));
+			ret = -EINVAL;
+			goto out_no_pci;
+		}
+	} else if (CSR_HW_RF_ID_TYPE_CHIP_ID(trans->hw_rf_id) ==
+		   CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_HR)) {
 		u32 hw_status;
 
 		hw_status = iwl_read_prph(trans, UMAG_GEN_HW_STATUS);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c linux-libre-4.19.89-gnu/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c
--- linux-libre-4.19.88-gnu/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c	2019-12-13 02:52:59.000000000 -0500
@@ -242,27 +242,23 @@ static int iwl_pcie_gen2_build_amsdu(str
 	struct ieee80211_hdr *hdr = (void *)skb->data;
 	unsigned int snap_ip_tcp_hdrlen, ip_hdrlen, total_len, hdr_room;
 	unsigned int mss = skb_shinfo(skb)->gso_size;
-	u16 length, iv_len, amsdu_pad;
+	u16 length, amsdu_pad;
 	u8 *start_hdr;
 	struct iwl_tso_hdr_page *hdr_page;
 	struct page **page_ptr;
 	struct tso_t tso;
 
-	/* if the packet is protected, then it must be CCMP or GCMP */
-	iv_len = ieee80211_has_protected(hdr->frame_control) ?
-		IEEE80211_CCMP_HDR_LEN : 0;
-
 	trace_iwlwifi_dev_tx(trans->dev, skb, tfd, sizeof(*tfd),
 			     &dev_cmd->hdr, start_len, 0);
 
 	ip_hdrlen = skb_transport_header(skb) - skb_network_header(skb);
 	snap_ip_tcp_hdrlen = 8 + ip_hdrlen + tcp_hdrlen(skb);
-	total_len = skb->len - snap_ip_tcp_hdrlen - hdr_len - iv_len;
+	total_len = skb->len - snap_ip_tcp_hdrlen - hdr_len;
 	amsdu_pad = 0;
 
 	/* total amount of header we may need for this A-MSDU */
 	hdr_room = DIV_ROUND_UP(total_len, mss) *
-		(3 + snap_ip_tcp_hdrlen + sizeof(struct ethhdr)) + iv_len;
+		(3 + snap_ip_tcp_hdrlen + sizeof(struct ethhdr));
 
 	/* Our device supports 9 segments at most, it will fit in 1 page */
 	hdr_page = get_page_hdr(trans, hdr_room);
@@ -273,14 +269,12 @@ static int iwl_pcie_gen2_build_amsdu(str
 	start_hdr = hdr_page->pos;
 	page_ptr = (void *)((u8 *)skb->cb + trans_pcie->page_offs);
 	*page_ptr = hdr_page->page;
-	memcpy(hdr_page->pos, skb->data + hdr_len, iv_len);
-	hdr_page->pos += iv_len;
 
 	/*
-	 * Pull the ieee80211 header + IV to be able to use TSO core,
+	 * Pull the ieee80211 header to be able to use TSO core,
 	 * we will restore it for the tx_status flow.
 	 */
-	skb_pull(skb, hdr_len + iv_len);
+	skb_pull(skb, hdr_len);
 
 	/*
 	 * Remove the length of all the headers that we don't actually
@@ -355,8 +349,8 @@ static int iwl_pcie_gen2_build_amsdu(str
 		}
 	}
 
-	/* re -add the WiFi header and IV */
-	skb_push(skb, hdr_len + iv_len);
+	/* re -add the WiFi header */
+	skb_push(skb, hdr_len);
 
 	return 0;
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/net/wireless/marvell/mwifiex/main.c linux-libre-4.19.89-gnu/drivers/net/wireless/marvell/mwifiex/main.c
--- linux-libre-4.19.88-gnu/drivers/net/wireless/marvell/mwifiex/main.c	2019-12-05 06:41:08.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/net/wireless/marvell/mwifiex/main.c	2019-12-13 17:59:43.000000000 -0500
@@ -960,10 +960,10 @@ int mwifiex_set_mac_address(struct mwifi
 
 		mac_addr = old_mac_addr;
 
-		if (priv->bss_type == MWIFIEX_BSS_TYPE_P2P)
+		if (priv->bss_type == MWIFIEX_BSS_TYPE_P2P) {
 			mac_addr |= BIT_ULL(MWIFIEX_MAC_LOCAL_ADMIN_BIT);
-
-		if (mwifiex_get_intf_num(priv->adapter, priv->bss_type) > 1) {
+			mac_addr += priv->bss_num;
+		} else if (priv->adapter->priv[0] != priv) {
 			/* Set mac address based on bss_type/bss_num */
 			mac_addr ^= BIT_ULL(priv->bss_type + 8);
 			mac_addr += priv->bss_num;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/net/wireless/rsi/rsi_91x_mgmt.c linux-libre-4.19.89-gnu/drivers/net/wireless/rsi/rsi_91x_mgmt.c
--- linux-libre-4.19.88-gnu/drivers/net/wireless/rsi/rsi_91x_mgmt.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/net/wireless/rsi/rsi_91x_mgmt.c	2019-12-13 02:52:59.000000000 -0500
@@ -1583,6 +1583,7 @@ static int rsi_send_beacon(struct rsi_co
 		skb_pull(skb, (64 - dword_align_bytes));
 	if (rsi_prepare_beacon(common, skb)) {
 		rsi_dbg(ERR_ZONE, "Failed to prepare beacon\n");
+		dev_kfree_skb(skb);
 		return -EINVAL;
 	}
 	skb_queue_tail(&common->tx_queue[MGMT_BEACON_Q], skb);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/nfc/nxp-nci/i2c.c linux-libre-4.19.89-gnu/drivers/nfc/nxp-nci/i2c.c
--- linux-libre-4.19.88-gnu/drivers/nfc/nxp-nci/i2c.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/nfc/nxp-nci/i2c.c	2019-12-13 02:52:59.000000000 -0500
@@ -236,8 +236,10 @@ static irqreturn_t nxp_nci_i2c_irq_threa
 
 	if (r == -EREMOTEIO) {
 		phy->hard_fault = r;
-		skb = NULL;
-	} else if (r < 0) {
+		if (info->mode == NXP_NCI_MODE_FW)
+			nxp_nci_fw_recv_frame(phy->ndev, NULL);
+	}
+	if (r < 0) {
 		nfc_err(&client->dev, "Read failed with error %d\n", r);
 		goto exit_irq_handled;
 	}
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/nvme/host/core.c linux-libre-4.19.89-gnu/drivers/nvme/host/core.c
--- linux-libre-4.19.88-gnu/drivers/nvme/host/core.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/nvme/host/core.c	2019-12-13 02:52:59.000000000 -0500
@@ -3652,7 +3652,7 @@ int nvme_init_ctrl(struct nvme_ctrl *ctr
 
 	return 0;
 out_free_name:
-	kfree_const(dev->kobj.name);
+	kfree_const(ctrl->device->kobj.name);
 out_release_instance:
 	ida_simple_remove(&nvme_instance_ida, ctrl->instance);
 out:
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/pinctrl/qcom/pinctrl-ssbi-gpio.c linux-libre-4.19.89-gnu/drivers/pinctrl/qcom/pinctrl-ssbi-gpio.c
--- linux-libre-4.19.88-gnu/drivers/pinctrl/qcom/pinctrl-ssbi-gpio.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/pinctrl/qcom/pinctrl-ssbi-gpio.c	2019-12-13 02:52:59.000000000 -0500
@@ -762,12 +762,23 @@ static int pm8xxx_gpio_probe(struct plat
 		return ret;
 	}
 
-	ret = gpiochip_add_pin_range(&pctrl->chip,
-				     dev_name(pctrl->dev),
-				     0, 0, pctrl->chip.ngpio);
-	if (ret) {
-		dev_err(pctrl->dev, "failed to add pin range\n");
-		goto unregister_gpiochip;
+	/*
+	 * For DeviceTree-supported systems, the gpio core checks the
+	 * pinctrl's device node for the "gpio-ranges" property.
+	 * If it is present, it takes care of adding the pin ranges
+	 * for the driver. In this case the driver can skip ahead.
+	 *
+	 * In order to remain compatible with older, existing DeviceTree
+	 * files which don't set the "gpio-ranges" property or systems that
+	 * utilize ACPI the driver has to call gpiochip_add_pin_range().
+	 */
+	if (!of_property_read_bool(pctrl->dev->of_node, "gpio-ranges")) {
+		ret = gpiochip_add_pin_range(&pctrl->chip, dev_name(pctrl->dev),
+					     0, 0, pctrl->chip.ngpio);
+		if (ret) {
+			dev_err(pctrl->dev, "failed to add pin range\n");
+			goto unregister_gpiochip;
+		}
 	}
 
 	platform_set_drvdata(pdev, pctrl);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/rtc/rtc-max77686.c linux-libre-4.19.89-gnu/drivers/rtc/rtc-max77686.c
--- linux-libre-4.19.88-gnu/drivers/rtc/rtc-max77686.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/rtc/rtc-max77686.c	2019-12-13 02:52:59.000000000 -0500
@@ -360,7 +360,7 @@ static int max77686_rtc_read_time(struct
 
 out:
 	mutex_unlock(&info->lock);
-	return 0;
+	return ret;
 }
 
 static int max77686_rtc_set_time(struct device *dev, struct rtc_time *tm)
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/rtc/rtc-max8997.c linux-libre-4.19.89-gnu/drivers/rtc/rtc-max8997.c
--- linux-libre-4.19.88-gnu/drivers/rtc/rtc-max8997.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/rtc/rtc-max8997.c	2019-12-13 02:52:59.000000000 -0500
@@ -215,7 +215,7 @@ static int max8997_rtc_read_alarm(struct
 
 out:
 	mutex_unlock(&info->lock);
-	return 0;
+	return ret;
 }
 
 static int max8997_rtc_stop_alarm(struct max8997_rtc_info *info)
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/rtc/rtc-s3c.c linux-libre-4.19.89-gnu/drivers/rtc/rtc-s3c.c
--- linux-libre-4.19.88-gnu/drivers/rtc/rtc-s3c.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/rtc/rtc-s3c.c	2019-12-13 02:52:59.000000000 -0500
@@ -327,7 +327,6 @@ static int s3c_rtc_setalarm(struct devic
 	struct rtc_time *tm = &alrm->time;
 	unsigned int alrm_en;
 	int ret;
-	int year = tm->tm_year - 100;
 
 	dev_dbg(dev, "s3c_rtc_setalarm: %d, %04d.%02d.%02d %02d:%02d:%02d\n",
 		alrm->enabled,
@@ -356,11 +355,6 @@ static int s3c_rtc_setalarm(struct devic
 		writeb(bin2bcd(tm->tm_hour), info->base + S3C2410_ALMHOUR);
 	}
 
-	if (year < 100 && year >= 0) {
-		alrm_en |= S3C2410_RTCALM_YEAREN;
-		writeb(bin2bcd(year), info->base + S3C2410_ALMYEAR);
-	}
-
 	if (tm->tm_mon < 12 && tm->tm_mon >= 0) {
 		alrm_en |= S3C2410_RTCALM_MONEN;
 		writeb(bin2bcd(tm->tm_mon + 1), info->base + S3C2410_ALMMON);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/s390/scsi/zfcp_erp.c linux-libre-4.19.89-gnu/drivers/s390/scsi/zfcp_erp.c
--- linux-libre-4.19.88-gnu/drivers/s390/scsi/zfcp_erp.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/s390/scsi/zfcp_erp.c	2019-12-13 02:52:59.000000000 -0500
@@ -172,9 +172,6 @@ static int zfcp_erp_handle_failed(int wa
 				adapter, ZFCP_STATUS_COMMON_ERP_FAILED);
 		}
 		break;
-	default:
-		need = 0;
-		break;
 	}
 
 	return need;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/s390/scsi/zfcp_fsf.c linux-libre-4.19.89-gnu/drivers/s390/scsi/zfcp_fsf.c
--- linux-libre-4.19.88-gnu/drivers/s390/scsi/zfcp_fsf.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/s390/scsi/zfcp_fsf.c	2019-12-13 02:52:59.000000000 -0500
@@ -2104,11 +2104,8 @@ static void zfcp_fsf_fcp_handler_common(
 		break;
 	case FSF_CMND_LENGTH_NOT_VALID:
 		dev_err(&req->adapter->ccw_device->dev,
-			"Incorrect CDB length %d, LUN 0x%016Lx on "
-			"port 0x%016Lx closed\n",
-			req->qtcb->bottom.io.fcp_cmnd_length,
-			(unsigned long long)zfcp_scsi_dev_lun(sdev),
-			(unsigned long long)zfcp_sdev->port->wwpn);
+			"Incorrect FCP_CMND length %d, FCP device closed\n",
+			req->qtcb->bottom.io.fcp_cmnd_length);
 		zfcp_erp_adapter_shutdown(req->adapter, 0, "fssfch4");
 		req->status |= ZFCP_STATUS_FSFREQ_ERROR;
 		break;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/slimbus/qcom-ngd-ctrl.c linux-libre-4.19.89-gnu/drivers/slimbus/qcom-ngd-ctrl.c
--- linux-libre-4.19.88-gnu/drivers/slimbus/qcom-ngd-ctrl.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/slimbus/qcom-ngd-ctrl.c	2019-12-13 02:52:59.000000000 -0500
@@ -1326,11 +1326,12 @@ static int of_qcom_slim_ngd_register(str
 {
 	const struct ngd_reg_offset_data *data;
 	struct qcom_slim_ngd *ngd;
+	const struct of_device_id *match;
 	struct device_node *node;
 	u32 id;
 
-	data = of_match_node(qcom_slim_ngd_dt_match, parent->of_node)->data;
-
+	match = of_match_node(qcom_slim_ngd_dt_match, parent->of_node);
+	data = match->data;
 	for_each_available_child_of_node(parent->of_node, node) {
 		if (of_property_read_u32(node, "reg", &id))
 			continue;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/soc/Makefile linux-libre-4.19.89-gnu/drivers/soc/Makefile
--- linux-libre-4.19.88-gnu/drivers/soc/Makefile	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/soc/Makefile	2019-12-13 02:52:59.000000000 -0500
@@ -13,7 +13,7 @@ obj-$(CONFIG_ARCH_GEMINI)	+= gemini/
 obj-$(CONFIG_ARCH_MXC)		+= imx/
 obj-$(CONFIG_SOC_XWAY)		+= lantiq/
 obj-y				+= mediatek/
-obj-$(CONFIG_ARCH_MESON)	+= amlogic/
+obj-y				+= amlogic/
 obj-y				+= qcom/
 obj-y				+= renesas/
 obj-$(CONFIG_ARCH_ROCKCHIP)	+= rockchip/
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/soc/renesas/r8a77970-sysc.c linux-libre-4.19.89-gnu/drivers/soc/renesas/r8a77970-sysc.c
--- linux-libre-4.19.88-gnu/drivers/soc/renesas/r8a77970-sysc.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/soc/renesas/r8a77970-sysc.c	2019-12-13 02:52:59.000000000 -0500
@@ -27,8 +27,8 @@ static const struct rcar_sysc_area r8a77
 	{ "a3ir",	0x180, 0, R8A77970_PD_A3IR,	R8A77970_PD_ALWAYS_ON },
 	{ "a2ir0",	0x400, 0, R8A77970_PD_A2IR0,	R8A77970_PD_A3IR },
 	{ "a2ir1",	0x400, 1, R8A77970_PD_A2IR1,	R8A77970_PD_A3IR },
-	{ "a2ir2",	0x400, 2, R8A77970_PD_A2IR2,	R8A77970_PD_A3IR },
-	{ "a2ir3",	0x400, 3, R8A77970_PD_A2IR3,	R8A77970_PD_A3IR },
+	{ "a2dp",	0x400, 2, R8A77970_PD_A2DP,	R8A77970_PD_A3IR },
+	{ "a2cn",	0x400, 3, R8A77970_PD_A2CN,	R8A77970_PD_A3IR },
 	{ "a2sc0",	0x400, 4, R8A77970_PD_A2SC0,	R8A77970_PD_A3IR },
 	{ "a2sc1",	0x400, 5, R8A77970_PD_A2SC1,	R8A77970_PD_A3IR },
 };
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/soc/renesas/r8a77980-sysc.c linux-libre-4.19.89-gnu/drivers/soc/renesas/r8a77980-sysc.c
--- linux-libre-4.19.88-gnu/drivers/soc/renesas/r8a77980-sysc.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/soc/renesas/r8a77980-sysc.c	2019-12-13 02:52:59.000000000 -0500
@@ -38,12 +38,12 @@ static const struct rcar_sysc_area r8a77
 	{ "a2sc2",	0x400, 8, R8A77980_PD_A2SC2,	R8A77980_PD_A3IR },
 	{ "a2sc3",	0x400, 9, R8A77980_PD_A2SC3,	R8A77980_PD_A3IR },
 	{ "a2sc4",	0x400, 10, R8A77980_PD_A2SC4,	R8A77980_PD_A3IR },
-	{ "a2pd0",	0x400, 11, R8A77980_PD_A2PD0,	R8A77980_PD_A3IR },
-	{ "a2pd1",	0x400, 12, R8A77980_PD_A2PD1,	R8A77980_PD_A3IR },
+	{ "a2dp0",	0x400, 11, R8A77980_PD_A2DP0,	R8A77980_PD_A3IR },
+	{ "a2dp1",	0x400, 12, R8A77980_PD_A2DP1,	R8A77980_PD_A3IR },
 	{ "a2cn",	0x400, 13, R8A77980_PD_A2CN,	R8A77980_PD_A3IR },
-	{ "a3vip",	0x2c0, 0, R8A77980_PD_A3VIP,	R8A77980_PD_ALWAYS_ON },
-	{ "a3vip1",	0x300, 0, R8A77980_PD_A3VIP1,	R8A77980_PD_A3VIP },
-	{ "a3vip2",	0x280, 0, R8A77980_PD_A3VIP2,	R8A77980_PD_A3VIP },
+	{ "a3vip0",	0x2c0, 0, R8A77980_PD_A3VIP0,	R8A77980_PD_ALWAYS_ON },
+	{ "a3vip1",	0x300, 0, R8A77980_PD_A3VIP1,	R8A77980_PD_ALWAYS_ON },
+	{ "a3vip2",	0x280, 0, R8A77980_PD_A3VIP2,	R8A77980_PD_ALWAYS_ON },
 };
 
 const struct rcar_sysc_info r8a77980_sysc_info __initconst = {
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/soc/renesas/r8a77990-sysc.c linux-libre-4.19.89-gnu/drivers/soc/renesas/r8a77990-sysc.c
--- linux-libre-4.19.88-gnu/drivers/soc/renesas/r8a77990-sysc.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/soc/renesas/r8a77990-sysc.c	2019-12-13 02:52:59.000000000 -0500
@@ -28,19 +28,6 @@ static struct rcar_sysc_area r8a77990_ar
 	{ "3dg-b",	0x100, 1, R8A77990_PD_3DG_B,	R8A77990_PD_3DG_A },
 };
 
-static void __init rcar_sysc_fix_parent(struct rcar_sysc_area *areas,
-					unsigned int num_areas, u8 id,
-					int new_parent)
-{
-	unsigned int i;
-
-	for (i = 0; i < num_areas; i++)
-		if (areas[i].isr_bit == id) {
-			areas[i].parent = new_parent;
-			return;
-		}
-}
-
 /* Fixups for R-Car E3 ES1.0 revision */
 static const struct soc_device_attribute r8a77990[] __initconst = {
 	{ .soc_id = "r8a77990", .revision = "ES1.0" },
@@ -50,12 +37,10 @@ static const struct soc_device_attribute
 static int __init r8a77990_sysc_init(void)
 {
 	if (soc_device_match(r8a77990)) {
-		rcar_sysc_fix_parent(r8a77990_areas,
-				     ARRAY_SIZE(r8a77990_areas),
-				     R8A77990_PD_3DG_A, R8A77990_PD_3DG_B);
-		rcar_sysc_fix_parent(r8a77990_areas,
-				     ARRAY_SIZE(r8a77990_areas),
-				     R8A77990_PD_3DG_B, R8A77990_PD_ALWAYS_ON);
+		/* Fix incorrect 3DG hierarchy */
+		swap(r8a77990_areas[7], r8a77990_areas[8]);
+		r8a77990_areas[7].parent = R8A77990_PD_ALWAYS_ON;
+		r8a77990_areas[8].parent = R8A77990_PD_3DG_B;
 	}
 
 	return 0;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/spi/spi-atmel.c linux-libre-4.19.89-gnu/drivers/spi/spi-atmel.c
--- linux-libre-4.19.88-gnu/drivers/spi/spi-atmel.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/spi/spi-atmel.c	2019-12-13 02:52:59.000000000 -0500
@@ -1193,10 +1193,8 @@ static int atmel_spi_setup(struct spi_de
 	as = spi_master_get_devdata(spi->master);
 
 	/* see notes above re chipselect */
-	if (!atmel_spi_is_v2(as)
-			&& spi->chip_select == 0
-			&& (spi->mode & SPI_CS_HIGH)) {
-		dev_dbg(&spi->dev, "setup: can't be active-high\n");
+	if (!as->use_cs_gpios && (spi->mode & SPI_CS_HIGH)) {
+		dev_warn(&spi->dev, "setup: non GPIO CS can't be active-high\n");
 		return -EINVAL;
 	}
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/staging/iio/addac/adt7316-i2c.c linux-libre-4.19.89-gnu/drivers/staging/iio/addac/adt7316-i2c.c
--- linux-libre-4.19.88-gnu/drivers/staging/iio/addac/adt7316-i2c.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/staging/iio/addac/adt7316-i2c.c	2019-12-13 02:52:59.000000000 -0500
@@ -35,6 +35,8 @@ static int adt7316_i2c_read(void *client
 		return ret;
 	}
 
+	*data = ret;
+
 	return 0;
 }
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/thermal/thermal_core.c linux-libre-4.19.89-gnu/drivers/thermal/thermal_core.c
--- linux-libre-4.19.88-gnu/drivers/thermal/thermal_core.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/thermal/thermal_core.c	2019-12-13 02:52:59.000000000 -0500
@@ -296,7 +296,7 @@ static void thermal_zone_device_set_poll
 		mod_delayed_work(system_freezable_wq, &tz->poll_queue,
 				 msecs_to_jiffies(delay));
 	else
-		cancel_delayed_work_sync(&tz->poll_queue);
+		cancel_delayed_work(&tz->poll_queue);
 }
 
 static void monitor_thermal_zone(struct thermal_zone_device *tz)
@@ -1349,7 +1349,7 @@ void thermal_zone_device_unregister(stru
 
 	mutex_unlock(&thermal_list_lock);
 
-	thermal_zone_device_set_polling(tz, 0);
+	cancel_delayed_work_sync(&tz->poll_queue);
 
 	thermal_set_governor(tz, NULL);
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/tty/n_hdlc.c linux-libre-4.19.89-gnu/drivers/tty/n_hdlc.c
--- linux-libre-4.19.88-gnu/drivers/tty/n_hdlc.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/tty/n_hdlc.c	2019-12-13 02:52:59.000000000 -0500
@@ -613,7 +613,7 @@ static ssize_t n_hdlc_tty_read(struct tt
 		}
 			
 		/* no data */
-		if (file->f_flags & O_NONBLOCK) {
+		if (tty_io_nonblock(tty, file)) {
 			ret = -EAGAIN;
 			break;
 		}
@@ -680,7 +680,7 @@ static ssize_t n_hdlc_tty_write(struct t
 		if (tbuf)
 			break;
 
-		if (file->f_flags & O_NONBLOCK) {
+		if (tty_io_nonblock(tty, file)) {
 			error = -EAGAIN;
 			break;
 		}
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/tty/n_r3964.c linux-libre-4.19.89-gnu/drivers/tty/n_r3964.c
--- linux-libre-4.19.88-gnu/drivers/tty/n_r3964.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/tty/n_r3964.c	2019-12-13 02:52:59.000000000 -0500
@@ -1078,7 +1078,7 @@ static ssize_t r3964_read(struct tty_str
 		pMsg = remove_msg(pInfo, pClient);
 		if (pMsg == NULL) {
 			/* no messages available. */
-			if (file->f_flags & O_NONBLOCK) {
+			if (tty_io_nonblock(tty, file)) {
 				ret = -EAGAIN;
 				goto unlock;
 			}
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/tty/n_tty.c linux-libre-4.19.89-gnu/drivers/tty/n_tty.c
--- linux-libre-4.19.88-gnu/drivers/tty/n_tty.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/tty/n_tty.c	2019-12-13 02:52:59.000000000 -0500
@@ -1702,7 +1702,7 @@ n_tty_receive_buf_common(struct tty_stru
 
 	down_read(&tty->termios_rwsem);
 
-	while (1) {
+	do {
 		/*
 		 * When PARMRK is set, each input char may take up to 3 chars
 		 * in the read buf; reduce the buffer space avail by 3x
@@ -1744,7 +1744,7 @@ n_tty_receive_buf_common(struct tty_stru
 			fp += n;
 		count -= n;
 		rcvd += n;
-	}
+	} while (!test_bit(TTY_LDISC_CHANGING, &tty->flags));
 
 	tty->receive_room = room;
 
@@ -2211,7 +2211,7 @@ static ssize_t n_tty_read(struct tty_str
 					break;
 				if (!timeout)
 					break;
-				if (file->f_flags & O_NONBLOCK) {
+				if (tty_io_nonblock(tty, file)) {
 					retval = -EAGAIN;
 					break;
 				}
@@ -2365,7 +2365,7 @@ static ssize_t n_tty_write(struct tty_st
 		}
 		if (!nr)
 			break;
-		if (file->f_flags & O_NONBLOCK) {
+		if (tty_io_nonblock(tty, file)) {
 			retval = -EAGAIN;
 			break;
 		}
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/tty/serial/amba-pl011.c linux-libre-4.19.89-gnu/drivers/tty/serial/amba-pl011.c
--- linux-libre-4.19.88-gnu/drivers/tty/serial/amba-pl011.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/tty/serial/amba-pl011.c	2019-12-13 02:52:59.000000000 -0500
@@ -813,10 +813,8 @@ __acquires(&uap->port.lock)
 	if (!uap->using_tx_dma)
 		return;
 
-	/* Avoid deadlock with the DMA engine callback */
-	spin_unlock(&uap->port.lock);
-	dmaengine_terminate_all(uap->dmatx.chan);
-	spin_lock(&uap->port.lock);
+	dmaengine_terminate_async(uap->dmatx.chan);
+
 	if (uap->dmatx.queued) {
 		dma_unmap_sg(uap->dmatx.chan->device->dev, &uap->dmatx.sg, 1,
 			     DMA_TO_DEVICE);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/tty/serial/fsl_lpuart.c linux-libre-4.19.89-gnu/drivers/tty/serial/fsl_lpuart.c
--- linux-libre-4.19.88-gnu/drivers/tty/serial/fsl_lpuart.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/tty/serial/fsl_lpuart.c	2019-12-13 02:52:59.000000000 -0500
@@ -376,8 +376,8 @@ static void lpuart_dma_tx(struct lpuart_
 	}
 
 	sport->dma_tx_desc = dmaengine_prep_slave_sg(sport->dma_tx_chan, sgl,
-					sport->dma_tx_nents,
-					DMA_MEM_TO_DEV, DMA_PREP_INTERRUPT);
+					ret, DMA_MEM_TO_DEV,
+					DMA_PREP_INTERRUPT);
 	if (!sport->dma_tx_desc) {
 		dma_unmap_sg(dev, sgl, sport->dma_tx_nents, DMA_TO_DEVICE);
 		dev_err(dev, "Cannot prepare TX slave DMA!\n");
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/tty/serial/ifx6x60.c linux-libre-4.19.89-gnu/drivers/tty/serial/ifx6x60.c
--- linux-libre-4.19.88-gnu/drivers/tty/serial/ifx6x60.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/tty/serial/ifx6x60.c	2019-12-13 02:52:59.000000000 -0500
@@ -1230,6 +1230,9 @@ static int ifx_spi_spi_remove(struct spi
 	struct ifx_spi_device *ifx_dev = spi_get_drvdata(spi);
 	/* stop activity */
 	tasklet_kill(&ifx_dev->io_work_tasklet);
+
+	pm_runtime_disable(&spi->dev);
+
 	/* free irq */
 	free_irq(gpio_to_irq(ifx_dev->gpio.reset_out), ifx_dev);
 	free_irq(gpio_to_irq(ifx_dev->gpio.srdy), ifx_dev);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/tty/serial/imx.c linux-libre-4.19.89-gnu/drivers/tty/serial/imx.c
--- linux-libre-4.19.88-gnu/drivers/tty/serial/imx.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/tty/serial/imx.c	2019-12-13 02:52:59.000000000 -0500
@@ -2071,7 +2071,7 @@ imx_uart_console_setup(struct console *c
 
 	retval = clk_prepare(sport->clk_per);
 	if (retval)
-		clk_disable_unprepare(sport->clk_ipg);
+		clk_unprepare(sport->clk_ipg);
 
 error_console:
 	return retval;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/tty/serial/msm_serial.c linux-libre-4.19.89-gnu/drivers/tty/serial/msm_serial.c
--- linux-libre-4.19.88-gnu/drivers/tty/serial/msm_serial.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/tty/serial/msm_serial.c	2019-12-13 02:52:59.000000000 -0500
@@ -980,6 +980,7 @@ static unsigned int msm_get_mctrl(struct
 static void msm_reset(struct uart_port *port)
 {
 	struct msm_port *msm_port = UART_TO_MSM(port);
+	unsigned int mr;
 
 	/* reset everything */
 	msm_write(port, UART_CR_CMD_RESET_RX, UART_CR);
@@ -987,7 +988,10 @@ static void msm_reset(struct uart_port *
 	msm_write(port, UART_CR_CMD_RESET_ERR, UART_CR);
 	msm_write(port, UART_CR_CMD_RESET_BREAK_INT, UART_CR);
 	msm_write(port, UART_CR_CMD_RESET_CTS, UART_CR);
-	msm_write(port, UART_CR_CMD_SET_RFR, UART_CR);
+	msm_write(port, UART_CR_CMD_RESET_RFR, UART_CR);
+	mr = msm_read(port, UART_MR1);
+	mr &= ~UART_MR1_RX_RDY_CTL;
+	msm_write(port, mr, UART_MR1);
 
 	/* Disable DM modes */
 	if (msm_port->is_uartdm)
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/tty/serial/qcom_geni_serial.c linux-libre-4.19.89-gnu/drivers/tty/serial/qcom_geni_serial.c
--- linux-libre-4.19.88-gnu/drivers/tty/serial/qcom_geni_serial.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/tty/serial/qcom_geni_serial.c	2019-12-13 02:52:59.000000000 -0500
@@ -113,6 +113,8 @@ struct qcom_geni_serial_port {
 	u32 *rx_fifo;
 	u32 loopback;
 	bool brk;
+
+	unsigned int tx_remaining;
 };
 
 static const struct uart_ops qcom_geni_console_pops;
@@ -435,6 +437,7 @@ static void qcom_geni_serial_console_wri
 	struct qcom_geni_serial_port *port;
 	bool locked = true;
 	unsigned long flags;
+	u32 geni_status;
 
 	WARN_ON(co->index < 0 || co->index >= GENI_UART_CONS_PORTS);
 
@@ -448,6 +451,8 @@ static void qcom_geni_serial_console_wri
 	else
 		spin_lock_irqsave(&uport->lock, flags);
 
+	geni_status = readl_relaxed(uport->membase + SE_GENI_STATUS);
+
 	/* Cancel the current write to log the fault */
 	if (!locked) {
 		geni_se_cancel_m_cmd(&port->se);
@@ -461,9 +466,19 @@ static void qcom_geni_serial_console_wri
 		}
 		writel_relaxed(M_CMD_CANCEL_EN, uport->membase +
 							SE_GENI_M_IRQ_CLEAR);
+	} else if ((geni_status & M_GENI_CMD_ACTIVE) && !port->tx_remaining) {
+		/*
+		 * It seems we can't interrupt existing transfers if all data
+		 * has been sent, in which case we need to look for done first.
+		 */
+		qcom_geni_serial_poll_tx_done(uport);
 	}
 
 	__qcom_geni_serial_console_write(uport, s, count);
+
+	if (port->tx_remaining)
+		qcom_geni_serial_setup_tx(uport, port->tx_remaining);
+
 	if (locked)
 		spin_unlock_irqrestore(&uport->lock, flags);
 }
@@ -694,40 +709,45 @@ static void qcom_geni_serial_handle_rx(s
 	port->handle_rx(uport, total_bytes, drop);
 }
 
-static void qcom_geni_serial_handle_tx(struct uart_port *uport)
+static void qcom_geni_serial_handle_tx(struct uart_port *uport, bool done,
+		bool active)
 {
 	struct qcom_geni_serial_port *port = to_dev_port(uport, uport);
 	struct circ_buf *xmit = &uport->state->xmit;
 	size_t avail;
 	size_t remaining;
+	size_t pending;
 	int i;
 	u32 status;
 	unsigned int chunk;
 	int tail;
-	u32 irq_en;
 
-	chunk = uart_circ_chars_pending(xmit);
 	status = readl_relaxed(uport->membase + SE_GENI_TX_FIFO_STATUS);
-	/* Both FIFO and framework buffer are drained */
-	if (!chunk && !status) {
+
+	/* Complete the current tx command before taking newly added data */
+	if (active)
+		pending = port->tx_remaining;
+	else
+		pending = uart_circ_chars_pending(xmit);
+
+	/* All data has been transmitted and acknowledged as received */
+	if (!pending && !status && done) {
 		qcom_geni_serial_stop_tx(uport);
 		goto out_write_wakeup;
 	}
 
-	if (!uart_console(uport)) {
-		irq_en = readl_relaxed(uport->membase + SE_GENI_M_IRQ_EN);
-		irq_en &= ~(M_TX_FIFO_WATERMARK_EN);
-		writel_relaxed(0, uport->membase + SE_GENI_TX_WATERMARK_REG);
-		writel_relaxed(irq_en, uport->membase + SE_GENI_M_IRQ_EN);
-	}
+	avail = port->tx_fifo_depth - (status & TX_FIFO_WC);
+	avail *= port->tx_bytes_pw;
 
-	avail = (port->tx_fifo_depth - port->tx_wm) * port->tx_bytes_pw;
 	tail = xmit->tail;
-	chunk = min3((size_t)chunk, (size_t)(UART_XMIT_SIZE - tail), avail);
+	chunk = min3(avail, pending, (size_t)(UART_XMIT_SIZE - tail));
 	if (!chunk)
 		goto out_write_wakeup;
 
-	qcom_geni_serial_setup_tx(uport, chunk);
+	if (!port->tx_remaining) {
+		qcom_geni_serial_setup_tx(uport, pending);
+		port->tx_remaining = pending;
+	}
 
 	remaining = chunk;
 	for (i = 0; i < chunk; ) {
@@ -746,11 +766,10 @@ static void qcom_geni_serial_handle_tx(s
 		tail += tx_bytes;
 		uport->icount.tx += tx_bytes;
 		remaining -= tx_bytes;
+		port->tx_remaining -= tx_bytes;
 	}
 
 	xmit->tail = tail & (UART_XMIT_SIZE - 1);
-	if (uart_console(uport))
-		qcom_geni_serial_poll_tx_done(uport);
 out_write_wakeup:
 	if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
 		uart_write_wakeup(uport);
@@ -760,6 +779,7 @@ static irqreturn_t qcom_geni_serial_isr(
 {
 	unsigned int m_irq_status;
 	unsigned int s_irq_status;
+	unsigned int geni_status;
 	struct uart_port *uport = dev;
 	unsigned long flags;
 	unsigned int m_irq_en;
@@ -773,6 +793,7 @@ static irqreturn_t qcom_geni_serial_isr(
 	spin_lock_irqsave(&uport->lock, flags);
 	m_irq_status = readl_relaxed(uport->membase + SE_GENI_M_IRQ_STATUS);
 	s_irq_status = readl_relaxed(uport->membase + SE_GENI_S_IRQ_STATUS);
+	geni_status = readl_relaxed(uport->membase + SE_GENI_STATUS);
 	m_irq_en = readl_relaxed(uport->membase + SE_GENI_M_IRQ_EN);
 	writel_relaxed(m_irq_status, uport->membase + SE_GENI_M_IRQ_CLEAR);
 	writel_relaxed(s_irq_status, uport->membase + SE_GENI_S_IRQ_CLEAR);
@@ -787,7 +808,8 @@ static irqreturn_t qcom_geni_serial_isr(
 
 	if (m_irq_status & (M_TX_FIFO_WATERMARK_EN | M_CMD_DONE_EN) &&
 	    m_irq_en & (M_TX_FIFO_WATERMARK_EN | M_CMD_DONE_EN))
-		qcom_geni_serial_handle_tx(uport);
+		qcom_geni_serial_handle_tx(uport, m_irq_status & M_CMD_DONE_EN,
+					geni_status & M_GENI_CMD_ACTIVE);
 
 	if (s_irq_status & S_GP_IRQ_0_EN || s_irq_status & S_GP_IRQ_1_EN) {
 		if (s_irq_status & S_GP_IRQ_0_EN)
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/tty/serial/serial_core.c linux-libre-4.19.89-gnu/drivers/tty/serial/serial_core.c
--- linux-libre-4.19.88-gnu/drivers/tty/serial/serial_core.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/tty/serial/serial_core.c	2019-12-13 02:52:59.000000000 -0500
@@ -1112,7 +1112,7 @@ static int uart_break_ctl(struct tty_str
 	if (!uport)
 		goto out;
 
-	if (uport->type != PORT_UNKNOWN)
+	if (uport->type != PORT_UNKNOWN && uport->ops->break_ctl)
 		uport->ops->break_ctl(uport, break_state);
 	ret = 0;
 out:
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/tty/tty_ldisc.c linux-libre-4.19.89-gnu/drivers/tty/tty_ldisc.c
--- linux-libre-4.19.88-gnu/drivers/tty/tty_ldisc.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/tty/tty_ldisc.c	2019-12-13 02:52:59.000000000 -0500
@@ -336,6 +336,11 @@ int tty_ldisc_lock(struct tty_struct *tt
 {
 	int ret;
 
+	/* Kindly asking blocked readers to release the read side */
+	set_bit(TTY_LDISC_CHANGING, &tty->flags);
+	wake_up_interruptible_all(&tty->read_wait);
+	wake_up_interruptible_all(&tty->write_wait);
+
 	ret = __tty_ldisc_lock(tty, timeout);
 	if (!ret)
 		return -EBUSY;
@@ -346,6 +351,8 @@ int tty_ldisc_lock(struct tty_struct *tt
 void tty_ldisc_unlock(struct tty_struct *tty)
 {
 	clear_bit(TTY_LDISC_HALTED, &tty->flags);
+	/* Can be cleared here - ldisc_unlock will wake up writers firstly */
+	clear_bit(TTY_LDISC_CHANGING, &tty->flags);
 	__tty_ldisc_unlock(tty);
 }
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/tty/vt/keyboard.c linux-libre-4.19.89-gnu/drivers/tty/vt/keyboard.c
--- linux-libre-4.19.88-gnu/drivers/tty/vt/keyboard.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/tty/vt/keyboard.c	2019-12-13 02:52:59.000000000 -0500
@@ -1491,7 +1491,7 @@ static void kbd_event(struct input_handl
 
 	if (event_type == EV_MSC && event_code == MSC_RAW && HW_RAW(handle->dev))
 		kbd_rawcode(value);
-	if (event_type == EV_KEY)
+	if (event_type == EV_KEY && event_code <= KEY_MAX)
 		kbd_keycode(event_code, value, HW_RAW(handle->dev));
 
 	spin_unlock(&kbd_event_lock);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/tty/vt/vc_screen.c linux-libre-4.19.89-gnu/drivers/tty/vt/vc_screen.c
--- linux-libre-4.19.88-gnu/drivers/tty/vt/vc_screen.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/tty/vt/vc_screen.c	2019-12-13 02:52:59.000000000 -0500
@@ -437,6 +437,9 @@ vcs_write(struct file *file, const char
 	size_t ret;
 	char *con_buf;
 
+	if (use_unicode(inode))
+		return -EOPNOTSUPP;
+
 	con_buf = (char *) __get_free_page(GFP_KERNEL);
 	if (!con_buf)
 		return -ENOMEM;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/usb/dwc3/core.c linux-libre-4.19.89-gnu/drivers/usb/dwc3/core.c
--- linux-libre-4.19.88-gnu/drivers/usb/dwc3/core.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/usb/dwc3/core.c	2019-12-13 02:52:59.000000000 -0500
@@ -1481,7 +1481,8 @@ static int dwc3_probe(struct platform_de
 
 	ret = dwc3_core_init(dwc);
 	if (ret) {
-		dev_err(dev, "failed to initialize core\n");
+		if (ret != -EPROBE_DEFER)
+			dev_err(dev, "failed to initialize core: %d\n", ret);
 		goto err4;
 	}
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/usb/dwc3/debugfs.c linux-libre-4.19.89-gnu/drivers/usb/dwc3/debugfs.c
--- linux-libre-4.19.88-gnu/drivers/usb/dwc3/debugfs.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/usb/dwc3/debugfs.c	2019-12-13 02:52:59.000000000 -0500
@@ -433,13 +433,17 @@ static int dwc3_link_state_show(struct s
 	unsigned long		flags;
 	enum dwc3_link_state	state;
 	u32			reg;
+	u8			speed;
 
 	spin_lock_irqsave(&dwc->lock, flags);
 	reg = dwc3_readl(dwc->regs, DWC3_DSTS);
 	state = DWC3_DSTS_USBLNKST(reg);
-	spin_unlock_irqrestore(&dwc->lock, flags);
+	speed = reg & DWC3_DSTS_CONNECTSPD;
 
-	seq_printf(s, "%s\n", dwc3_gadget_link_string(state));
+	seq_printf(s, "%s\n", (speed >= DWC3_DSTS_SUPERSPEED) ?
+		   dwc3_gadget_link_string(state) :
+		   dwc3_gadget_hs_link_string(state));
+	spin_unlock_irqrestore(&dwc->lock, flags);
 
 	return 0;
 }
@@ -457,6 +461,8 @@ static ssize_t dwc3_link_state_write(str
 	unsigned long		flags;
 	enum dwc3_link_state	state = 0;
 	char			buf[32];
+	u32			reg;
+	u8			speed;
 
 	if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count)))
 		return -EFAULT;
@@ -477,6 +483,15 @@ static ssize_t dwc3_link_state_write(str
 		return -EINVAL;
 
 	spin_lock_irqsave(&dwc->lock, flags);
+	reg = dwc3_readl(dwc->regs, DWC3_DSTS);
+	speed = reg & DWC3_DSTS_CONNECTSPD;
+
+	if (speed < DWC3_DSTS_SUPERSPEED &&
+	    state != DWC3_LINK_STATE_RECOV) {
+		spin_unlock_irqrestore(&dwc->lock, flags);
+		return -EINVAL;
+	}
+
 	dwc3_gadget_set_link_state(dwc, state);
 	spin_unlock_irqrestore(&dwc->lock, flags);
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/usb/dwc3/debug.h linux-libre-4.19.89-gnu/drivers/usb/dwc3/debug.h
--- linux-libre-4.19.88-gnu/drivers/usb/dwc3/debug.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/usb/dwc3/debug.h	2019-12-13 02:52:59.000000000 -0500
@@ -117,6 +117,35 @@ dwc3_gadget_link_string(enum dwc3_link_s
 }
 
 /**
+ * dwc3_gadget_hs_link_string - returns highspeed and below link name
+ * @link_state: link state code
+ */
+static inline const char *
+dwc3_gadget_hs_link_string(enum dwc3_link_state link_state)
+{
+	switch (link_state) {
+	case DWC3_LINK_STATE_U0:
+		return "On";
+	case DWC3_LINK_STATE_U2:
+		return "Sleep";
+	case DWC3_LINK_STATE_U3:
+		return "Suspend";
+	case DWC3_LINK_STATE_SS_DIS:
+		return "Disconnected";
+	case DWC3_LINK_STATE_RX_DET:
+		return "Early Suspend";
+	case DWC3_LINK_STATE_RECOV:
+		return "Recovery";
+	case DWC3_LINK_STATE_RESET:
+		return "Reset";
+	case DWC3_LINK_STATE_RESUME:
+		return "Resume";
+	default:
+		return "UNKNOWN link state\n";
+	}
+}
+
+/**
  * dwc3_trb_type_string - returns TRB type as a string
  * @type: the type of the TRB
  */
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/usb/gadget/function/u_serial.c linux-libre-4.19.89-gnu/drivers/usb/gadget/function/u_serial.c
--- linux-libre-4.19.88-gnu/drivers/usb/gadget/function/u_serial.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/usb/gadget/function/u_serial.c	2019-12-13 02:52:59.000000000 -0500
@@ -1246,8 +1246,10 @@ int gserial_alloc_line(unsigned char *li
 				__func__, port_num, PTR_ERR(tty_dev));
 
 		ret = PTR_ERR(tty_dev);
+		mutex_lock(&ports[port_num].lock);
 		port = ports[port_num].port;
 		ports[port_num].port = NULL;
+		mutex_unlock(&ports[port_num].lock);
 		gserial_free_port(port);
 		goto err;
 	}
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/usb/mtu3/mtu3_qmu.c linux-libre-4.19.89-gnu/drivers/usb/mtu3/mtu3_qmu.c
--- linux-libre-4.19.88-gnu/drivers/usb/mtu3/mtu3_qmu.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/usb/mtu3/mtu3_qmu.c	2019-12-13 02:52:59.000000000 -0500
@@ -427,7 +427,7 @@ static void qmu_tx_zlp_error_handler(str
 		return;
 	}
 
-	dev_dbg(mtu->dev, "%s send ZLP for req=%p\n", __func__, mreq);
+	dev_dbg(mtu->dev, "%s send ZLP for req=%p\n", __func__, req);
 
 	mtu3_clrbits(mbase, MU3D_EP_TXCR0(mep->epnum), TX_DMAREQEN);
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/usb/serial/f81534.c linux-libre-4.19.89-gnu/drivers/usb/serial/f81534.c
--- linux-libre-4.19.88-gnu/drivers/usb/serial/f81534.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/usb/serial/f81534.c	2019-12-13 02:52:59.000000000 -0500
@@ -45,14 +45,17 @@
 #define F81534_CONFIG1_REG		(0x09 + F81534_UART_BASE_ADDRESS)
 
 #define F81534_DEF_CONF_ADDRESS_START	0x3000
-#define F81534_DEF_CONF_SIZE		8
+#define F81534_DEF_CONF_SIZE		12
 
 #define F81534_CUSTOM_ADDRESS_START	0x2f00
 #define F81534_CUSTOM_DATA_SIZE		0x10
 #define F81534_CUSTOM_NO_CUSTOM_DATA	0xff
 #define F81534_CUSTOM_VALID_TOKEN	0xf0
 #define F81534_CONF_OFFSET		1
-#define F81534_CONF_GPIO_OFFSET		4
+#define F81534_CONF_INIT_GPIO_OFFSET	4
+#define F81534_CONF_WORK_GPIO_OFFSET	8
+#define F81534_CONF_GPIO_SHUTDOWN	7
+#define F81534_CONF_GPIO_RS232		1
 
 #define F81534_MAX_DATA_BLOCK		64
 #define F81534_MAX_BUS_RETRY		20
@@ -1359,8 +1362,19 @@ static int f81534_set_port_output_pin(st
 	serial_priv = usb_get_serial_data(serial);
 	port_priv = usb_get_serial_port_data(port);
 
-	idx = F81534_CONF_GPIO_OFFSET + port_priv->phy_num;
+	idx = F81534_CONF_INIT_GPIO_OFFSET + port_priv->phy_num;
 	value = serial_priv->conf_data[idx];
+	if (value >= F81534_CONF_GPIO_SHUTDOWN) {
+		/*
+		 * Newer IC configure will make transceiver in shutdown mode on
+		 * initial power on. We need enable it before using UARTs.
+		 */
+		idx = F81534_CONF_WORK_GPIO_OFFSET + port_priv->phy_num;
+		value = serial_priv->conf_data[idx];
+		if (value >= F81534_CONF_GPIO_SHUTDOWN)
+			value = F81534_CONF_GPIO_RS232;
+	}
+
 	pins = &f81534_port_out_pins[port_priv->phy_num];
 
 	for (i = 0; i < ARRAY_SIZE(pins->pin); ++i) {
diff -druNp --no-dereference linux-libre-4.19.88-gnu/drivers/watchdog/aspeed_wdt.c linux-libre-4.19.89-gnu/drivers/watchdog/aspeed_wdt.c
--- linux-libre-4.19.88-gnu/drivers/watchdog/aspeed_wdt.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/drivers/watchdog/aspeed_wdt.c	2019-12-13 02:52:59.000000000 -0500
@@ -207,11 +207,6 @@ static int aspeed_wdt_probe(struct platf
 	if (IS_ERR(wdt->base))
 		return PTR_ERR(wdt->base);
 
-	/*
-	 * The ast2400 wdt can run at PCLK, or 1MHz. The ast2500 only
-	 * runs at 1MHz. We chose to always run at 1MHz, as there's no
-	 * good reason to have a faster watchdog counter.
-	 */
 	wdt->wdd.info = &aspeed_wdt_info;
 	wdt->wdd.ops = &aspeed_wdt_ops;
 	wdt->wdd.max_hw_heartbeat_ms = WDT_MAX_TIMEOUT_MS;
@@ -227,7 +222,16 @@ static int aspeed_wdt_probe(struct platf
 		return -EINVAL;
 	config = ofdid->data;
 
-	wdt->ctrl = WDT_CTRL_1MHZ_CLK;
+	/*
+	 * On clock rates:
+	 *  - ast2400 wdt can run at PCLK, or 1MHz
+	 *  - ast2500 only runs at 1MHz, hard coding bit 4 to 1
+	 *  - ast2600 always runs at 1MHz
+	 *
+	 * Set the ast2400 to run at 1MHz as it simplifies the driver.
+	 */
+	if (of_device_is_compatible(np, "aspeed,ast2400-wdt"))
+		wdt->ctrl = WDT_CTRL_1MHZ_CLK;
 
 	/*
 	 * Control reset on a per-device basis to ensure the
diff -druNp --no-dereference linux-libre-4.19.88-gnu/fs/autofs/expire.c linux-libre-4.19.89-gnu/fs/autofs/expire.c
--- linux-libre-4.19.88-gnu/fs/autofs/expire.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/fs/autofs/expire.c	2019-12-13 02:52:59.000000000 -0500
@@ -501,9 +501,10 @@ static struct dentry *autofs_expire_indi
 		 */
 		how &= ~AUTOFS_EXP_LEAVES;
 		found = should_expire(expired, mnt, timeout, how);
-		if (!found || found != expired)
-			/* Something has changed, continue */
+		if (found != expired) { // something has changed, continue
+			dput(found);
 			goto next;
+		}
 
 		if (expired != dentry)
 			dput(dentry);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/fs/cifs/file.c linux-libre-4.19.89-gnu/fs/cifs/file.c
--- linux-libre-4.19.88-gnu/fs/cifs/file.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/fs/cifs/file.c	2019-12-13 02:52:59.000000000 -0500
@@ -312,9 +312,6 @@ cifs_new_fileinfo(struct cifs_fid *fid,
 	INIT_LIST_HEAD(&fdlocks->locks);
 	fdlocks->cfile = cfile;
 	cfile->llist = fdlocks;
-	cifs_down_write(&cinode->lock_sem);
-	list_add(&fdlocks->llist, &cinode->llist);
-	up_write(&cinode->lock_sem);
 
 	cfile->count = 1;
 	cfile->pid = current->tgid;
@@ -338,6 +335,10 @@ cifs_new_fileinfo(struct cifs_fid *fid,
 		oplock = 0;
 	}
 
+	cifs_down_write(&cinode->lock_sem);
+	list_add(&fdlocks->llist, &cinode->llist);
+	up_write(&cinode->lock_sem);
+
 	spin_lock(&tcon->open_file_lock);
 	if (fid->pending_open->oplock != CIFS_OPLOCK_NO_CHANGE && oplock)
 		oplock = fid->pending_open->oplock;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/fs/cifs/smb2misc.c linux-libre-4.19.89-gnu/fs/cifs/smb2misc.c
--- linux-libre-4.19.88-gnu/fs/cifs/smb2misc.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/fs/cifs/smb2misc.c	2019-12-13 02:52:59.000000000 -0500
@@ -673,10 +673,10 @@ smb2_is_valid_oplock_break(char *buffer,
 	spin_lock(&cifs_tcp_ses_lock);
 	list_for_each(tmp, &server->smb_ses_list) {
 		ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
+
 		list_for_each(tmp1, &ses->tcon_list) {
 			tcon = list_entry(tmp1, struct cifs_tcon, tcon_list);
 
-			cifs_stats_inc(&tcon->stats.cifs_stats.num_oplock_brks);
 			spin_lock(&tcon->open_file_lock);
 			list_for_each(tmp2, &tcon->openFileList) {
 				cfile = list_entry(tmp2, struct cifsFileInfo,
@@ -688,6 +688,8 @@ smb2_is_valid_oplock_break(char *buffer,
 					continue;
 
 				cifs_dbg(FYI, "file id match, oplock break\n");
+				cifs_stats_inc(
+				    &tcon->stats.cifs_stats.num_oplock_brks);
 				cinode = CIFS_I(d_inode(cfile->dentry));
 				spin_lock(&cfile->file_info_lock);
 				if (!CIFS_CACHE_WRITE(cinode) &&
@@ -720,9 +722,6 @@ smb2_is_valid_oplock_break(char *buffer,
 				return true;
 			}
 			spin_unlock(&tcon->open_file_lock);
-			spin_unlock(&cifs_tcp_ses_lock);
-			cifs_dbg(FYI, "No matching file for oplock break\n");
-			return true;
 		}
 	}
 	spin_unlock(&cifs_tcp_ses_lock);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/fs/dlm/lockspace.c linux-libre-4.19.89-gnu/fs/dlm/lockspace.c
--- linux-libre-4.19.88-gnu/fs/dlm/lockspace.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/fs/dlm/lockspace.c	2019-12-13 02:52:59.000000000 -0500
@@ -807,6 +807,7 @@ static int release_lockspace(struct dlm_
 
 	dlm_delete_debug_file(ls);
 
+	idr_destroy(&ls->ls_recover_idr);
 	kfree(ls->ls_recover_buf);
 
 	/*
diff -druNp --no-dereference linux-libre-4.19.88-gnu/fs/dlm/member.c linux-libre-4.19.89-gnu/fs/dlm/member.c
--- linux-libre-4.19.88-gnu/fs/dlm/member.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/fs/dlm/member.c	2019-12-13 02:52:59.000000000 -0500
@@ -671,7 +671,7 @@ int dlm_ls_stop(struct dlm_ls *ls)
 int dlm_ls_start(struct dlm_ls *ls)
 {
 	struct dlm_recover *rv, *rv_old;
-	struct dlm_config_node *nodes;
+	struct dlm_config_node *nodes = NULL;
 	int error, count;
 
 	rv = kzalloc(sizeof(*rv), GFP_NOFS);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/fs/dlm/memory.c linux-libre-4.19.89-gnu/fs/dlm/memory.c
--- linux-libre-4.19.88-gnu/fs/dlm/memory.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/fs/dlm/memory.c	2019-12-13 02:52:59.000000000 -0500
@@ -38,10 +38,8 @@ int __init dlm_memory_init(void)
 
 void dlm_memory_exit(void)
 {
-	if (lkb_cache)
-		kmem_cache_destroy(lkb_cache);
-	if (rsb_cache)
-		kmem_cache_destroy(rsb_cache);
+	kmem_cache_destroy(lkb_cache);
+	kmem_cache_destroy(rsb_cache);
 }
 
 char *dlm_allocate_lvb(struct dlm_ls *ls)
@@ -86,8 +84,7 @@ void dlm_free_lkb(struct dlm_lkb *lkb)
 		struct dlm_user_args *ua;
 		ua = lkb->lkb_ua;
 		if (ua) {
-			if (ua->lksb.sb_lvbptr)
-				kfree(ua->lksb.sb_lvbptr);
+			kfree(ua->lksb.sb_lvbptr);
 			kfree(ua);
 		}
 	}
diff -druNp --no-dereference linux-libre-4.19.88-gnu/fs/dlm/user.c linux-libre-4.19.89-gnu/fs/dlm/user.c
--- linux-libre-4.19.88-gnu/fs/dlm/user.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/fs/dlm/user.c	2019-12-13 02:52:59.000000000 -0500
@@ -25,6 +25,7 @@
 #include "lvb_table.h"
 #include "user.h"
 #include "ast.h"
+#include "config.h"
 
 static const char name_prefix[] = "dlm";
 static const struct file_operations device_fops;
@@ -404,7 +405,7 @@ static int device_create_lockspace(struc
 	if (!capable(CAP_SYS_ADMIN))
 		return -EPERM;
 
-	error = dlm_new_lockspace(params->name, NULL, params->flags,
+	error = dlm_new_lockspace(params->name, dlm_config.ci_cluster_name, params->flags,
 				  DLM_USER_LVB_LEN, NULL, NULL, NULL,
 				  &lockspace);
 	if (error)
diff -druNp --no-dereference linux-libre-4.19.88-gnu/fs/exportfs/expfs.c linux-libre-4.19.89-gnu/fs/exportfs/expfs.c
--- linux-libre-4.19.88-gnu/fs/exportfs/expfs.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/fs/exportfs/expfs.c	2019-12-13 02:52:59.000000000 -0500
@@ -517,26 +517,33 @@ struct dentry *exportfs_decode_fh(struct
 		 * inode is actually connected to the parent.
 		 */
 		err = exportfs_get_name(mnt, target_dir, nbuf, result);
-		if (!err) {
-			inode_lock(target_dir->d_inode);
-			nresult = lookup_one_len(nbuf, target_dir,
-						 strlen(nbuf));
-			inode_unlock(target_dir->d_inode);
-			if (!IS_ERR(nresult)) {
-				if (nresult->d_inode) {
-					dput(result);
-					result = nresult;
-				} else
-					dput(nresult);
-			}
+		if (err) {
+			dput(target_dir);
+			goto err_result;
 		}
 
+		inode_lock(target_dir->d_inode);
+		nresult = lookup_one_len(nbuf, target_dir, strlen(nbuf));
+		if (!IS_ERR(nresult)) {
+			if (unlikely(nresult->d_inode != result->d_inode)) {
+				dput(nresult);
+				nresult = ERR_PTR(-ESTALE);
+			}
+		}
+		inode_unlock(target_dir->d_inode);
 		/*
 		 * At this point we are done with the parent, but it's pinned
 		 * by the child dentry anyway.
 		 */
 		dput(target_dir);
 
+		if (IS_ERR(nresult)) {
+			err = PTR_ERR(nresult);
+			goto err_result;
+		}
+		dput(result);
+		result = nresult;
+
 		/*
 		 * And finally make sure the dentry is actually acceptable
 		 * to NFSD.
diff -druNp --no-dereference linux-libre-4.19.88-gnu/fs/f2fs/file.c linux-libre-4.19.89-gnu/fs/f2fs/file.c
--- linux-libre-4.19.88-gnu/fs/f2fs/file.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/fs/f2fs/file.c	2019-12-13 02:52:59.000000000 -0500
@@ -2143,7 +2143,7 @@ do_more:
 	}
 
 	ret = f2fs_gc(sbi, range.sync, true, GET_SEGNO(sbi, range.start));
-	range.start += sbi->blocks_per_seg;
+	range.start += BLKS_PER_SEC(sbi);
 	if (range.start <= end)
 		goto do_more;
 out:
diff -druNp --no-dereference linux-libre-4.19.88-gnu/fs/f2fs/gc.c linux-libre-4.19.89-gnu/fs/f2fs/gc.c
--- linux-libre-4.19.88-gnu/fs/f2fs/gc.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/fs/f2fs/gc.c	2019-12-13 02:52:59.000000000 -0500
@@ -318,8 +318,7 @@ static int get_victim_by_default(struct
 	p.min_cost = get_max_cost(sbi, &p);
 
 	if (*result != NULL_SEGNO) {
-		if (IS_DATASEG(get_seg_entry(sbi, *result)->type) &&
-			get_valid_blocks(sbi, *result, false) &&
+		if (get_valid_blocks(sbi, *result, false) &&
 			!sec_usage_check(sbi, GET_SEC_FROM_SEG(sbi, *result)))
 			p.min_segno = *result;
 		goto out;
@@ -1081,9 +1080,9 @@ static int do_garbage_collect(struct f2f
 					GET_SUM_BLOCK(sbi, segno));
 		f2fs_put_page(sum_page, 0);
 
-		if (get_valid_blocks(sbi, segno, false) == 0 ||
-				!PageUptodate(sum_page) ||
-				unlikely(f2fs_cp_error(sbi)))
+		if (get_valid_blocks(sbi, segno, false) == 0)
+			goto freed;
+		if (!PageUptodate(sum_page) || unlikely(f2fs_cp_error(sbi)))
 			goto next;
 
 		sum = page_address(sum_page);
@@ -1110,6 +1109,7 @@ static int do_garbage_collect(struct f2f
 
 		stat_inc_seg_count(sbi, type, gc_type);
 
+freed:
 		if (gc_type == FG_GC &&
 				get_valid_blocks(sbi, segno, false) == 0)
 			seg_freed++;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/fs/f2fs/segment.c linux-libre-4.19.89-gnu/fs/f2fs/segment.c
--- linux-libre-4.19.88-gnu/fs/f2fs/segment.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/fs/f2fs/segment.c	2019-12-13 02:52:59.000000000 -0500
@@ -637,7 +637,9 @@ int f2fs_issue_flush(struct f2fs_sb_info
 		return 0;
 
 	if (!test_opt(sbi, FLUSH_MERGE)) {
+		atomic_inc(&fcc->issing_flush);
 		ret = submit_flush_wait(sbi, ino);
+		atomic_dec(&fcc->issing_flush);
 		atomic_inc(&fcc->issued_flush);
 		return ret;
 	}
diff -druNp --no-dereference linux-libre-4.19.88-gnu/fs/fuse/dir.c linux-libre-4.19.89-gnu/fs/fuse/dir.c
--- linux-libre-4.19.88-gnu/fs/fuse/dir.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/fs/fuse/dir.c	2019-12-13 02:52:59.000000000 -0500
@@ -234,7 +234,8 @@ static int fuse_dentry_revalidate(struct
 		kfree(forget);
 		if (ret == -ENOMEM)
 			goto out;
-		if (ret || (outarg.attr.mode ^ inode->i_mode) & S_IFMT)
+		if (ret || fuse_invalid_attr(&outarg.attr) ||
+		    (outarg.attr.mode ^ inode->i_mode) & S_IFMT)
 			goto invalid;
 
 		forget_all_cached_acls(inode);
@@ -297,6 +298,12 @@ int fuse_valid_type(int m)
 		S_ISBLK(m) || S_ISFIFO(m) || S_ISSOCK(m);
 }
 
+bool fuse_invalid_attr(struct fuse_attr *attr)
+{
+	return !fuse_valid_type(attr->mode) ||
+		attr->size > LLONG_MAX;
+}
+
 int fuse_lookup_name(struct super_block *sb, u64 nodeid, const struct qstr *name,
 		     struct fuse_entry_out *outarg, struct inode **inode)
 {
@@ -328,7 +335,7 @@ int fuse_lookup_name(struct super_block
 	err = -EIO;
 	if (!outarg->nodeid)
 		goto out_put_forget;
-	if (!fuse_valid_type(outarg->attr.mode))
+	if (fuse_invalid_attr(&outarg->attr))
 		goto out_put_forget;
 
 	*inode = fuse_iget(sb, outarg->nodeid, outarg->generation,
@@ -451,7 +458,8 @@ static int fuse_create_open(struct inode
 		goto out_free_ff;
 
 	err = -EIO;
-	if (!S_ISREG(outentry.attr.mode) || invalid_nodeid(outentry.nodeid))
+	if (!S_ISREG(outentry.attr.mode) || invalid_nodeid(outentry.nodeid) ||
+	    fuse_invalid_attr(&outentry.attr))
 		goto out_free_ff;
 
 	ff->fh = outopen.fh;
@@ -558,7 +566,7 @@ static int create_new_entry(struct fuse_
 		goto out_put_forget_req;
 
 	err = -EIO;
-	if (invalid_nodeid(outarg.nodeid))
+	if (invalid_nodeid(outarg.nodeid) || fuse_invalid_attr(&outarg.attr))
 		goto out_put_forget_req;
 
 	if ((outarg.attr.mode ^ mode) & S_IFMT)
@@ -837,7 +845,8 @@ static int fuse_link(struct dentry *entr
 
 		spin_lock(&fc->lock);
 		fi->attr_version = ++fc->attr_version;
-		inc_nlink(inode);
+		if (likely(inode->i_nlink < UINT_MAX))
+			inc_nlink(inode);
 		spin_unlock(&fc->lock);
 		fuse_invalidate_attr(inode);
 		fuse_update_ctime(inode);
@@ -917,7 +926,8 @@ static int fuse_do_getattr(struct inode
 	args.out.args[0].value = &outarg;
 	err = fuse_simple_request(fc, &args);
 	if (!err) {
-		if ((inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
+		if (fuse_invalid_attr(&outarg.attr) ||
+		    (inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
 			make_bad_inode(inode);
 			err = -EIO;
 		} else {
@@ -1229,7 +1239,7 @@ static int fuse_direntplus_link(struct f
 
 	if (invalid_nodeid(o->nodeid))
 		return -EIO;
-	if (!fuse_valid_type(o->attr.mode))
+	if (fuse_invalid_attr(&o->attr))
 		return -EIO;
 
 	fc = get_fuse_conn(dir);
@@ -1706,7 +1716,8 @@ int fuse_do_setattr(struct dentry *dentr
 		goto error;
 	}
 
-	if ((inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
+	if (fuse_invalid_attr(&outarg.attr) ||
+	    (inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
 		make_bad_inode(inode);
 		err = -EIO;
 		goto error;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/fs/fuse/fuse_i.h linux-libre-4.19.89-gnu/fs/fuse/fuse_i.h
--- linux-libre-4.19.88-gnu/fs/fuse/fuse_i.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/fs/fuse/fuse_i.h	2019-12-13 02:52:59.000000000 -0500
@@ -909,6 +909,8 @@ void fuse_ctl_remove_conn(struct fuse_co
  */
 int fuse_valid_type(int m);
 
+bool fuse_invalid_attr(struct fuse_attr *attr);
+
 /**
  * Is current process allowed to perform filesystem operation?
  */
diff -druNp --no-dereference linux-libre-4.19.88-gnu/fs/iomap.c linux-libre-4.19.89-gnu/fs/iomap.c
--- linux-libre-4.19.88-gnu/fs/iomap.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/fs/iomap.c	2019-12-13 02:52:59.000000000 -0500
@@ -150,13 +150,14 @@ static void
 iomap_adjust_read_range(struct inode *inode, struct iomap_page *iop,
 		loff_t *pos, loff_t length, unsigned *offp, unsigned *lenp)
 {
+	loff_t orig_pos = *pos;
+	loff_t isize = i_size_read(inode);
 	unsigned block_bits = inode->i_blkbits;
 	unsigned block_size = (1 << block_bits);
 	unsigned poff = offset_in_page(*pos);
 	unsigned plen = min_t(loff_t, PAGE_SIZE - poff, length);
 	unsigned first = poff >> block_bits;
 	unsigned last = (poff + plen - 1) >> block_bits;
-	unsigned end = offset_in_page(i_size_read(inode)) >> block_bits;
 
 	/*
 	 * If the block size is smaller than the page size we need to check the
@@ -191,8 +192,12 @@ iomap_adjust_read_range(struct inode *in
 	 * handle both halves separately so that we properly zero data in the
 	 * page cache for blocks that are entirely outside of i_size.
 	 */
-	if (first <= end && last > end)
-		plen -= (last - end) * block_size;
+	if (orig_pos <= isize && orig_pos + length > isize) {
+		unsigned end = offset_in_page(isize - 1) >> block_bits;
+
+		if (first <= end && last > end)
+			plen -= (last - end) * block_size;
+	}
 
 	*offp = poff;
 	*lenp = plen;
@@ -1603,7 +1608,7 @@ iomap_dio_bio_actor(struct inode *inode,
 	struct bio *bio;
 	bool need_zeroout = false;
 	bool use_fua = false;
-	int nr_pages, ret;
+	int nr_pages, ret = 0;
 	size_t copied = 0;
 
 	if ((pos | length | align) & ((1 << blkbits) - 1))
@@ -1619,12 +1624,13 @@ iomap_dio_bio_actor(struct inode *inode,
 
 	if (iomap->flags & IOMAP_F_NEW) {
 		need_zeroout = true;
-	} else {
+	} else if (iomap->type == IOMAP_MAPPED) {
 		/*
-		 * Use a FUA write if we need datasync semantics, this
-		 * is a pure data IO that doesn't require any metadata
-		 * updates and the underlying device supports FUA. This
-		 * allows us to avoid cache flushes on IO completion.
+		 * Use a FUA write if we need datasync semantics, this is a pure
+		 * data IO that doesn't require any metadata updates (including
+		 * after IO completion such as unwritten extent conversion) and
+		 * the underlying device supports FUA. This allows us to avoid
+		 * cache flushes on IO completion.
 		 */
 		if (!(iomap->flags & (IOMAP_F_SHARED|IOMAP_F_DIRTY)) &&
 		    (dio->flags & IOMAP_DIO_WRITE_FUA) &&
@@ -1667,8 +1673,14 @@ iomap_dio_bio_actor(struct inode *inode,
 
 		ret = bio_iov_iter_get_pages(bio, &iter);
 		if (unlikely(ret)) {
+			/*
+			 * We have to stop part way through an IO. We must fall
+			 * through to the sub-block tail zeroing here, otherwise
+			 * this short IO may expose stale data in the tail of
+			 * the block we haven't written data to.
+			 */
 			bio_put(bio);
-			return copied ? copied : ret;
+			goto zero_tail;
 		}
 
 		n = bio->bi_iter.bi_size;
@@ -1699,13 +1711,21 @@ iomap_dio_bio_actor(struct inode *inode,
 		dio->submit.cookie = submit_bio(bio);
 	} while (nr_pages);
 
-	if (need_zeroout) {
+	/*
+	 * We need to zeroout the tail of a sub-block write if the extent type
+	 * requires zeroing or the write extends beyond EOF. If we don't zero
+	 * the block tail in the latter case, we can expose stale data via mmap
+	 * reads of the EOF block.
+	 */
+zero_tail:
+	if (need_zeroout ||
+	    ((dio->flags & IOMAP_DIO_WRITE) && pos >= i_size_read(inode))) {
 		/* zero out from the end of the write to the end of the block */
 		pad = pos & (fs_block_size - 1);
 		if (pad)
 			iomap_dio_zero(dio, iomap, pos, fs_block_size - pad);
 	}
-	return copied;
+	return copied ? copied : ret;
 }
 
 static loff_t
@@ -1884,8 +1904,15 @@ iomap_dio_rw(struct kiocb *iocb, struct
 		}
 		pos += ret;
 
-		if (iov_iter_rw(iter) == READ && pos >= dio->i_size)
+		if (iov_iter_rw(iter) == READ && pos >= dio->i_size) {
+			/*
+			 * We only report that we've read data up to i_size.
+			 * Revert iter to a state corresponding to that as
+			 * some callers (such as splice code) rely on it.
+			 */
+			iov_iter_revert(iter, pos - dio->i_size);
 			break;
+		}
 	} while ((count = iov_iter_count(iter)) > 0);
 	blk_finish_plug(&plug);
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/fs/kernfs/dir.c linux-libre-4.19.89-gnu/fs/kernfs/dir.c
--- linux-libre-4.19.88-gnu/fs/kernfs/dir.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/fs/kernfs/dir.c	2019-12-13 02:52:59.000000000 -0500
@@ -624,7 +624,6 @@ static struct kernfs_node *__kernfs_new_
 {
 	struct kernfs_node *kn;
 	u32 gen;
-	int cursor;
 	int ret;
 
 	name = kstrdup_const(name, GFP_KERNEL);
@@ -637,11 +636,11 @@ static struct kernfs_node *__kernfs_new_
 
 	idr_preload(GFP_KERNEL);
 	spin_lock(&kernfs_idr_lock);
-	cursor = idr_get_cursor(&root->ino_idr);
 	ret = idr_alloc_cyclic(&root->ino_idr, kn, 1, 0, GFP_ATOMIC);
-	if (ret >= 0 && ret < cursor)
+	if (ret >= 0 && ret < root->last_ino)
 		root->next_generation++;
 	gen = root->next_generation;
+	root->last_ino = ret;
 	spin_unlock(&kernfs_idr_lock);
 	idr_preload_end();
 	if (ret < 0)
diff -druNp --no-dereference linux-libre-4.19.88-gnu/fs/lockd/clnt4xdr.c linux-libre-4.19.89-gnu/fs/lockd/clnt4xdr.c
--- linux-libre-4.19.88-gnu/fs/lockd/clnt4xdr.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/fs/lockd/clnt4xdr.c	2019-12-13 02:52:59.000000000 -0500
@@ -128,24 +128,14 @@ static void encode_netobj(struct xdr_str
 static int decode_netobj(struct xdr_stream *xdr,
 			 struct xdr_netobj *obj)
 {
-	u32 length;
-	__be32 *p;
+	ssize_t ret;
 
-	p = xdr_inline_decode(xdr, 4);
-	if (unlikely(p == NULL))
-		goto out_overflow;
-	length = be32_to_cpup(p++);
-	if (unlikely(length > XDR_MAX_NETOBJ))
-		goto out_size;
-	obj->len = length;
-	obj->data = (u8 *)p;
+	ret = xdr_stream_decode_opaque_inline(xdr, (void *)&obj->data,
+						XDR_MAX_NETOBJ);
+	if (unlikely(ret < 0))
+		return -EIO;
+	obj->len = ret;
 	return 0;
-out_size:
-	dprintk("NFS: returned netobj was too long: %u\n", length);
-	return -EIO;
-out_overflow:
-	print_overflow_msg(__func__, xdr);
-	return -EIO;
 }
 
 /*
diff -druNp --no-dereference linux-libre-4.19.88-gnu/fs/lockd/clntxdr.c linux-libre-4.19.89-gnu/fs/lockd/clntxdr.c
--- linux-libre-4.19.88-gnu/fs/lockd/clntxdr.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/fs/lockd/clntxdr.c	2019-12-13 02:52:59.000000000 -0500
@@ -125,24 +125,14 @@ static void encode_netobj(struct xdr_str
 static int decode_netobj(struct xdr_stream *xdr,
 			 struct xdr_netobj *obj)
 {
-	u32 length;
-	__be32 *p;
+	ssize_t ret;
 
-	p = xdr_inline_decode(xdr, 4);
-	if (unlikely(p == NULL))
-		goto out_overflow;
-	length = be32_to_cpup(p++);
-	if (unlikely(length > XDR_MAX_NETOBJ))
-		goto out_size;
-	obj->len = length;
-	obj->data = (u8 *)p;
+	ret = xdr_stream_decode_opaque_inline(xdr, (void *)&obj->data,
+			XDR_MAX_NETOBJ);
+	if (unlikely(ret < 0))
+		return -EIO;
+	obj->len = ret;
 	return 0;
-out_size:
-	dprintk("NFS: returned netobj was too long: %u\n", length);
-	return -EIO;
-out_overflow:
-	print_overflow_msg(__func__, xdr);
-	return -EIO;
 }
 
 /*
diff -druNp --no-dereference linux-libre-4.19.88-gnu/fs/nfsd/nfs4recover.c linux-libre-4.19.89-gnu/fs/nfsd/nfs4recover.c
--- linux-libre-4.19.88-gnu/fs/nfsd/nfs4recover.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/fs/nfsd/nfs4recover.c	2019-12-13 02:52:59.000000000 -0500
@@ -662,7 +662,7 @@ struct cld_net {
 struct cld_upcall {
 	struct list_head	 cu_list;
 	struct cld_net		*cu_net;
-	struct task_struct	*cu_task;
+	struct completion	 cu_done;
 	struct cld_msg		 cu_msg;
 };
 
@@ -671,23 +671,18 @@ __cld_pipe_upcall(struct rpc_pipe *pipe,
 {
 	int ret;
 	struct rpc_pipe_msg msg;
+	struct cld_upcall *cup = container_of(cmsg, struct cld_upcall, cu_msg);
 
 	memset(&msg, 0, sizeof(msg));
 	msg.data = cmsg;
 	msg.len = sizeof(*cmsg);
 
-	/*
-	 * Set task state before we queue the upcall. That prevents
-	 * wake_up_process in the downcall from racing with schedule.
-	 */
-	set_current_state(TASK_UNINTERRUPTIBLE);
 	ret = rpc_queue_upcall(pipe, &msg);
 	if (ret < 0) {
-		set_current_state(TASK_RUNNING);
 		goto out;
 	}
 
-	schedule();
+	wait_for_completion(&cup->cu_done);
 
 	if (msg.errno < 0)
 		ret = msg.errno;
@@ -754,7 +749,7 @@ cld_pipe_downcall(struct file *filp, con
 	if (copy_from_user(&cup->cu_msg, src, mlen) != 0)
 		return -EFAULT;
 
-	wake_up_process(cup->cu_task);
+	complete(&cup->cu_done);
 	return mlen;
 }
 
@@ -769,7 +764,7 @@ cld_pipe_destroy_msg(struct rpc_pipe_msg
 	if (msg->errno >= 0)
 		return;
 
-	wake_up_process(cup->cu_task);
+	complete(&cup->cu_done);
 }
 
 static const struct rpc_pipe_ops cld_upcall_ops = {
@@ -900,7 +895,7 @@ restart_search:
 			goto restart_search;
 		}
 	}
-	new->cu_task = current;
+	init_completion(&new->cu_done);
 	new->cu_msg.cm_vers = CLD_UPCALL_VERSION;
 	put_unaligned(cn->cn_xid++, &new->cu_msg.cm_xid);
 	new->cu_net = cn;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/fs/nfsd/vfs.c linux-libre-4.19.89-gnu/fs/nfsd/vfs.c
--- linux-libre-4.19.88-gnu/fs/nfsd/vfs.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/fs/nfsd/vfs.c	2019-12-13 02:52:59.000000000 -0500
@@ -396,10 +396,23 @@ nfsd_setattr(struct svc_rqst *rqstp, str
 	bool		get_write_count;
 	bool		size_change = (iap->ia_valid & ATTR_SIZE);
 
-	if (iap->ia_valid & (ATTR_ATIME | ATTR_MTIME | ATTR_SIZE))
+	if (iap->ia_valid & ATTR_SIZE) {
 		accmode |= NFSD_MAY_WRITE|NFSD_MAY_OWNER_OVERRIDE;
-	if (iap->ia_valid & ATTR_SIZE)
 		ftype = S_IFREG;
+	}
+
+	/*
+	 * If utimes(2) and friends are called with times not NULL, we should
+	 * not set NFSD_MAY_WRITE bit. Otherwise fh_verify->nfsd_permission
+	 * will return EACCESS, when the caller's effective UID does not match
+	 * the owner of the file, and the caller is not privileged. In this
+	 * situation, we should return EPERM(notify_change will return this).
+	 */
+	if (iap->ia_valid & (ATTR_ATIME | ATTR_MTIME)) {
+		accmode |= NFSD_MAY_OWNER_OVERRIDE;
+		if (!(iap->ia_valid & (ATTR_ATIME_SET | ATTR_MTIME_SET)))
+			accmode |= NFSD_MAY_WRITE;
+	}
 
 	/* Callers that do fh_verify should do the fh_want_write: */
 	get_write_count = !fhp->fh_dentry;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/fs/pstore/ram.c linux-libre-4.19.89-gnu/fs/pstore/ram.c
--- linux-libre-4.19.88-gnu/fs/pstore/ram.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/fs/pstore/ram.c	2019-12-13 02:52:59.000000000 -0500
@@ -301,6 +301,7 @@ static ssize_t ramoops_pstore_read(struc
 					  GFP_KERNEL);
 			if (!tmp_prz)
 				return -ENOMEM;
+			prz = tmp_prz;
 			free_prz = true;
 
 			while (cxt->ftrace_read_cnt < cxt->max_ftrace_cnt) {
@@ -323,7 +324,6 @@ static ssize_t ramoops_pstore_read(struc
 					goto out;
 			}
 			record->id = 0;
-			prz = tmp_prz;
 		}
 	}
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/fs/splice.c linux-libre-4.19.89-gnu/fs/splice.c
--- linux-libre-4.19.88-gnu/fs/splice.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/fs/splice.c	2019-12-13 02:52:59.000000000 -0500
@@ -946,11 +946,16 @@ ssize_t splice_direct_to_actor(struct fi
 	sd->flags &= ~SPLICE_F_NONBLOCK;
 	more = sd->flags & SPLICE_F_MORE;
 
+	WARN_ON_ONCE(pipe->nrbufs != 0);
+
 	while (len) {
 		size_t read_len;
 		loff_t pos = sd->pos, prev_pos = pos;
 
-		ret = do_splice_to(in, &pos, pipe, len, flags);
+		/* Don't try to read more the pipe has space for. */
+		read_len = min_t(size_t, len,
+				 (pipe->buffers - pipe->nrbufs) << PAGE_SHIFT);
+		ret = do_splice_to(in, &pos, pipe, read_len, flags);
 		if (unlikely(ret <= 0))
 			goto out_release;
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/fs/xfs/xfs_bmap_util.c linux-libre-4.19.89-gnu/fs/xfs/xfs_bmap_util.c
--- linux-libre-4.19.88-gnu/fs/xfs/xfs_bmap_util.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/fs/xfs/xfs_bmap_util.c	2019-12-13 02:52:59.000000000 -0500
@@ -1244,11 +1244,7 @@ xfs_prepare_shift(
 	 * Writeback and invalidate cache for the remainder of the file as we're
 	 * about to shift down every extent from offset to EOF.
 	 */
-	error = filemap_write_and_wait_range(VFS_I(ip)->i_mapping, offset, -1);
-	if (error)
-		return error;
-	error = invalidate_inode_pages2_range(VFS_I(ip)->i_mapping,
-					offset >> PAGE_SHIFT, -1);
+	error = xfs_flush_unmap_range(ip, offset, XFS_ISIZE(ip));
 	if (error)
 		return error;
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/include/dt-bindings/clock/rk3328-cru.h linux-libre-4.19.89-gnu/include/dt-bindings/clock/rk3328-cru.h
--- linux-libre-4.19.88-gnu/include/dt-bindings/clock/rk3328-cru.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/include/dt-bindings/clock/rk3328-cru.h	2019-12-13 02:52:59.000000000 -0500
@@ -178,7 +178,7 @@
 #define HCLK_TSP		309
 #define HCLK_GMAC		310
 #define HCLK_I2S0_8CH		311
-#define HCLK_I2S1_8CH		313
+#define HCLK_I2S1_8CH		312
 #define HCLK_I2S2_2CH		313
 #define HCLK_SPDIF_8CH		314
 #define HCLK_VOP		315
diff -druNp --no-dereference linux-libre-4.19.88-gnu/include/dt-bindings/power/r8a77970-sysc.h linux-libre-4.19.89-gnu/include/dt-bindings/power/r8a77970-sysc.h
--- linux-libre-4.19.88-gnu/include/dt-bindings/power/r8a77970-sysc.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/include/dt-bindings/power/r8a77970-sysc.h	2019-12-13 02:52:59.000000000 -0500
@@ -19,10 +19,10 @@
 #define R8A77970_PD_CR7			13
 #define R8A77970_PD_CA53_SCU		21
 #define R8A77970_PD_A2IR0		23
-#define R8A77970_PD_A3IR			24
+#define R8A77970_PD_A3IR		24
 #define R8A77970_PD_A2IR1		27
-#define R8A77970_PD_A2IR2		28
-#define R8A77970_PD_A2IR3		29
+#define R8A77970_PD_A2DP		28
+#define R8A77970_PD_A2CN		29
 #define R8A77970_PD_A2SC0		30
 #define R8A77970_PD_A2SC1		31
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/include/dt-bindings/power/r8a77980-sysc.h linux-libre-4.19.89-gnu/include/dt-bindings/power/r8a77980-sysc.h
--- linux-libre-4.19.88-gnu/include/dt-bindings/power/r8a77980-sysc.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/include/dt-bindings/power/r8a77980-sysc.h	2019-12-13 02:52:59.000000000 -0500
@@ -15,14 +15,14 @@
 #define R8A77980_PD_A2SC2		0
 #define R8A77980_PD_A2SC3		1
 #define R8A77980_PD_A2SC4		2
-#define R8A77980_PD_A2PD0		3
-#define R8A77980_PD_A2PD1		4
+#define R8A77980_PD_A2DP0		3
+#define R8A77980_PD_A2DP1		4
 #define R8A77980_PD_CA53_CPU0		5
 #define R8A77980_PD_CA53_CPU1		6
 #define R8A77980_PD_CA53_CPU2		7
 #define R8A77980_PD_CA53_CPU3		8
 #define R8A77980_PD_A2CN		10
-#define R8A77980_PD_A3VIP		11
+#define R8A77980_PD_A3VIP0		11
 #define R8A77980_PD_A2IR5		12
 #define R8A77980_PD_CR7			13
 #define R8A77980_PD_A2IR4		15
diff -druNp --no-dereference linux-libre-4.19.88-gnu/include/linux/acpi.h linux-libre-4.19.89-gnu/include/linux/acpi.h
--- linux-libre-4.19.88-gnu/include/linux/acpi.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/include/linux/acpi.h	2019-12-13 02:52:59.000000000 -0500
@@ -101,7 +101,7 @@ static inline bool has_acpi_companion(st
 static inline void acpi_preset_companion(struct device *dev,
 					 struct acpi_device *parent, u64 addr)
 {
-	ACPI_COMPANION_SET(dev, acpi_find_child_device(parent, addr, NULL));
+	ACPI_COMPANION_SET(dev, acpi_find_child_device(parent, addr, false));
 }
 
 static inline const char *acpi_dev_name(struct acpi_device *adev)
diff -druNp --no-dereference linux-libre-4.19.88-gnu/include/linux/atalk.h linux-libre-4.19.89-gnu/include/linux/atalk.h
--- linux-libre-4.19.88-gnu/include/linux/atalk.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/include/linux/atalk.h	2019-12-13 02:52:59.000000000 -0500
@@ -108,7 +108,7 @@ static __inline__ struct elapaarp *aarp_
 #define AARP_RESOLVE_TIME	(10 * HZ)
 
 extern struct datalink_proto *ddp_dl, *aarp_dl;
-extern void aarp_proto_init(void);
+extern int aarp_proto_init(void);
 
 /* Inter module exports */
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/include/linux/avf/virtchnl.h linux-libre-4.19.89-gnu/include/linux/avf/virtchnl.h
--- linux-libre-4.19.88-gnu/include/linux/avf/virtchnl.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/include/linux/avf/virtchnl.h	2019-12-13 02:52:59.000000000 -0500
@@ -798,8 +798,8 @@ virtchnl_vc_validate_vf_msg(struct virtc
 		if (msglen >= valid_len) {
 			struct virtchnl_tc_info *vti =
 				(struct virtchnl_tc_info *)msg;
-			valid_len += vti->num_tc *
-				sizeof(struct virtchnl_channel_info);
+			valid_len += (vti->num_tc - 1) *
+				     sizeof(struct virtchnl_channel_info);
 			if (vti->num_tc == 0)
 				err_msg_format = true;
 		}
diff -druNp --no-dereference linux-libre-4.19.88-gnu/include/linux/dma-mapping.h linux-libre-4.19.89-gnu/include/linux/dma-mapping.h
--- linux-libre-4.19.88-gnu/include/linux/dma-mapping.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/include/linux/dma-mapping.h	2019-12-13 02:52:59.000000000 -0500
@@ -674,8 +674,7 @@ static inline unsigned int dma_get_max_s
 	return SZ_64K;
 }
 
-static inline unsigned int dma_set_max_seg_size(struct device *dev,
-						unsigned int size)
+static inline int dma_set_max_seg_size(struct device *dev, unsigned int size)
 {
 	if (dev->dma_parms) {
 		dev->dma_parms->max_segment_size = size;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/include/linux/jbd2.h linux-libre-4.19.89-gnu/include/linux/jbd2.h
--- linux-libre-4.19.88-gnu/include/linux/jbd2.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/include/linux/jbd2.h	2019-12-13 02:52:59.000000000 -0500
@@ -1587,7 +1587,7 @@ static inline int jbd2_space_needed(jour
 static inline unsigned long jbd2_log_space_left(journal_t *journal)
 {
 	/* Allow for rounding errors */
-	unsigned long free = journal->j_free - 32;
+	long free = journal->j_free - 32;
 
 	if (journal->j_committing_transaction) {
 		unsigned long committing = atomic_read(&journal->
@@ -1596,7 +1596,7 @@ static inline unsigned long jbd2_log_spa
 		/* Transaction + control blocks */
 		free -= committing + (committing >> JBD2_CONTROL_BLOCKS_SHIFT);
 	}
-	return free;
+	return max_t(long, free, 0);
 }
 
 /*
diff -druNp --no-dereference linux-libre-4.19.88-gnu/include/linux/kernfs.h linux-libre-4.19.89-gnu/include/linux/kernfs.h
--- linux-libre-4.19.88-gnu/include/linux/kernfs.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/include/linux/kernfs.h	2019-12-13 02:52:59.000000000 -0500
@@ -186,6 +186,7 @@ struct kernfs_root {
 
 	/* private fields, do not use outside kernfs proper */
 	struct idr		ino_idr;
+	u32			last_ino;
 	u32			next_generation;
 	struct kernfs_syscall_ops *syscall_ops;
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/include/linux/mtd/mtd.h linux-libre-4.19.89-gnu/include/linux/mtd/mtd.h
--- linux-libre-4.19.88-gnu/include/linux/mtd/mtd.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/include/linux/mtd/mtd.h	2019-12-13 02:52:59.000000000 -0500
@@ -386,7 +386,7 @@ static inline struct device_node *mtd_ge
 	return dev_of_node(&mtd->dev);
 }
 
-static inline int mtd_oobavail(struct mtd_info *mtd, struct mtd_oob_ops *ops)
+static inline u32 mtd_oobavail(struct mtd_info *mtd, struct mtd_oob_ops *ops)
 {
 	return ops->mode == MTD_OPS_AUTO_OOB ? mtd->oobavail : mtd->oobsize;
 }
diff -druNp --no-dereference linux-libre-4.19.88-gnu/include/linux/platform_data/dma-dw.h linux-libre-4.19.89-gnu/include/linux/platform_data/dma-dw.h
--- linux-libre-4.19.88-gnu/include/linux/platform_data/dma-dw.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/include/linux/platform_data/dma-dw.h	2019-12-13 02:52:59.000000000 -0500
@@ -49,6 +49,7 @@ struct dw_dma_slave {
  * @data_width: Maximum data width supported by hardware per AHB master
  *		(in bytes, power of 2)
  * @multi_block: Multi block transfers supported by hardware per channel.
+ * @protctl: Protection control signals setting per channel.
  */
 struct dw_dma_platform_data {
 	unsigned int	nr_channels;
@@ -65,6 +66,11 @@ struct dw_dma_platform_data {
 	unsigned char	nr_masters;
 	unsigned char	data_width[DW_DMA_MAX_NR_MASTERS];
 	unsigned char	multi_block[DW_DMA_MAX_NR_CHANNELS];
+#define CHAN_PROTCTL_PRIVILEGED		BIT(0)
+#define CHAN_PROTCTL_BUFFERABLE		BIT(1)
+#define CHAN_PROTCTL_CACHEABLE		BIT(2)
+#define CHAN_PROTCTL_MASK		GENMASK(2, 0)
+	unsigned char	protctl;
 };
 
 #endif /* _PLATFORM_DATA_DMA_DW_H */
diff -druNp --no-dereference linux-libre-4.19.88-gnu/include/linux/qcom_scm.h linux-libre-4.19.89-gnu/include/linux/qcom_scm.h
--- linux-libre-4.19.88-gnu/include/linux/qcom_scm.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/include/linux/qcom_scm.h	2019-12-13 02:52:59.000000000 -0500
@@ -65,6 +65,9 @@ extern int qcom_scm_iommu_secure_ptbl_in
 extern int qcom_scm_io_readl(phys_addr_t addr, unsigned int *val);
 extern int qcom_scm_io_writel(phys_addr_t addr, unsigned int val);
 #else
+
+#include <linux/errno.h>
+
 static inline
 int qcom_scm_set_cold_boot_addr(void *entry, const cpumask_t *cpus)
 {
diff -druNp --no-dereference linux-libre-4.19.88-gnu/include/linux/regulator/consumer.h linux-libre-4.19.89-gnu/include/linux/regulator/consumer.h
--- linux-libre-4.19.88-gnu/include/linux/regulator/consumer.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/include/linux/regulator/consumer.h	2019-12-13 02:52:59.000000000 -0500
@@ -508,7 +508,7 @@ static inline int regulator_get_error_fl
 
 static inline int regulator_set_load(struct regulator *regulator, int load_uA)
 {
-	return REGULATOR_MODE_NORMAL;
+	return 0;
 }
 
 static inline int regulator_allow_bypass(struct regulator *regulator,
diff -druNp --no-dereference linux-libre-4.19.88-gnu/include/linux/serial_core.h linux-libre-4.19.89-gnu/include/linux/serial_core.h
--- linux-libre-4.19.88-gnu/include/linux/serial_core.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/include/linux/serial_core.h	2019-12-13 02:52:59.000000000 -0500
@@ -173,6 +173,7 @@ struct uart_port {
 	struct console		*cons;			/* struct console, if any */
 #if defined(CONFIG_SERIAL_CORE_CONSOLE) || defined(SUPPORT_SYSRQ)
 	unsigned long		sysrq;			/* sysrq timeout */
+	unsigned int		sysrq_ch;		/* char for sysrq */
 #endif
 
 	/* flags must be updated while holding port mutex */
@@ -482,8 +483,42 @@ uart_handle_sysrq_char(struct uart_port
 	}
 	return 0;
 }
+static inline int
+uart_prepare_sysrq_char(struct uart_port *port, unsigned int ch)
+{
+	if (port->sysrq) {
+		if (ch && time_before(jiffies, port->sysrq)) {
+			port->sysrq_ch = ch;
+			port->sysrq = 0;
+			return 1;
+		}
+		port->sysrq = 0;
+	}
+	return 0;
+}
+static inline void
+uart_unlock_and_check_sysrq(struct uart_port *port, unsigned long irqflags)
+{
+	int sysrq_ch;
+
+	sysrq_ch = port->sysrq_ch;
+	port->sysrq_ch = 0;
+
+	spin_unlock_irqrestore(&port->lock, irqflags);
+
+	if (sysrq_ch)
+		handle_sysrq(sysrq_ch);
+}
 #else
-#define uart_handle_sysrq_char(port,ch) ({ (void)port; 0; })
+static inline int
+uart_handle_sysrq_char(struct uart_port *port, unsigned int ch) { return 0; }
+static inline int
+uart_prepare_sysrq_char(struct uart_port *port, unsigned int ch) { return 0; }
+static inline void
+uart_unlock_and_check_sysrq(struct uart_port *port, unsigned long irqflags)
+{
+	spin_unlock_irqrestore(&port->lock, irqflags);
+}
 #endif
 
 /*
diff -druNp --no-dereference linux-libre-4.19.88-gnu/include/linux/tty.h linux-libre-4.19.89-gnu/include/linux/tty.h
--- linux-libre-4.19.88-gnu/include/linux/tty.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/include/linux/tty.h	2019-12-13 02:52:59.000000000 -0500
@@ -366,6 +366,7 @@ struct tty_file_private {
 #define TTY_NO_WRITE_SPLIT 	17	/* Preserve write boundaries to driver */
 #define TTY_HUPPED 		18	/* Post driver->hangup() */
 #define TTY_HUPPING		19	/* Hangup in progress */
+#define TTY_LDISC_CHANGING	20	/* Change pending - non-block IO */
 #define TTY_LDISC_HALTED	22	/* Line discipline is halted */
 
 /* Values for tty->flow_change */
@@ -383,6 +384,12 @@ static inline void tty_set_flow_change(s
 	smp_mb();
 }
 
+static inline bool tty_io_nonblock(struct tty_struct *tty, struct file *file)
+{
+	return file->f_flags & O_NONBLOCK ||
+		test_bit(TTY_LDISC_CHANGING, &tty->flags);
+}
+
 static inline bool tty_io_error(struct tty_struct *tty)
 {
 	return test_bit(TTY_IO_ERROR, &tty->flags);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/include/math-emu/soft-fp.h linux-libre-4.19.89-gnu/include/math-emu/soft-fp.h
--- linux-libre-4.19.88-gnu/include/math-emu/soft-fp.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/include/math-emu/soft-fp.h	2019-12-13 02:52:59.000000000 -0500
@@ -138,7 +138,7 @@ do {							\
       _FP_FRAC_ADDI_##wc(X, _FP_WORK_ROUND);		\
 } while (0)
 
-#define _FP_ROUND_ZERO(wc, X)		0
+#define _FP_ROUND_ZERO(wc, X)		(void)0
 
 #define _FP_ROUND_PINF(wc, X)				\
 do {							\
diff -druNp --no-dereference linux-libre-4.19.88-gnu/include/net/sctp/sctp.h linux-libre-4.19.89-gnu/include/net/sctp/sctp.h
--- linux-libre-4.19.88-gnu/include/net/sctp/sctp.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/include/net/sctp/sctp.h	2019-12-13 02:52:59.000000000 -0500
@@ -620,4 +620,9 @@ static inline bool sctp_transport_pmtu_c
 	return false;
 }
 
+static inline __u32 sctp_min_frag_point(struct sctp_sock *sp, __u16 datasize)
+{
+	return sctp_mtu_payload(sp, SCTP_DEFAULT_MINSEGMENT, datasize);
+}
+
 #endif /* __net_sctp_h__ */
diff -druNp --no-dereference linux-libre-4.19.88-gnu/include/net/tcp.h linux-libre-4.19.89-gnu/include/net/tcp.h
--- linux-libre-4.19.88-gnu/include/net/tcp.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/include/net/tcp.h	2019-12-13 02:52:59.000000000 -0500
@@ -1353,7 +1353,7 @@ static inline int tcp_win_from_space(con
 /* Note: caller must be prepared to deal with negative returns */
 static inline int tcp_space(const struct sock *sk)
 {
-	return tcp_win_from_space(sk, sk->sk_rcvbuf -
+	return tcp_win_from_space(sk, sk->sk_rcvbuf - sk->sk_backlog.len -
 				  atomic_read(&sk->sk_rmem_alloc));
 }
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/include/net/xfrm.h linux-libre-4.19.89-gnu/include/net/xfrm.h
--- linux-libre-4.19.88-gnu/include/net/xfrm.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/include/net/xfrm.h	2019-12-13 02:52:59.000000000 -0500
@@ -1062,7 +1062,6 @@ struct xfrm_if_parms {
 struct xfrm_if {
 	struct xfrm_if __rcu *next;	/* next interface in list */
 	struct net_device *dev;		/* virtual device associated with interface */
-	struct net_device *phydev;	/* physical device */
 	struct net *net;		/* netns for packet i/o */
 	struct xfrm_if_parms p;		/* interface parms */
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/kernel/audit_tree.c linux-libre-4.19.89-gnu/kernel/audit_tree.c
--- linux-libre-4.19.88-gnu/kernel/audit_tree.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/kernel/audit_tree.c	2019-12-13 02:52:59.000000000 -0500
@@ -24,6 +24,7 @@ struct audit_tree {
 
 struct audit_chunk {
 	struct list_head hash;
+	unsigned long key;
 	struct fsnotify_mark mark;
 	struct list_head trees;		/* with root here */
 	int dead;
@@ -172,21 +173,6 @@ static unsigned long inode_to_key(const
 	return (unsigned long)&inode->i_fsnotify_marks;
 }
 
-/*
- * Function to return search key in our hash from chunk. Key 0 is special and
- * should never be present in the hash.
- */
-static unsigned long chunk_to_key(struct audit_chunk *chunk)
-{
-	/*
-	 * We have a reference to the mark so it should be attached to a
-	 * connector.
-	 */
-	if (WARN_ON_ONCE(!chunk->mark.connector))
-		return 0;
-	return (unsigned long)chunk->mark.connector->obj;
-}
-
 static inline struct list_head *chunk_hash(unsigned long key)
 {
 	unsigned long n = key / L1_CACHE_BYTES;
@@ -196,12 +182,12 @@ static inline struct list_head *chunk_ha
 /* hash_lock & entry->lock is held by caller */
 static void insert_hash(struct audit_chunk *chunk)
 {
-	unsigned long key = chunk_to_key(chunk);
 	struct list_head *list;
 
 	if (!(chunk->mark.flags & FSNOTIFY_MARK_FLAG_ATTACHED))
 		return;
-	list = chunk_hash(key);
+	WARN_ON_ONCE(!chunk->key);
+	list = chunk_hash(chunk->key);
 	list_add_rcu(&chunk->hash, list);
 }
 
@@ -213,7 +199,7 @@ struct audit_chunk *audit_tree_lookup(co
 	struct audit_chunk *p;
 
 	list_for_each_entry_rcu(p, list, hash) {
-		if (chunk_to_key(p) == key) {
+		if (p->key == key) {
 			atomic_long_inc(&p->refs);
 			return p;
 		}
@@ -297,6 +283,7 @@ static void untag_chunk(struct node *p)
 
 	chunk->dead = 1;
 	spin_lock(&hash_lock);
+	new->key = chunk->key;
 	list_replace_init(&chunk->trees, &new->trees);
 	if (owner->root == chunk) {
 		list_del_init(&owner->same_root);
@@ -378,6 +365,7 @@ static int create_chunk(struct inode *in
 		tree->root = chunk;
 		list_add(&tree->same_root, &chunk->trees);
 	}
+	chunk->key = inode_to_key(inode);
 	insert_hash(chunk);
 	spin_unlock(&hash_lock);
 	spin_unlock(&entry->lock);
@@ -462,6 +450,7 @@ static int tag_chunk(struct inode *inode
 		fsnotify_put_mark(old_entry);
 		return 0;
 	}
+	chunk->key = old->key;
 	list_replace_init(&old->trees, &chunk->trees);
 	for (n = 0, p = chunk->owners; n < old->count; n++, p++) {
 		struct audit_tree *s = old->owners[n].owner;
@@ -661,7 +650,7 @@ void audit_trim_trees(void)
 			/* this could be NULL if the watch is dying else where... */
 			node->index |= 1U<<31;
 			if (iterate_mounts(compare_root,
-					   (void *)chunk_to_key(chunk),
+					   (void *)(chunk->key),
 					   root_mnt))
 				node->index &= ~(1U<<31);
 		}
diff -druNp --no-dereference linux-libre-4.19.88-gnu/kernel/audit_watch.c linux-libre-4.19.89-gnu/kernel/audit_watch.c
--- linux-libre-4.19.88-gnu/kernel/audit_watch.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/kernel/audit_watch.c	2019-12-13 02:52:59.000000000 -0500
@@ -366,12 +366,12 @@ static int audit_get_nd(struct audit_wat
 	struct dentry *d = kern_path_locked(watch->path, parent);
 	if (IS_ERR(d))
 		return PTR_ERR(d);
-	inode_unlock(d_backing_inode(parent->dentry));
 	if (d_is_positive(d)) {
 		/* update watch filter fields */
 		watch->dev = d->d_sb->s_dev;
 		watch->ino = d_backing_inode(d)->i_ino;
 	}
+	inode_unlock(d_backing_inode(parent->dentry));
 	dput(d);
 	return 0;
 }
diff -druNp --no-dereference linux-libre-4.19.88-gnu/kernel/bpf/btf.c linux-libre-4.19.89-gnu/kernel/bpf/btf.c
--- linux-libre-4.19.88-gnu/kernel/bpf/btf.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/kernel/bpf/btf.c	2019-12-13 02:52:59.000000000 -0500
@@ -5,6 +5,7 @@
 #include <uapi/linux/types.h>
 #include <linux/seq_file.h>
 #include <linux/compiler.h>
+#include <linux/ctype.h>
 #include <linux/errno.h>
 #include <linux/slab.h>
 #include <linux/anon_inodes.h>
@@ -426,6 +427,30 @@ static bool btf_name_offset_valid(const
 		offset < btf->hdr.str_len;
 }
 
+/* Only C-style identifier is permitted. This can be relaxed if
+ * necessary.
+ */
+static bool btf_name_valid_identifier(const struct btf *btf, u32 offset)
+{
+	/* offset must be valid */
+	const char *src = &btf->strings[offset];
+	const char *src_limit;
+
+	if (!isalpha(*src) && *src != '_')
+		return false;
+
+	/* set a limit on identifier length */
+	src_limit = src + KSYM_NAME_LEN;
+	src++;
+	while (*src && src < src_limit) {
+		if (!isalnum(*src) && *src != '_')
+			return false;
+		src++;
+	}
+
+	return !*src;
+}
+
 static const char *btf_name_by_offset(const struct btf *btf, u32 offset)
 {
 	if (!offset)
@@ -1143,6 +1168,22 @@ static int btf_ref_type_check_meta(struc
 		return -EINVAL;
 	}
 
+	/* typedef type must have a valid name, and other ref types,
+	 * volatile, const, restrict, should have a null name.
+	 */
+	if (BTF_INFO_KIND(t->info) == BTF_KIND_TYPEDEF) {
+		if (!t->name_off ||
+		    !btf_name_valid_identifier(env->btf, t->name_off)) {
+			btf_verifier_log_type(env, t, "Invalid name");
+			return -EINVAL;
+		}
+	} else {
+		if (t->name_off) {
+			btf_verifier_log_type(env, t, "Invalid name");
+			return -EINVAL;
+		}
+	}
+
 	btf_verifier_log_type(env, t, NULL);
 
 	return 0;
@@ -1300,6 +1341,13 @@ static s32 btf_fwd_check_meta(struct btf
 		return -EINVAL;
 	}
 
+	/* fwd type must have a valid name */
+	if (!t->name_off ||
+	    !btf_name_valid_identifier(env->btf, t->name_off)) {
+		btf_verifier_log_type(env, t, "Invalid name");
+		return -EINVAL;
+	}
+
 	btf_verifier_log_type(env, t, NULL);
 
 	return 0;
@@ -1356,6 +1404,12 @@ static s32 btf_array_check_meta(struct b
 		return -EINVAL;
 	}
 
+	/* array type should not have a name */
+	if (t->name_off) {
+		btf_verifier_log_type(env, t, "Invalid name");
+		return -EINVAL;
+	}
+
 	if (btf_type_vlen(t)) {
 		btf_verifier_log_type(env, t, "vlen != 0");
 		return -EINVAL;
@@ -1532,6 +1586,13 @@ static s32 btf_struct_check_meta(struct
 		return -EINVAL;
 	}
 
+	/* struct type either no name or a valid one */
+	if (t->name_off &&
+	    !btf_name_valid_identifier(env->btf, t->name_off)) {
+		btf_verifier_log_type(env, t, "Invalid name");
+		return -EINVAL;
+	}
+
 	btf_verifier_log_type(env, t, NULL);
 
 	last_offset = 0;
@@ -1543,6 +1604,12 @@ static s32 btf_struct_check_meta(struct
 			return -EINVAL;
 		}
 
+		/* struct member either no name or a valid one */
+		if (member->name_off &&
+		    !btf_name_valid_identifier(btf, member->name_off)) {
+			btf_verifier_log_member(env, t, member, "Invalid name");
+			return -EINVAL;
+		}
 		/* A member cannot be in type void */
 		if (!member->type || !BTF_TYPE_ID_VALID(member->type)) {
 			btf_verifier_log_member(env, t, member,
@@ -1730,6 +1797,13 @@ static s32 btf_enum_check_meta(struct bt
 		return -EINVAL;
 	}
 
+	/* enum type either no name or a valid one */
+	if (t->name_off &&
+	    !btf_name_valid_identifier(env->btf, t->name_off)) {
+		btf_verifier_log_type(env, t, "Invalid name");
+		return -EINVAL;
+	}
+
 	btf_verifier_log_type(env, t, NULL);
 
 	for (i = 0; i < nr_enums; i++) {
@@ -1739,6 +1813,14 @@ static s32 btf_enum_check_meta(struct bt
 			return -EINVAL;
 		}
 
+		/* enum member must have a valid name */
+		if (!enums[i].name_off ||
+		    !btf_name_valid_identifier(btf, enums[i].name_off)) {
+			btf_verifier_log_type(env, t, "Invalid name");
+			return -EINVAL;
+		}
+
+
 		btf_verifier_log(env, "\t%s val=%d\n",
 				 btf_name_by_offset(btf, enums[i].name_off),
 				 enums[i].val);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/kernel/events/core.c linux-libre-4.19.89-gnu/kernel/events/core.c
--- linux-libre-4.19.88-gnu/kernel/events/core.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/kernel/events/core.c	2019-12-13 02:52:59.000000000 -0500
@@ -11377,7 +11377,7 @@ inherit_event(struct perf_event *parent_
 						   GFP_KERNEL);
 		if (!child_ctx->task_ctx_data) {
 			free_event(child_event);
-			return NULL;
+			return ERR_PTR(-ENOMEM);
 		}
 	}
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/kernel/sched/core.c linux-libre-4.19.89-gnu/kernel/sched/core.c
--- linux-libre-4.19.88-gnu/kernel/sched/core.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/kernel/sched/core.c	2019-12-13 02:52:59.000000000 -0500
@@ -5413,10 +5413,11 @@ void init_idle(struct task_struct *idle,
 	struct rq *rq = cpu_rq(cpu);
 	unsigned long flags;
 
+	__sched_fork(0, idle);
+
 	raw_spin_lock_irqsave(&idle->pi_lock, flags);
 	raw_spin_lock(&rq->lock);
 
-	__sched_fork(0, idle);
 	idle->state = TASK_RUNNING;
 	idle->se.exec_start = sched_clock();
 	idle->flags |= PF_IDLE;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/kernel/sched/fair.c linux-libre-4.19.89-gnu/kernel/sched/fair.c
--- linux-libre-4.19.88-gnu/kernel/sched/fair.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/kernel/sched/fair.c	2019-12-13 02:52:59.000000000 -0500
@@ -4868,20 +4868,28 @@ static enum hrtimer_restart sched_cfs_pe
 		if (++count > 3) {
 			u64 new, old = ktime_to_ns(cfs_b->period);
 
-			new = (old * 147) / 128; /* ~115% */
-			new = min(new, max_cfs_quota_period);
-
-			cfs_b->period = ns_to_ktime(new);
-
-			/* since max is 1s, this is limited to 1e9^2, which fits in u64 */
-			cfs_b->quota *= new;
-			cfs_b->quota = div64_u64(cfs_b->quota, old);
+			/*
+			 * Grow period by a factor of 2 to avoid losing precision.
+			 * Precision loss in the quota/period ratio can cause __cfs_schedulable
+			 * to fail.
+			 */
+			new = old * 2;
+			if (new < max_cfs_quota_period) {
+				cfs_b->period = ns_to_ktime(new);
+				cfs_b->quota *= 2;
 
-			pr_warn_ratelimited(
-        "cfs_period_timer[cpu%d]: period too short, scaling up (new cfs_period_us %lld, cfs_quota_us = %lld)\n",
-	                        smp_processor_id(),
-	                        div_u64(new, NSEC_PER_USEC),
-                                div_u64(cfs_b->quota, NSEC_PER_USEC));
+				pr_warn_ratelimited(
+	"cfs_period_timer[cpu%d]: period too short, scaling up (new cfs_period_us = %lld, cfs_quota_us = %lld)\n",
+					smp_processor_id(),
+					div_u64(new, NSEC_PER_USEC),
+					div_u64(cfs_b->quota, NSEC_PER_USEC));
+			} else {
+				pr_warn_ratelimited(
+	"cfs_period_timer[cpu%d]: period too short, but cannot scale up without losing precision (cfs_period_us = %lld, cfs_quota_us = %lld)\n",
+					smp_processor_id(),
+					div_u64(old, NSEC_PER_USEC),
+					div_u64(cfs_b->quota, NSEC_PER_USEC));
+			}
 
 			/* reset count so we don't come right back in here */
 			count = 0;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/Makefile linux-libre-4.19.89-gnu/Makefile
--- linux-libre-4.19.88-gnu/Makefile	2019-12-05 06:17:29.000000000 -0500
+++ linux-libre-4.19.89-gnu/Makefile	2019-12-13 17:42:34.000000000 -0500
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 88
+SUBLEVEL = 89
 EXTRAVERSION = -gnu
 NAME = "People's Front"
 
@@ -1507,9 +1507,6 @@ else # KBUILD_EXTMOD
 
 # We are always building modules
 KBUILD_MODULES := 1
-PHONY += crmodverdir
-crmodverdir:
-	$(cmd_crmodverdir)
 
 PHONY += $(objtree)/Module.symvers
 $(objtree)/Module.symvers:
@@ -1521,7 +1518,7 @@ $(objtree)/Module.symvers:
 
 module-dirs := $(addprefix _module_,$(KBUILD_EXTMOD))
 PHONY += $(module-dirs) modules
-$(module-dirs): crmodverdir $(objtree)/Module.symvers
+$(module-dirs): prepare $(objtree)/Module.symvers
 	$(Q)$(MAKE) $(build)=$(patsubst _module_%,%,$@)
 
 modules: $(module-dirs)
@@ -1562,7 +1559,8 @@ help:
 
 # Dummies...
 PHONY += prepare scripts
-prepare: ;
+prepare:
+	$(cmd_crmodverdir)
 scripts: ;
 endif # KBUILD_EXTMOD
 
@@ -1689,17 +1687,14 @@ endif
 
 # Modules
 /: prepare scripts FORCE
-	$(cmd_crmodverdir)
 	$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
 	$(build)=$(build-dir)
 # Make sure the latest headers are built for Documentation
 Documentation/ samples/: headers_install
 %/: prepare scripts FORCE
-	$(cmd_crmodverdir)
 	$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
 	$(build)=$(build-dir)
 %.ko: prepare scripts FORCE
-	$(cmd_crmodverdir)
 	$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1)   \
 	$(build)=$(build-dir) $(@:.ko=.o)
 	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
diff -druNp --no-dereference linux-libre-4.19.88-gnu/mm/vmstat.c linux-libre-4.19.89-gnu/mm/vmstat.c
--- linux-libre-4.19.88-gnu/mm/vmstat.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/mm/vmstat.c	2019-12-13 02:52:59.000000000 -0500
@@ -1826,12 +1826,13 @@ static bool need_update(int cpu)
 
 		/*
 		 * The fast way of checking if there are any vmstat diffs.
-		 * This works because the diffs are byte sized items.
 		 */
-		if (memchr_inv(p->vm_stat_diff, 0, NR_VM_ZONE_STAT_ITEMS))
+		if (memchr_inv(p->vm_stat_diff, 0, NR_VM_ZONE_STAT_ITEMS *
+			       sizeof(p->vm_stat_diff[0])))
 			return true;
 #ifdef CONFIG_NUMA
-		if (memchr_inv(p->vm_numa_stat_diff, 0, NR_VM_NUMA_STAT_ITEMS))
+		if (memchr_inv(p->vm_numa_stat_diff, 0, NR_VM_NUMA_STAT_ITEMS *
+			       sizeof(p->vm_numa_stat_diff[0])))
 			return true;
 #endif
 	}
diff -druNp --no-dereference linux-libre-4.19.88-gnu/net/appletalk/aarp.c linux-libre-4.19.89-gnu/net/appletalk/aarp.c
--- linux-libre-4.19.88-gnu/net/appletalk/aarp.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/net/appletalk/aarp.c	2019-12-13 02:52:59.000000000 -0500
@@ -879,15 +879,24 @@ static struct notifier_block aarp_notifi
 
 static unsigned char aarp_snap_id[] = { 0x00, 0x00, 0x00, 0x80, 0xF3 };
 
-void __init aarp_proto_init(void)
+int __init aarp_proto_init(void)
 {
+	int rc;
+
 	aarp_dl = register_snap_client(aarp_snap_id, aarp_rcv);
-	if (!aarp_dl)
+	if (!aarp_dl) {
 		printk(KERN_CRIT "Unable to register AARP with SNAP.\n");
+		return -ENOMEM;
+	}
 	timer_setup(&aarp_timer, aarp_expire_timeout, 0);
 	aarp_timer.expires  = jiffies + sysctl_aarp_expiry_time;
 	add_timer(&aarp_timer);
-	register_netdevice_notifier(&aarp_notifier);
+	rc = register_netdevice_notifier(&aarp_notifier);
+	if (rc) {
+		del_timer_sync(&aarp_timer);
+		unregister_snap_client(aarp_dl);
+	}
+	return rc;
 }
 
 /* Remove the AARP entries associated with a device. */
diff -druNp --no-dereference linux-libre-4.19.88-gnu/net/appletalk/ddp.c linux-libre-4.19.89-gnu/net/appletalk/ddp.c
--- linux-libre-4.19.88-gnu/net/appletalk/ddp.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/net/appletalk/ddp.c	2019-12-13 02:52:59.000000000 -0500
@@ -1909,9 +1909,6 @@ static unsigned char ddp_snap_id[] = { 0
 EXPORT_SYMBOL(atrtr_get_dev);
 EXPORT_SYMBOL(atalk_find_dev_addr);
 
-static const char atalk_err_snap[] __initconst =
-	KERN_CRIT "Unable to register DDP with SNAP.\n";
-
 /* Called by proto.c on kernel start up */
 static int __init atalk_init(void)
 {
@@ -1926,17 +1923,23 @@ static int __init atalk_init(void)
 		goto out_proto;
 
 	ddp_dl = register_snap_client(ddp_snap_id, atalk_rcv);
-	if (!ddp_dl)
-		printk(atalk_err_snap);
+	if (!ddp_dl) {
+		pr_crit("Unable to register DDP with SNAP.\n");
+		rc = -ENOMEM;
+		goto out_sock;
+	}
 
 	dev_add_pack(&ltalk_packet_type);
 	dev_add_pack(&ppptalk_packet_type);
 
 	rc = register_netdevice_notifier(&ddp_notifier);
 	if (rc)
-		goto out_sock;
+		goto out_snap;
+
+	rc = aarp_proto_init();
+	if (rc)
+		goto out_dev;
 
-	aarp_proto_init();
 	rc = atalk_proc_init();
 	if (rc)
 		goto out_aarp;
@@ -1950,11 +1953,13 @@ out_proc:
 	atalk_proc_exit();
 out_aarp:
 	aarp_cleanup_module();
+out_dev:
 	unregister_netdevice_notifier(&ddp_notifier);
-out_sock:
+out_snap:
 	dev_remove_pack(&ppptalk_packet_type);
 	dev_remove_pack(&ltalk_packet_type);
 	unregister_snap_client(ddp_dl);
+out_sock:
 	sock_unregister(PF_APPLETALK);
 out_proto:
 	proto_unregister(&ddp_proto);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/net/ipv4/tcp_output.c linux-libre-4.19.89-gnu/net/ipv4/tcp_output.c
--- linux-libre-4.19.88-gnu/net/ipv4/tcp_output.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/net/ipv4/tcp_output.c	2019-12-13 02:52:59.000000000 -0500
@@ -2919,7 +2919,7 @@ int __tcp_retransmit_skb(struct sock *sk
 		TCP_SKB_CB(skb)->sacked |= TCPCB_EVER_RETRANS;
 		trace_tcp_retransmit_skb(sk, skb);
 	} else if (err != -EBUSY) {
-		NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPRETRANSFAIL);
+		NET_ADD_STATS(sock_net(sk), LINUX_MIB_TCPRETRANSFAIL, segs);
 	}
 	return err;
 }
diff -druNp --no-dereference linux-libre-4.19.88-gnu/net/ipv4/tcp_timer.c linux-libre-4.19.89-gnu/net/ipv4/tcp_timer.c
--- linux-libre-4.19.88-gnu/net/ipv4/tcp_timer.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/net/ipv4/tcp_timer.c	2019-12-13 02:52:59.000000000 -0500
@@ -378,7 +378,7 @@ static void tcp_probe_timer(struct sock
 			return;
 	}
 
-	if (icsk->icsk_probes_out > max_probes) {
+	if (icsk->icsk_probes_out >= max_probes) {
 abort:		tcp_write_err(sk);
 	} else {
 		/* Only send another probe if we didn't close things up. */
@@ -482,11 +482,12 @@ void tcp_retransmit_timer(struct sock *s
 		goto out_reset_timer;
 	}
 
+	__NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPTIMEOUTS);
 	if (tcp_write_timeout(sk))
 		goto out;
 
 	if (icsk->icsk_retransmits == 0) {
-		int mib_idx;
+		int mib_idx = 0;
 
 		if (icsk->icsk_ca_state == TCP_CA_Recovery) {
 			if (tcp_is_sack(tp))
@@ -501,10 +502,9 @@ void tcp_retransmit_timer(struct sock *s
 				mib_idx = LINUX_MIB_TCPSACKFAILURES;
 			else
 				mib_idx = LINUX_MIB_TCPRENOFAILURES;
-		} else {
-			mib_idx = LINUX_MIB_TCPTIMEOUTS;
 		}
-		__NET_INC_STATS(sock_net(sk), mib_idx);
+		if (mib_idx)
+			__NET_INC_STATS(sock_net(sk), mib_idx);
 	}
 
 	tcp_enter_loss(sk);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/net/ipv6/addrconf.c linux-libre-4.19.89-gnu/net/ipv6/addrconf.c
--- linux-libre-4.19.88-gnu/net/ipv6/addrconf.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/net/ipv6/addrconf.c	2019-12-13 02:52:59.000000000 -0500
@@ -179,7 +179,7 @@ static void addrconf_dad_start(struct in
 static void addrconf_dad_work(struct work_struct *w);
 static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id,
 				   bool send_na);
-static void addrconf_dad_run(struct inet6_dev *idev);
+static void addrconf_dad_run(struct inet6_dev *idev, bool restart);
 static void addrconf_rs_timer(struct timer_list *t);
 static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa);
 static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa);
@@ -3424,6 +3424,7 @@ static int addrconf_notify(struct notifi
 			   void *ptr)
 {
 	struct net_device *dev = netdev_notifier_info_to_dev(ptr);
+	struct netdev_notifier_change_info *change_info;
 	struct netdev_notifier_changeupper_info *info;
 	struct inet6_dev *idev = __in6_dev_get(dev);
 	struct net *net = dev_net(dev);
@@ -3498,7 +3499,7 @@ static int addrconf_notify(struct notifi
 				break;
 			}
 
-			if (idev) {
+			if (!IS_ERR_OR_NULL(idev)) {
 				if (idev->if_flags & IF_READY) {
 					/* device is already configured -
 					 * but resend MLD reports, we might
@@ -3506,6 +3507,9 @@ static int addrconf_notify(struct notifi
 					 * multicast snooping switches
 					 */
 					ipv6_mc_up(idev);
+					change_info = ptr;
+					if (change_info->flags_changed & IFF_NOARP)
+						addrconf_dad_run(idev, true);
 					rt6_sync_up(dev, RTNH_F_LINKDOWN);
 					break;
 				}
@@ -3540,7 +3544,7 @@ static int addrconf_notify(struct notifi
 
 		if (!IS_ERR_OR_NULL(idev)) {
 			if (run_pending)
-				addrconf_dad_run(idev);
+				addrconf_dad_run(idev, false);
 
 			/* Device has an address by now */
 			rt6_sync_up(dev, RTNH_F_DEAD);
@@ -4158,16 +4162,19 @@ static void addrconf_dad_completed(struc
 		addrconf_verify_rtnl();
 }
 
-static void addrconf_dad_run(struct inet6_dev *idev)
+static void addrconf_dad_run(struct inet6_dev *idev, bool restart)
 {
 	struct inet6_ifaddr *ifp;
 
 	read_lock_bh(&idev->lock);
 	list_for_each_entry(ifp, &idev->addr_list, if_list) {
 		spin_lock(&ifp->lock);
-		if (ifp->flags & IFA_F_TENTATIVE &&
-		    ifp->state == INET6_IFADDR_STATE_DAD)
+		if ((ifp->flags & IFA_F_TENTATIVE &&
+		     ifp->state == INET6_IFADDR_STATE_DAD) || restart) {
+			if (restart)
+				ifp->state = INET6_IFADDR_STATE_PREDAD;
 			addrconf_dad_kick(ifp);
+		}
 		spin_unlock(&ifp->lock);
 	}
 	read_unlock_bh(&idev->lock);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/net/netfilter/nf_tables_api.c linux-libre-4.19.89-gnu/net/netfilter/nf_tables_api.c
--- linux-libre-4.19.88-gnu/net/netfilter/nf_tables_api.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/net/netfilter/nf_tables_api.c	2019-12-13 02:52:59.000000000 -0500
@@ -2610,17 +2610,14 @@ static int nf_tables_newrule(struct net
 
 		if (chain->use == UINT_MAX)
 			return -EOVERFLOW;
-	}
-
-	if (nla[NFTA_RULE_POSITION]) {
-		if (!(nlh->nlmsg_flags & NLM_F_CREATE))
-			return -EOPNOTSUPP;
 
-		pos_handle = be64_to_cpu(nla_get_be64(nla[NFTA_RULE_POSITION]));
-		old_rule = __nft_rule_lookup(chain, pos_handle);
-		if (IS_ERR(old_rule)) {
-			NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_POSITION]);
-			return PTR_ERR(old_rule);
+		if (nla[NFTA_RULE_POSITION]) {
+			pos_handle = be64_to_cpu(nla_get_be64(nla[NFTA_RULE_POSITION]));
+			old_rule = __nft_rule_lookup(chain, pos_handle);
+			if (IS_ERR(old_rule)) {
+				NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_POSITION]);
+				return PTR_ERR(old_rule);
+			}
 		}
 	}
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/net/qrtr/tun.c linux-libre-4.19.89-gnu/net/qrtr/tun.c
--- linux-libre-4.19.88-gnu/net/qrtr/tun.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/net/qrtr/tun.c	2019-12-13 02:52:59.000000000 -0500
@@ -84,11 +84,14 @@ static ssize_t qrtr_tun_write_iter(struc
 	if (!kbuf)
 		return -ENOMEM;
 
-	if (!copy_from_iter_full(kbuf, len, from))
+	if (!copy_from_iter_full(kbuf, len, from)) {
+		kfree(kbuf);
 		return -EFAULT;
+	}
 
 	ret = qrtr_endpoint_post(&tun->ep, kbuf, len);
 
+	kfree(kbuf);
 	return ret < 0 ? ret : len;
 }
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/net/sctp/chunk.c linux-libre-4.19.89-gnu/net/sctp/chunk.c
--- linux-libre-4.19.88-gnu/net/sctp/chunk.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/net/sctp/chunk.c	2019-12-13 02:52:59.000000000 -0500
@@ -191,6 +191,12 @@ struct sctp_datamsg *sctp_datamsg_from_u
 	 * the packet
 	 */
 	max_data = asoc->frag_point;
+	if (unlikely(!max_data)) {
+		max_data = sctp_min_frag_point(sctp_sk(asoc->base.sk),
+					       sctp_datachk_len(&asoc->stream));
+		pr_warn_ratelimited("%s: asoc:%p frag_point is zero, forcing max_data to default minimum (%Zu)",
+				    __func__, asoc, max_data);
+	}
 
 	/* If the the peer requested that we authenticate DATA chunks
 	 * we need to account for bundling of the AUTH chunks along with
diff -druNp --no-dereference linux-libre-4.19.88-gnu/net/sctp/output.c linux-libre-4.19.89-gnu/net/sctp/output.c
--- linux-libre-4.19.88-gnu/net/sctp/output.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/net/sctp/output.c	2019-12-13 02:52:59.000000000 -0500
@@ -399,25 +399,6 @@ finish:
 	return retval;
 }
 
-static void sctp_packet_release_owner(struct sk_buff *skb)
-{
-	sk_free(skb->sk);
-}
-
-static void sctp_packet_set_owner_w(struct sk_buff *skb, struct sock *sk)
-{
-	skb_orphan(skb);
-	skb->sk = sk;
-	skb->destructor = sctp_packet_release_owner;
-
-	/*
-	 * The data chunks have already been accounted for in sctp_sendmsg(),
-	 * therefore only reserve a single byte to keep socket around until
-	 * the packet has been transmitted.
-	 */
-	refcount_inc(&sk->sk_wmem_alloc);
-}
-
 static void sctp_packet_gso_append(struct sk_buff *head, struct sk_buff *skb)
 {
 	if (SCTP_OUTPUT_CB(head)->last == head)
@@ -429,6 +410,7 @@ static void sctp_packet_gso_append(struc
 	head->truesize += skb->truesize;
 	head->data_len += skb->len;
 	head->len += skb->len;
+	refcount_add(skb->truesize, &head->sk->sk_wmem_alloc);
 
 	__skb_header_release(skb);
 }
@@ -604,7 +586,7 @@ int sctp_packet_transmit(struct sctp_pac
 	if (!head)
 		goto out;
 	skb_reserve(head, packet->overhead + MAX_HEADER);
-	sctp_packet_set_owner_w(head, sk);
+	skb_set_owner_w(head, sk);
 
 	/* set sctp header */
 	sh = skb_push(head, sizeof(struct sctphdr));
diff -druNp --no-dereference linux-libre-4.19.88-gnu/net/sctp/socket.c linux-libre-4.19.89-gnu/net/sctp/socket.c
--- linux-libre-4.19.88-gnu/net/sctp/socket.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/net/sctp/socket.c	2019-12-13 02:52:59.000000000 -0500
@@ -3328,8 +3328,7 @@ static int sctp_setsockopt_maxseg(struct
 		__u16 datasize = asoc ? sctp_datachk_len(&asoc->stream) :
 				 sizeof(struct sctp_data_chunk);
 
-		min_len = sctp_mtu_payload(sp, SCTP_DEFAULT_MINSEGMENT,
-					   datasize);
+		min_len = sctp_min_frag_point(sp, datasize);
 		max_len = SCTP_MAX_CHUNK_LEN - datasize;
 
 		if (val < min_len || val > max_len)
diff -druNp --no-dereference linux-libre-4.19.88-gnu/net/smc/smc_wr.c linux-libre-4.19.89-gnu/net/smc/smc_wr.c
--- linux-libre-4.19.88-gnu/net/smc/smc_wr.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/net/smc/smc_wr.c	2019-12-13 02:52:59.000000000 -0500
@@ -215,12 +215,14 @@ int smc_wr_tx_put_slot(struct smc_link *
 
 	pend = container_of(wr_pend_priv, struct smc_wr_tx_pend, priv);
 	if (pend->idx < link->wr_tx_cnt) {
+		u32 idx = pend->idx;
+
 		/* clear the full struct smc_wr_tx_pend including .priv */
 		memset(&link->wr_tx_pends[pend->idx], 0,
 		       sizeof(link->wr_tx_pends[pend->idx]));
 		memset(&link->wr_tx_bufs[pend->idx], 0,
 		       sizeof(link->wr_tx_bufs[pend->idx]));
-		test_and_clear_bit(pend->idx, link->wr_tx_mask);
+		test_and_clear_bit(idx, link->wr_tx_mask);
 		return 1;
 	}
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/net/x25/af_x25.c linux-libre-4.19.89-gnu/net/x25/af_x25.c
--- linux-libre-4.19.88-gnu/net/x25/af_x25.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/net/x25/af_x25.c	2019-12-13 02:52:59.000000000 -0500
@@ -100,7 +100,7 @@ int x25_parse_address_block(struct sk_bu
 	}
 
 	len = *skb->data;
-	needed = 1 + (len >> 4) + (len & 0x0f);
+	needed = 1 + ((len >> 4) + (len & 0x0f) + 1) / 2;
 
 	if (!pskb_may_pull(skb, needed)) {
 		/* packet is too short to hold the addresses it claims
@@ -288,7 +288,7 @@ static struct sock *x25_find_listener(st
 	sk_for_each(s, &x25_list)
 		if ((!strcmp(addr->x25_addr,
 			x25_sk(s)->source_addr.x25_addr) ||
-				!strcmp(addr->x25_addr,
+				!strcmp(x25_sk(s)->source_addr.x25_addr,
 					null_x25_address.x25_addr)) &&
 					s->sk_state == TCP_LISTEN) {
 			/*
@@ -685,11 +685,15 @@ static int x25_bind(struct socket *sock,
 		goto out;
 	}
 
-	len = strlen(addr->sx25_addr.x25_addr);
-	for (i = 0; i < len; i++) {
-		if (!isdigit(addr->sx25_addr.x25_addr[i])) {
-			rc = -EINVAL;
-			goto out;
+	/* check for the null_x25_address */
+	if (strcmp(addr->sx25_addr.x25_addr, null_x25_address.x25_addr)) {
+
+		len = strlen(addr->sx25_addr.x25_addr);
+		for (i = 0; i < len; i++) {
+			if (!isdigit(addr->sx25_addr.x25_addr[i])) {
+				rc = -EINVAL;
+				goto out;
+			}
 		}
 	}
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/net/xfrm/xfrm_input.c linux-libre-4.19.89-gnu/net/xfrm/xfrm_input.c
--- linux-libre-4.19.88-gnu/net/xfrm/xfrm_input.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/net/xfrm/xfrm_input.c	2019-12-13 02:52:59.000000000 -0500
@@ -246,6 +246,9 @@ int xfrm_input(struct sk_buff *skb, int
 			else
 				XFRM_INC_STATS(net,
 					       LINUX_MIB_XFRMINSTATEINVALID);
+
+			if (encap_type == -1)
+				dev_put(skb->dev);
 			goto drop;
 		}
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/net/xfrm/xfrm_interface.c linux-libre-4.19.89-gnu/net/xfrm/xfrm_interface.c
--- linux-libre-4.19.88-gnu/net/xfrm/xfrm_interface.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/net/xfrm/xfrm_interface.c	2019-12-13 02:52:59.000000000 -0500
@@ -133,7 +133,7 @@ static void xfrmi_dev_free(struct net_de
 	free_percpu(dev->tstats);
 }
 
-static int xfrmi_create2(struct net_device *dev)
+static int xfrmi_create(struct net_device *dev)
 {
 	struct xfrm_if *xi = netdev_priv(dev);
 	struct net *net = dev_net(dev);
@@ -156,54 +156,7 @@ out:
 	return err;
 }
 
-static struct xfrm_if *xfrmi_create(struct net *net, struct xfrm_if_parms *p)
-{
-	struct net_device *dev;
-	struct xfrm_if *xi;
-	char name[IFNAMSIZ];
-	int err;
-
-	if (p->name[0]) {
-		strlcpy(name, p->name, IFNAMSIZ);
-	} else {
-		err = -EINVAL;
-		goto failed;
-	}
-
-	dev = alloc_netdev(sizeof(*xi), name, NET_NAME_UNKNOWN, xfrmi_dev_setup);
-	if (!dev) {
-		err = -EAGAIN;
-		goto failed;
-	}
-
-	dev_net_set(dev, net);
-
-	xi = netdev_priv(dev);
-	xi->p = *p;
-	xi->net = net;
-	xi->dev = dev;
-	xi->phydev = dev_get_by_index(net, p->link);
-	if (!xi->phydev) {
-		err = -ENODEV;
-		goto failed_free;
-	}
-
-	err = xfrmi_create2(dev);
-	if (err < 0)
-		goto failed_dev_put;
-
-	return xi;
-
-failed_dev_put:
-	dev_put(xi->phydev);
-failed_free:
-	free_netdev(dev);
-failed:
-	return ERR_PTR(err);
-}
-
-static struct xfrm_if *xfrmi_locate(struct net *net, struct xfrm_if_parms *p,
-				   int create)
+static struct xfrm_if *xfrmi_locate(struct net *net, struct xfrm_if_parms *p)
 {
 	struct xfrm_if __rcu **xip;
 	struct xfrm_if *xi;
@@ -211,17 +164,11 @@ static struct xfrm_if *xfrmi_locate(stru
 
 	for (xip = &xfrmn->xfrmi[0];
 	     (xi = rtnl_dereference(*xip)) != NULL;
-	     xip = &xi->next) {
-		if (xi->p.if_id == p->if_id) {
-			if (create)
-				return ERR_PTR(-EEXIST);
-
+	     xip = &xi->next)
+		if (xi->p.if_id == p->if_id)
 			return xi;
-		}
-	}
-	if (!create)
-		return ERR_PTR(-ENODEV);
-	return xfrmi_create(net, p);
+
+	return NULL;
 }
 
 static void xfrmi_dev_uninit(struct net_device *dev)
@@ -230,7 +177,6 @@ static void xfrmi_dev_uninit(struct net_
 	struct xfrmi_net *xfrmn = net_generic(xi->net, xfrmi_net_id);
 
 	xfrmi_unlink(xfrmn, xi);
-	dev_put(xi->phydev);
 	dev_put(dev);
 }
 
@@ -417,7 +363,7 @@ static netdev_tx_t xfrmi_xmit(struct sk_
 		goto tx_err;
 	}
 
-	fl.flowi_oif = xi->phydev->ifindex;
+	fl.flowi_oif = xi->p.link;
 
 	ret = xfrmi_xmit2(skb, dev, &fl);
 	if (ret < 0)
@@ -558,7 +504,7 @@ static int xfrmi_change(struct xfrm_if *
 
 static int xfrmi_update(struct xfrm_if *xi, struct xfrm_if_parms *p)
 {
-	struct net *net = dev_net(xi->dev);
+	struct net *net = xi->net;
 	struct xfrmi_net *xfrmn = net_generic(net, xfrmi_net_id);
 	int err;
 
@@ -606,7 +552,7 @@ static int xfrmi_get_iflink(const struct
 {
 	struct xfrm_if *xi = netdev_priv(dev);
 
-	return xi->phydev->ifindex;
+	return xi->p.link;
 }
 
 
@@ -632,12 +578,14 @@ static void xfrmi_dev_setup(struct net_d
 	dev->needs_free_netdev	= true;
 	dev->priv_destructor	= xfrmi_dev_free;
 	netif_keep_dst(dev);
+
+	eth_broadcast_addr(dev->broadcast);
 }
 
 static int xfrmi_dev_init(struct net_device *dev)
 {
 	struct xfrm_if *xi = netdev_priv(dev);
-	struct net_device *phydev = xi->phydev;
+	struct net_device *phydev = __dev_get_by_index(xi->net, xi->p.link);
 	int err;
 
 	dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
@@ -652,13 +600,19 @@ static int xfrmi_dev_init(struct net_dev
 
 	dev->features |= NETIF_F_LLTX;
 
-	dev->needed_headroom = phydev->needed_headroom;
-	dev->needed_tailroom = phydev->needed_tailroom;
+	if (phydev) {
+		dev->needed_headroom = phydev->needed_headroom;
+		dev->needed_tailroom = phydev->needed_tailroom;
 
-	if (is_zero_ether_addr(dev->dev_addr))
-		eth_hw_addr_inherit(dev, phydev);
-	if (is_zero_ether_addr(dev->broadcast))
-		memcpy(dev->broadcast, phydev->broadcast, dev->addr_len);
+		if (is_zero_ether_addr(dev->dev_addr))
+			eth_hw_addr_inherit(dev, phydev);
+		if (is_zero_ether_addr(dev->broadcast))
+			memcpy(dev->broadcast, phydev->broadcast,
+			       dev->addr_len);
+	} else {
+		eth_hw_addr_random(dev);
+		eth_broadcast_addr(dev->broadcast);
+	}
 
 	return 0;
 }
@@ -689,21 +643,28 @@ static int xfrmi_newlink(struct net *src
 			struct netlink_ext_ack *extack)
 {
 	struct net *net = dev_net(dev);
-	struct xfrm_if_parms *p;
+	struct xfrm_if_parms p;
 	struct xfrm_if *xi;
+	int err;
 
-	xi = netdev_priv(dev);
-	p = &xi->p;
-
-	xfrmi_netlink_parms(data, p);
+	xfrmi_netlink_parms(data, &p);
 
 	if (!tb[IFLA_IFNAME])
 		return -EINVAL;
 
-	nla_strlcpy(p->name, tb[IFLA_IFNAME], IFNAMSIZ);
+	nla_strlcpy(p.name, tb[IFLA_IFNAME], IFNAMSIZ);
 
-	xi = xfrmi_locate(net, p, 1);
-	return PTR_ERR_OR_ZERO(xi);
+	xi = xfrmi_locate(net, &p);
+	if (xi)
+		return -EEXIST;
+
+	xi = netdev_priv(dev);
+	xi->p = p;
+	xi->net = net;
+	xi->dev = dev;
+
+	err = xfrmi_create(dev);
+	return err;
 }
 
 static void xfrmi_dellink(struct net_device *dev, struct list_head *head)
@@ -716,20 +677,19 @@ static int xfrmi_changelink(struct net_d
 			   struct netlink_ext_ack *extack)
 {
 	struct xfrm_if *xi = netdev_priv(dev);
-	struct net *net = dev_net(dev);
-
-	xfrmi_netlink_parms(data, &xi->p);
-
-	xi = xfrmi_locate(net, &xi->p, 0);
+	struct net *net = xi->net;
+	struct xfrm_if_parms p;
 
-	if (IS_ERR_OR_NULL(xi)) {
+	xfrmi_netlink_parms(data, &p);
+	xi = xfrmi_locate(net, &p);
+	if (!xi) {
 		xi = netdev_priv(dev);
 	} else {
 		if (xi->dev != dev)
 			return -EEXIST;
 	}
 
-	return xfrmi_update(xi, &xi->p);
+	return xfrmi_update(xi, &p);
 }
 
 static size_t xfrmi_get_size(const struct net_device *dev)
@@ -760,7 +720,7 @@ struct net *xfrmi_get_link_net(const str
 {
 	struct xfrm_if *xi = netdev_priv(dev);
 
-	return dev_net(xi->phydev);
+	return xi->net;
 }
 
 static const struct nla_policy xfrmi_policy[IFLA_XFRM_MAX + 1] = {
diff -druNp --no-dereference linux-libre-4.19.88-gnu/scripts/Makefile.lib linux-libre-4.19.89-gnu/scripts/Makefile.lib
--- linux-libre-4.19.88-gnu/scripts/Makefile.lib	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/scripts/Makefile.lib	2019-12-13 02:52:59.000000000 -0500
@@ -252,6 +252,7 @@ DTC_FLAGS += -Wno-unit_address_vs_reg \
 	-Wno-alias_paths \
 	-Wno-graph_child_address \
 	-Wno-graph_port \
+	-Wno-simple_bus_reg \
 	-Wno-unique_unit_address \
 	-Wno-pci_device_reg
 endif
diff -druNp --no-dereference linux-libre-4.19.88-gnu/scripts/mod/modpost.c linux-libre-4.19.89-gnu/scripts/mod/modpost.c
--- linux-libre-4.19.88-gnu/scripts/mod/modpost.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/scripts/mod/modpost.c	2019-12-13 02:52:59.000000000 -0500
@@ -1163,6 +1163,14 @@ static const struct sectioncheck *sectio
  *   fromsec = text section
  *   refsymname = *.constprop.*
  *
+ * Pattern 6:
+ *   Hide section mismatch warnings for ELF local symbols.  The goal
+ *   is to eliminate false positive modpost warnings caused by
+ *   compiler-generated ELF local symbol names such as ".LANCHOR1".
+ *   Autogenerated symbol names bypass modpost's "Pattern 2"
+ *   whitelisting, which relies on pattern-matching against symbol
+ *   names to work.  (One situation where gcc can autogenerate ELF
+ *   local symbols is when "-fsection-anchors" is used.)
  **/
 static int secref_whitelist(const struct sectioncheck *mismatch,
 			    const char *fromsec, const char *fromsym,
@@ -1201,6 +1209,10 @@ static int secref_whitelist(const struct
 	    match(fromsym, optim_symbols))
 		return 0;
 
+	/* Check for pattern 6 */
+	if (strstarts(fromsym, ".L"))
+		return 0;
+
 	return 1;
 }
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/sound/core/oss/linear.c linux-libre-4.19.89-gnu/sound/core/oss/linear.c
--- linux-libre-4.19.88-gnu/sound/core/oss/linear.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/sound/core/oss/linear.c	2019-12-13 02:52:59.000000000 -0500
@@ -107,6 +107,8 @@ static snd_pcm_sframes_t linear_transfer
 		}
 	}
 #endif
+	if (frames > dst_channels[0].frames)
+		frames = dst_channels[0].frames;
 	convert(plugin, src_channels, dst_channels, frames);
 	return frames;
 }
diff -druNp --no-dereference linux-libre-4.19.88-gnu/sound/core/oss/mulaw.c linux-libre-4.19.89-gnu/sound/core/oss/mulaw.c
--- linux-libre-4.19.88-gnu/sound/core/oss/mulaw.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/sound/core/oss/mulaw.c	2019-12-13 02:52:59.000000000 -0500
@@ -269,6 +269,8 @@ static snd_pcm_sframes_t mulaw_transfer(
 		}
 	}
 #endif
+	if (frames > dst_channels[0].frames)
+		frames = dst_channels[0].frames;
 	data = (struct mulaw_priv *)plugin->extra_data;
 	data->func(plugin, src_channels, dst_channels, frames);
 	return frames;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/sound/core/oss/route.c linux-libre-4.19.89-gnu/sound/core/oss/route.c
--- linux-libre-4.19.88-gnu/sound/core/oss/route.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/sound/core/oss/route.c	2019-12-13 02:52:59.000000000 -0500
@@ -57,6 +57,8 @@ static snd_pcm_sframes_t route_transfer(
 		return -ENXIO;
 	if (frames == 0)
 		return 0;
+	if (frames > dst_channels[0].frames)
+		frames = dst_channels[0].frames;
 
 	nsrcs = plugin->src_format.channels;
 	ndsts = plugin->dst_format.channels;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/sound/core/pcm_lib.c linux-libre-4.19.89-gnu/sound/core/pcm_lib.c
--- linux-libre-4.19.88-gnu/sound/core/pcm_lib.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/sound/core/pcm_lib.c	2019-12-13 02:52:59.000000000 -0500
@@ -1797,11 +1797,14 @@ void snd_pcm_period_elapsed(struct snd_p
 	struct snd_pcm_runtime *runtime;
 	unsigned long flags;
 
-	if (PCM_RUNTIME_CHECK(substream))
+	if (snd_BUG_ON(!substream))
 		return;
-	runtime = substream->runtime;
 
 	snd_pcm_stream_lock_irqsave(substream, flags);
+	if (PCM_RUNTIME_CHECK(substream))
+		goto _unlock;
+	runtime = substream->runtime;
+
 	if (!snd_pcm_running(substream) ||
 	    snd_pcm_update_hw_ptr0(substream, 1) < 0)
 		goto _end;
@@ -1812,6 +1815,7 @@ void snd_pcm_period_elapsed(struct snd_p
 #endif
  _end:
 	kill_fasync(&runtime->fasync, SIGIO, POLL_IN);
+ _unlock:
 	snd_pcm_stream_unlock_irqrestore(substream, flags);
 }
 EXPORT_SYMBOL(snd_pcm_period_elapsed);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/sound/pci/hda/hda_bind.c linux-libre-4.19.89-gnu/sound/pci/hda/hda_bind.c
--- linux-libre-4.19.88-gnu/sound/pci/hda/hda_bind.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/sound/pci/hda/hda_bind.c	2019-12-13 02:52:59.000000000 -0500
@@ -42,6 +42,10 @@ static void hda_codec_unsol_event(struct
 {
 	struct hda_codec *codec = container_of(dev, struct hda_codec, core);
 
+	/* ignore unsol events during shutdown */
+	if (codec->bus->shutdown)
+		return;
+
 	if (codec->patch_ops.unsol_event)
 		codec->patch_ops.unsol_event(codec, ev);
 }
diff -druNp --no-dereference linux-libre-4.19.88-gnu/sound/pci/hda/hda_intel.c linux-libre-4.19.89-gnu/sound/pci/hda/hda_intel.c
--- linux-libre-4.19.88-gnu/sound/pci/hda/hda_intel.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/sound/pci/hda/hda_intel.c	2019-12-13 02:52:59.000000000 -0500
@@ -1492,8 +1492,11 @@ static int azx_free(struct azx *chip)
 static int azx_dev_disconnect(struct snd_device *device)
 {
 	struct azx *chip = device->device_data;
+	struct hdac_bus *bus = azx_bus(chip);
 
 	chip->bus.shutdown = 1;
+	cancel_work_sync(&bus->unsol_work);
+
 	return 0;
 }
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/sound/pci/hda/patch_conexant.c linux-libre-4.19.89-gnu/sound/pci/hda/patch_conexant.c
--- linux-libre-4.19.88-gnu/sound/pci/hda/patch_conexant.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/sound/pci/hda/patch_conexant.c	2019-12-13 02:52:59.000000000 -0500
@@ -923,6 +923,7 @@ static const struct snd_pci_quirk cxt506
 	SND_PCI_QUIRK(0x103c, 0x837f, "HP ProBook 470 G5", CXT_FIXUP_MUTE_LED_GPIO),
 	SND_PCI_QUIRK(0x103c, 0x8299, "HP 800 G3 SFF", CXT_FIXUP_HP_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x103c, 0x829a, "HP 800 G3 DM", CXT_FIXUP_HP_MIC_NO_PRESENCE),
+	SND_PCI_QUIRK(0x103c, 0x8402, "HP ProBook 645 G4", CXT_FIXUP_MUTE_LED_GPIO),
 	SND_PCI_QUIRK(0x103c, 0x8455, "HP Z2 G4", CXT_FIXUP_HP_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x103c, 0x8456, "HP Z2 G4 SFF", CXT_FIXUP_HP_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x103c, 0x8457, "HP Z2 G4 mini", CXT_FIXUP_HP_MIC_NO_PRESENCE),
diff -druNp --no-dereference linux-libre-4.19.88-gnu/sound/pci/hda/patch_realtek.c linux-libre-4.19.89-gnu/sound/pci/hda/patch_realtek.c
--- linux-libre-4.19.88-gnu/sound/pci/hda/patch_realtek.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/sound/pci/hda/patch_realtek.c	2019-12-13 02:52:59.000000000 -0500
@@ -379,9 +379,7 @@ static void alc_fill_eapd_coef(struct hd
 	case 0x10ec0215:
 	case 0x10ec0233:
 	case 0x10ec0235:
-	case 0x10ec0236:
 	case 0x10ec0255:
-	case 0x10ec0256:
 	case 0x10ec0257:
 	case 0x10ec0282:
 	case 0x10ec0283:
@@ -393,6 +391,11 @@ static void alc_fill_eapd_coef(struct hd
 	case 0x10ec0300:
 		alc_update_coef_idx(codec, 0x10, 1<<9, 0);
 		break;
+	case 0x10ec0236:
+	case 0x10ec0256:
+		alc_write_coef_idx(codec, 0x36, 0x5757);
+		alc_update_coef_idx(codec, 0x10, 1<<9, 0);
+		break;
 	case 0x10ec0275:
 		alc_update_coef_idx(codec, 0xe, 0, 1<<0);
 		break;
@@ -5701,6 +5704,7 @@ enum {
 	ALC299_FIXUP_PREDATOR_SPK,
 	ALC294_FIXUP_ASUS_INTSPK_HEADSET_MIC,
 	ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE,
+	ALC294_FIXUP_ASUS_INTSPK_GPIO,
 };
 
 static const struct hda_fixup alc269_fixups[] = {
@@ -6764,6 +6768,13 @@ static const struct hda_fixup alc269_fix
 		.chained = true,
 		.chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
 	},
+	[ALC294_FIXUP_ASUS_INTSPK_GPIO] = {
+		.type = HDA_FIXUP_FUNC,
+		/* The GPIO must be pulled to initialize the AMP */
+		.v.func = alc_fixup_gpio4,
+		.chained = true,
+		.chain_id = ALC294_FIXUP_ASUS_INTSPK_HEADSET_MIC
+	},
 };
 
 static const struct snd_pci_quirk alc269_fixup_tbl[] = {
@@ -6923,7 +6934,7 @@ static const struct snd_pci_quirk alc269
 	SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
 	SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
 	SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
-	SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_INTSPK_HEADSET_MIC),
+	SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_INTSPK_GPIO),
 	SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC),
 	SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
 	SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC),
@@ -7030,6 +7041,7 @@ static const struct snd_pci_quirk alc269
 	SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
 	SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MBXP", ALC256_FIXUP_HUAWEI_MBXP_PINS),
 	SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */
+	SND_PCI_QUIRK(0x1d72, 0x1901, "RedmiBook 14", ALC256_FIXUP_ASUS_HEADSET_MIC),
 	SND_PCI_QUIRK(0x10ec, 0x118c, "Medion EE4254 MD62100", ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE),
 
 #if 0
diff -druNp --no-dereference linux-libre-4.19.88-gnu/sound/soc/codecs/max9867.c linux-libre-4.19.89-gnu/sound/soc/codecs/max9867.c
--- linux-libre-4.19.88-gnu/sound/soc/codecs/max9867.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/sound/soc/codecs/max9867.c	2019-12-13 02:52:59.000000000 -0500
@@ -248,17 +248,6 @@ static int max9867_dai_hw_params(struct
 	return 0;
 }
 
-static int max9867_prepare(struct snd_pcm_substream *substream,
-			 struct snd_soc_dai *dai)
-{
-	struct snd_soc_component *component = dai->component;
-	struct max9867_priv *max9867 = snd_soc_component_get_drvdata(component);
-
-	regmap_update_bits(max9867->regmap, MAX9867_PWRMAN,
-		MAX9867_SHTDOWN_MASK, MAX9867_SHTDOWN_MASK);
-	return 0;
-}
-
 static int max9867_mute(struct snd_soc_dai *dai, int mute)
 {
 	struct snd_soc_component *component = dai->component;
@@ -361,7 +350,6 @@ static int max9867_dai_set_fmt(struct sn
 static const struct snd_soc_dai_ops max9867_dai_ops = {
 	.set_fmt = max9867_dai_set_fmt,
 	.set_sysclk	= max9867_set_dai_sysclk,
-	.prepare	= max9867_prepare,
 	.digital_mute	= max9867_mute,
 	.hw_params = max9867_dai_hw_params,
 };
@@ -392,27 +380,59 @@ static struct snd_soc_dai_driver max9867
 	}
 };
 
-#ifdef CONFIG_PM_SLEEP
-static int max9867_suspend(struct device *dev)
+#ifdef CONFIG_PM
+static int max9867_suspend(struct snd_soc_component *component)
 {
-	struct max9867_priv *max9867 = dev_get_drvdata(dev);
+	snd_soc_component_force_bias_level(component, SND_SOC_BIAS_OFF);
 
-	/* Drop down to power saving mode when system is suspended */
-	regmap_update_bits(max9867->regmap, MAX9867_PWRMAN,
-		MAX9867_SHTDOWN_MASK, ~MAX9867_SHTDOWN_MASK);
 	return 0;
 }
 
-static int max9867_resume(struct device *dev)
+static int max9867_resume(struct snd_soc_component *component)
 {
-	struct max9867_priv *max9867 = dev_get_drvdata(dev);
+	snd_soc_component_force_bias_level(component, SND_SOC_BIAS_STANDBY);
 
-	regmap_update_bits(max9867->regmap, MAX9867_PWRMAN,
-		MAX9867_SHTDOWN_MASK, MAX9867_SHTDOWN_MASK);
 	return 0;
 }
+#else
+#define max9867_suspend	NULL
+#define max9867_resume	NULL
 #endif
 
+static int max9867_set_bias_level(struct snd_soc_component *component,
+				  enum snd_soc_bias_level level)
+{
+	int err;
+	struct max9867_priv *max9867 = snd_soc_component_get_drvdata(component);
+
+	switch (level) {
+	case SND_SOC_BIAS_STANDBY:
+		if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) {
+			err = regcache_sync(max9867->regmap);
+			if (err)
+				return err;
+
+			err = regmap_update_bits(max9867->regmap, MAX9867_PWRMAN,
+						 MAX9867_SHTDOWN, MAX9867_SHTDOWN);
+			if (err)
+				return err;
+		}
+		break;
+	case SND_SOC_BIAS_OFF:
+		err = regmap_update_bits(max9867->regmap, MAX9867_PWRMAN,
+					 MAX9867_SHTDOWN, 0);
+		if (err)
+			return err;
+
+		regcache_mark_dirty(max9867->regmap);
+		break;
+	default:
+		break;
+	}
+
+	return 0;
+}
+
 static const struct snd_soc_component_driver max9867_component = {
 	.controls		= max9867_snd_controls,
 	.num_controls		= ARRAY_SIZE(max9867_snd_controls),
@@ -420,6 +440,9 @@ static const struct snd_soc_component_dr
 	.num_dapm_routes	= ARRAY_SIZE(max9867_audio_map),
 	.dapm_widgets		= max9867_dapm_widgets,
 	.num_dapm_widgets	= ARRAY_SIZE(max9867_dapm_widgets),
+	.suspend		= max9867_suspend,
+	.resume			= max9867_resume,
+	.set_bias_level		= max9867_set_bias_level,
 	.idle_bias_on		= 1,
 	.use_pmdown_time	= 1,
 	.endianness		= 1,
@@ -518,15 +541,10 @@ static const struct of_device_id max9867
 };
 MODULE_DEVICE_TABLE(of, max9867_of_match);
 
-static const struct dev_pm_ops max9867_pm_ops = {
-	SET_SYSTEM_SLEEP_PM_OPS(max9867_suspend, max9867_resume)
-};
-
 static struct i2c_driver max9867_i2c_driver = {
 	.driver = {
 		.name = "max9867",
 		.of_match_table = of_match_ptr(max9867_of_match),
-		.pm = &max9867_pm_ops,
 	},
 	.probe  = max9867_i2c_probe,
 	.id_table = max9867_i2c_id,
diff -druNp --no-dereference linux-libre-4.19.88-gnu/sound/soc/codecs/max9867.h linux-libre-4.19.89-gnu/sound/soc/codecs/max9867.h
--- linux-libre-4.19.88-gnu/sound/soc/codecs/max9867.h	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/sound/soc/codecs/max9867.h	2019-12-13 02:52:59.000000000 -0500
@@ -67,7 +67,7 @@
 #define MAX9867_MICCONFIG    0x15
 #define MAX9867_MODECONFIG   0x16
 #define MAX9867_PWRMAN       0x17
-#define MAX9867_SHTDOWN_MASK (1<<7)
+#define MAX9867_SHTDOWN      0x80
 #define MAX9867_REVISION     0xff
 
 #define MAX9867_CACHEREGNUM 10
diff -druNp --no-dereference linux-libre-4.19.88-gnu/sound/soc/codecs/nau8540.c linux-libre-4.19.89-gnu/sound/soc/codecs/nau8540.c
--- linux-libre-4.19.88-gnu/sound/soc/codecs/nau8540.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/sound/soc/codecs/nau8540.c	2019-12-13 02:52:59.000000000 -0500
@@ -585,7 +585,7 @@ static int nau8540_calc_fll_param(unsign
 	fvco_max = 0;
 	fvco_sel = ARRAY_SIZE(mclk_src_scaling);
 	for (i = 0; i < ARRAY_SIZE(mclk_src_scaling); i++) {
-		fvco = 256 * fs * 2 * mclk_src_scaling[i].param;
+		fvco = 256ULL * fs * 2 * mclk_src_scaling[i].param;
 		if (fvco > NAU_FVCO_MIN && fvco < NAU_FVCO_MAX &&
 			fvco_max < fvco) {
 			fvco_max = fvco;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/sound/soc/sh/rcar/core.c linux-libre-4.19.89-gnu/sound/soc/sh/rcar/core.c
--- linux-libre-4.19.88-gnu/sound/soc/sh/rcar/core.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/sound/soc/sh/rcar/core.c	2019-12-13 02:52:59.000000000 -0500
@@ -1344,6 +1344,18 @@ int rsnd_kctrl_new(struct rsnd_mod *mod,
 	};
 	int ret;
 
+	/*
+	 * 1) Avoid duplicate register for DVC with MIX case
+	 * 2) Allow duplicate register for MIX
+	 * 3) re-register if card was rebinded
+	 */
+	list_for_each_entry(kctrl, &card->controls, list) {
+		struct rsnd_kctrl_cfg *c = kctrl->private_data;
+
+		if (c == cfg)
+			return 0;
+	}
+
 	if (size > RSND_MAX_CHANNELS)
 		return -EINVAL;
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/sound/soc/sh/rcar/dvc.c linux-libre-4.19.89-gnu/sound/soc/sh/rcar/dvc.c
--- linux-libre-4.19.88-gnu/sound/soc/sh/rcar/dvc.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/sound/soc/sh/rcar/dvc.c	2019-12-13 02:52:59.000000000 -0500
@@ -40,11 +40,8 @@ struct rsnd_dvc {
 	struct rsnd_kctrl_cfg_s ren;	/* Ramp Enable */
 	struct rsnd_kctrl_cfg_s rup;	/* Ramp Rate Up */
 	struct rsnd_kctrl_cfg_s rdown;	/* Ramp Rate Down */
-	u32 flags;
 };
 
-#define KCTRL_INITIALIZED	(1 << 0)
-
 #define rsnd_dvc_get(priv, id) ((struct rsnd_dvc *)(priv->dvc) + id)
 #define rsnd_dvc_nr(priv) ((priv)->dvc_nr)
 
@@ -227,9 +224,6 @@ static int rsnd_dvc_pcm_new(struct rsnd_
 	int channels = rsnd_rdai_channels_get(rdai);
 	int ret;
 
-	if (rsnd_flags_has(dvc, KCTRL_INITIALIZED))
-		return 0;
-
 	/* Volume */
 	ret = rsnd_kctrl_new_m(mod, io, rtd,
 			is_play ?
@@ -285,8 +279,6 @@ static int rsnd_dvc_pcm_new(struct rsnd_
 	if (ret < 0)
 		return ret;
 
-	rsnd_flags_set(dvc, KCTRL_INITIALIZED);
-
 	return 0;
 }
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/tools/bpf/bpftool/btf_dumper.c linux-libre-4.19.89-gnu/tools/bpf/bpftool/btf_dumper.c
--- linux-libre-4.19.88-gnu/tools/bpf/bpftool/btf_dumper.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/tools/bpf/bpftool/btf_dumper.c	2019-12-13 02:52:59.000000000 -0500
@@ -32,7 +32,7 @@ static void btf_dumper_ptr(const void *d
 }
 
 static int btf_dumper_modifier(const struct btf_dumper *d, __u32 type_id,
-			       const void *data)
+			       __u8 bit_offset, const void *data)
 {
 	int actual_type_id;
 
@@ -40,7 +40,7 @@ static int btf_dumper_modifier(const str
 	if (actual_type_id < 0)
 		return actual_type_id;
 
-	return btf_dumper_do_type(d, actual_type_id, 0, data);
+	return btf_dumper_do_type(d, actual_type_id, bit_offset, data);
 }
 
 static void btf_dumper_enum(const void *data, json_writer_t *jw)
@@ -237,7 +237,7 @@ static int btf_dumper_do_type(const stru
 	case BTF_KIND_VOLATILE:
 	case BTF_KIND_CONST:
 	case BTF_KIND_RESTRICT:
-		return btf_dumper_modifier(d, type_id, data);
+		return btf_dumper_modifier(d, type_id, bit_offset, data);
 	default:
 		jsonw_printf(d->jw, "(unsupported-kind");
 		return -EINVAL;
diff -druNp --no-dereference linux-libre-4.19.88-gnu/tools/lib/bpf/libbpf.c linux-libre-4.19.89-gnu/tools/lib/bpf/libbpf.c
--- linux-libre-4.19.88-gnu/tools/lib/bpf/libbpf.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/tools/lib/bpf/libbpf.c	2019-12-13 02:52:59.000000000 -0500
@@ -22,7 +22,9 @@
  * License along with this program; if not,  see <http://www.gnu.org/licenses>
  */
 
+#ifndef _GNU_SOURCE
 #define _GNU_SOURCE
+#endif
 #include <stdlib.h>
 #include <stdio.h>
 #include <stdarg.h>
diff -druNp --no-dereference linux-libre-4.19.88-gnu/tools/lib/bpf/libbpf_errno.c linux-libre-4.19.89-gnu/tools/lib/bpf/libbpf_errno.c
--- linux-libre-4.19.88-gnu/tools/lib/bpf/libbpf_errno.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/tools/lib/bpf/libbpf_errno.c	2019-12-13 02:52:59.000000000 -0500
@@ -20,6 +20,7 @@
  * License along with this program; if not,  see <http://www.gnu.org/licenses>
  */
 
+#undef _GNU_SOURCE
 #include <stdio.h>
 #include <string.h>
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/tools/perf/builtin-script.c linux-libre-4.19.89-gnu/tools/perf/builtin-script.c
--- linux-libre-4.19.88-gnu/tools/perf/builtin-script.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/tools/perf/builtin-script.c	2019-12-13 02:52:59.000000000 -0500
@@ -1037,7 +1037,7 @@ static int perf_sample__fprintf_brstacki
 				insn++;
 			}
 		}
-		if (off != (unsigned)len)
+		if (off != end - start)
 			printed += fprintf(fp, "\tmismatch of LBR data and executable\n");
 	}
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/tools/testing/selftests/kvm/lib/assert.c linux-libre-4.19.89-gnu/tools/testing/selftests/kvm/lib/assert.c
--- linux-libre-4.19.88-gnu/tools/testing/selftests/kvm/lib/assert.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/tools/testing/selftests/kvm/lib/assert.c	2019-12-13 02:52:59.000000000 -0500
@@ -56,7 +56,7 @@ static void test_dump_stack(void)
 #pragma GCC diagnostic pop
 }
 
-static pid_t gettid(void)
+static pid_t _gettid(void)
 {
 	return syscall(SYS_gettid);
 }
@@ -73,7 +73,7 @@ test_assert(bool exp, const char *exp_st
 		fprintf(stderr, "==== Test Assertion Failure ====\n"
 			"  %s:%u: %s\n"
 			"  pid=%d tid=%d - %s\n",
-			file, line, exp_str, getpid(), gettid(),
+			file, line, exp_str, getpid(), _gettid(),
 			strerror(errno));
 		test_dump_stack();
 		if (fmt) {
diff -druNp --no-dereference linux-libre-4.19.88-gnu/tools/testing/selftests/powerpc/ptrace/core-pkey.c linux-libre-4.19.89-gnu/tools/testing/selftests/powerpc/ptrace/core-pkey.c
--- linux-libre-4.19.88-gnu/tools/testing/selftests/powerpc/ptrace/core-pkey.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/tools/testing/selftests/powerpc/ptrace/core-pkey.c	2019-12-13 02:52:59.000000000 -0500
@@ -352,10 +352,7 @@ static int write_core_pattern(const char
 	FILE *f;
 
 	f = fopen(core_pattern_file, "w");
-	if (!f) {
-		perror("Error writing to core_pattern file");
-		return TEST_FAIL;
-	}
+	SKIP_IF_MSG(!f, "Try with root privileges");
 
 	ret = fwrite(core_pattern, 1, len, f);
 	fclose(f);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/tools/testing/selftests/powerpc/ptrace/ptrace-gpr.c linux-libre-4.19.89-gnu/tools/testing/selftests/powerpc/ptrace/ptrace-gpr.c
--- linux-libre-4.19.88-gnu/tools/testing/selftests/powerpc/ptrace/ptrace-gpr.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/tools/testing/selftests/powerpc/ptrace/ptrace-gpr.c	2019-12-13 02:52:59.000000000 -0500
@@ -31,7 +31,7 @@ void gpr(void)
 		ASM_LOAD_GPR_IMMED(gpr_1)
 		ASM_LOAD_FPR_SINGLE_PRECISION(flt_1)
 		:
-		: [gpr_1]"i"(GPR_1), [flt_1] "r" (&a)
+		: [gpr_1]"i"(GPR_1), [flt_1] "b" (&a)
 		: "memory", "r6", "r7", "r8", "r9", "r10",
 		"r11", "r12", "r13", "r14", "r15", "r16", "r17",
 		"r18", "r19", "r20", "r21", "r22", "r23", "r24",
diff -druNp --no-dereference linux-libre-4.19.88-gnu/tools/testing/selftests/powerpc/ptrace/ptrace-tm-gpr.c linux-libre-4.19.89-gnu/tools/testing/selftests/powerpc/ptrace/ptrace-tm-gpr.c
--- linux-libre-4.19.88-gnu/tools/testing/selftests/powerpc/ptrace/ptrace-tm-gpr.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/tools/testing/selftests/powerpc/ptrace/ptrace-tm-gpr.c	2019-12-13 02:52:59.000000000 -0500
@@ -59,8 +59,8 @@ trans:
 		"3: ;"
 		: [res] "=r" (result), [texasr] "=r" (texasr)
 		: [gpr_1]"i"(GPR_1), [gpr_2]"i"(GPR_2),
-		[sprn_texasr] "i" (SPRN_TEXASR), [flt_1] "r" (&a),
-		[flt_2] "r" (&b), [cptr1] "r" (&cptr[1])
+		[sprn_texasr] "i" (SPRN_TEXASR), [flt_1] "b" (&a),
+		[flt_2] "b" (&b), [cptr1] "b" (&cptr[1])
 		: "memory", "r7", "r8", "r9", "r10",
 		"r11", "r12", "r13", "r14", "r15", "r16",
 		"r17", "r18", "r19", "r20", "r21", "r22",
diff -druNp --no-dereference linux-libre-4.19.88-gnu/tools/testing/selftests/powerpc/ptrace/ptrace-tm-spd-tar.c linux-libre-4.19.89-gnu/tools/testing/selftests/powerpc/ptrace/ptrace-tm-spd-tar.c
--- linux-libre-4.19.88-gnu/tools/testing/selftests/powerpc/ptrace/ptrace-tm-spd-tar.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/tools/testing/selftests/powerpc/ptrace/ptrace-tm-spd-tar.c	2019-12-13 02:52:59.000000000 -0500
@@ -72,7 +72,7 @@ trans:
 		"3: ;"
 
 		: [res] "=r" (result), [texasr] "=r" (texasr)
-		: [val] "r" (cptr[1]), [sprn_dscr]"i"(SPRN_DSCR),
+		: [sprn_dscr]"i"(SPRN_DSCR),
 		[sprn_tar]"i"(SPRN_TAR), [sprn_ppr]"i"(SPRN_PPR),
 		[sprn_texasr]"i"(SPRN_TEXASR), [tar_1]"i"(TAR_1),
 		[dscr_1]"i"(DSCR_1), [tar_2]"i"(TAR_2), [dscr_2]"i"(DSCR_2),
diff -druNp --no-dereference linux-libre-4.19.88-gnu/tools/testing/selftests/powerpc/ptrace/ptrace-tm-spd-vsx.c linux-libre-4.19.89-gnu/tools/testing/selftests/powerpc/ptrace/ptrace-tm-spd-vsx.c
--- linux-libre-4.19.88-gnu/tools/testing/selftests/powerpc/ptrace/ptrace-tm-spd-vsx.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/tools/testing/selftests/powerpc/ptrace/ptrace-tm-spd-vsx.c	2019-12-13 02:52:59.000000000 -0500
@@ -77,8 +77,7 @@ trans:
 
 		"3: ;"
 		: [res] "=r" (result), [texasr] "=r" (texasr)
-		: [fp_load] "r" (fp_load), [fp_load_ckpt] "r" (fp_load_ckpt),
-		[sprn_texasr] "i"  (SPRN_TEXASR)
+		: [sprn_texasr] "i"  (SPRN_TEXASR)
 		: "memory", "r0", "r1", "r3", "r4",
 		"r7", "r8", "r9", "r10", "r11"
 		);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/tools/testing/selftests/powerpc/ptrace/ptrace-tm-spr.c linux-libre-4.19.89-gnu/tools/testing/selftests/powerpc/ptrace/ptrace-tm-spr.c
--- linux-libre-4.19.88-gnu/tools/testing/selftests/powerpc/ptrace/ptrace-tm-spr.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/tools/testing/selftests/powerpc/ptrace/ptrace-tm-spr.c	2019-12-13 02:52:59.000000000 -0500
@@ -74,7 +74,7 @@ trans:
 
 		"3: ;"
 		: [tfhar] "=r" (tfhar), [res] "=r" (result),
-		[texasr] "=r" (texasr), [cptr1] "=r" (cptr1)
+		[texasr] "=r" (texasr), [cptr1] "=b" (cptr1)
 		: [sprn_texasr] "i"  (SPRN_TEXASR)
 		: "memory", "r0", "r8", "r31"
 		);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/tools/testing/selftests/powerpc/ptrace/ptrace-tm-tar.c linux-libre-4.19.89-gnu/tools/testing/selftests/powerpc/ptrace/ptrace-tm-tar.c
--- linux-libre-4.19.88-gnu/tools/testing/selftests/powerpc/ptrace/ptrace-tm-tar.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/tools/testing/selftests/powerpc/ptrace/ptrace-tm-tar.c	2019-12-13 02:52:59.000000000 -0500
@@ -65,7 +65,7 @@ trans:
 		: [sprn_dscr]"i"(SPRN_DSCR), [sprn_tar]"i"(SPRN_TAR),
 		[sprn_ppr]"i"(SPRN_PPR), [sprn_texasr]"i"(SPRN_TEXASR),
 		[tar_1]"i"(TAR_1), [dscr_1]"i"(DSCR_1), [tar_2]"i"(TAR_2),
-		[dscr_2]"i"(DSCR_2), [cptr1] "r" (&cptr[1])
+		[dscr_2]"i"(DSCR_2), [cptr1] "b" (&cptr[1])
 		: "memory", "r0", "r1", "r3", "r4", "r5", "r6"
 		);
 
diff -druNp --no-dereference linux-libre-4.19.88-gnu/tools/testing/selftests/powerpc/ptrace/ptrace-tm-vsx.c linux-libre-4.19.89-gnu/tools/testing/selftests/powerpc/ptrace/ptrace-tm-vsx.c
--- linux-libre-4.19.88-gnu/tools/testing/selftests/powerpc/ptrace/ptrace-tm-vsx.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/tools/testing/selftests/powerpc/ptrace/ptrace-tm-vsx.c	2019-12-13 02:52:59.000000000 -0500
@@ -65,8 +65,7 @@ trans:
 
 		"3: ;"
 		: [res] "=r" (result), [texasr] "=r" (texasr)
-		: [fp_load] "r" (fp_load), [fp_load_ckpt] "r" (fp_load_ckpt),
-		[sprn_texasr] "i"  (SPRN_TEXASR), [cptr1] "r" (&cptr[1])
+		: [sprn_texasr] "i"  (SPRN_TEXASR), [cptr1] "b" (&cptr[1])
 		: "memory", "r0", "r1", "r3", "r4",
 		"r7", "r8", "r9", "r10", "r11"
 		);
diff -druNp --no-dereference linux-libre-4.19.88-gnu/virt/kvm/arm/vgic/vgic-v3.c linux-libre-4.19.89-gnu/virt/kvm/arm/vgic/vgic-v3.c
--- linux-libre-4.19.88-gnu/virt/kvm/arm/vgic/vgic-v3.c	2019-12-05 03:21:36.000000000 -0500
+++ linux-libre-4.19.89-gnu/virt/kvm/arm/vgic/vgic-v3.c	2019-12-13 02:52:59.000000000 -0500
@@ -375,8 +375,8 @@ retry:
 int vgic_v3_save_pending_tables(struct kvm *kvm)
 {
 	struct vgic_dist *dist = &kvm->arch.vgic;
-	int last_byte_offset = -1;
 	struct vgic_irq *irq;
+	gpa_t last_ptr = ~(gpa_t)0;
 	int ret;
 	u8 val;
 
@@ -396,11 +396,11 @@ int vgic_v3_save_pending_tables(struct k
 		bit_nr = irq->intid % BITS_PER_BYTE;
 		ptr = pendbase + byte_offset;
 
-		if (byte_offset != last_byte_offset) {
+		if (ptr != last_ptr) {
 			ret = kvm_read_guest_lock(kvm, ptr, &val, 1);
 			if (ret)
 				return ret;
-			last_byte_offset = byte_offset;
+			last_ptr = ptr;
 		}
 
 		stored = val & (1U << bit_nr);
