diff -druNp --no-dereference linux-libre-4.1.23-gnu/arch/powerpc/include/uapi/asm/cputable.h linux-libre-4.1.24-gnu/arch/powerpc/include/uapi/asm/cputable.h
--- linux-libre-4.1.23-gnu/arch/powerpc/include/uapi/asm/cputable.h	2016-04-25 11:57:36.000000000 -0400
+++ linux-libre-4.1.24-gnu/arch/powerpc/include/uapi/asm/cputable.h	2016-05-11 00:10:35.000000000 -0400
@@ -31,6 +31,7 @@
 #define PPC_FEATURE_PSERIES_PERFMON_COMPAT \
 					0x00000040
 
+/* Reserved - do not use		0x00000004 */
 #define PPC_FEATURE_TRUE_LE		0x00000002
 #define PPC_FEATURE_PPC_LE		0x00000001
 
diff -druNp --no-dereference linux-libre-4.1.23-gnu/arch/powerpc/kernel/prom.c linux-libre-4.1.24-gnu/arch/powerpc/kernel/prom.c
--- linux-libre-4.1.23-gnu/arch/powerpc/kernel/prom.c	2016-04-25 11:57:36.000000000 -0400
+++ linux-libre-4.1.24-gnu/arch/powerpc/kernel/prom.c	2016-05-11 00:10:35.000000000 -0400
@@ -149,23 +149,24 @@ static struct ibm_pa_feature {
 	unsigned long	cpu_features;	/* CPU_FTR_xxx bit */
 	unsigned long	mmu_features;	/* MMU_FTR_xxx bit */
 	unsigned int	cpu_user_ftrs;	/* PPC_FEATURE_xxx bit */
+	unsigned int	cpu_user_ftrs2;	/* PPC_FEATURE2_xxx bit */
 	unsigned char	pabyte;		/* byte number in ibm,pa-features */
 	unsigned char	pabit;		/* bit number (big-endian) */
 	unsigned char	invert;		/* if 1, pa bit set => clear feature */
 } ibm_pa_features[] __initdata = {
-	{0, 0, PPC_FEATURE_HAS_MMU,	0, 0, 0},
-	{0, 0, PPC_FEATURE_HAS_FPU,	0, 1, 0},
-	{CPU_FTR_CTRL, 0, 0,		0, 3, 0},
-	{CPU_FTR_NOEXECUTE, 0, 0,	0, 6, 0},
-	{CPU_FTR_NODSISRALIGN, 0, 0,	1, 1, 1},
-	{0, MMU_FTR_CI_LARGE_PAGE, 0,	1, 2, 0},
-	{CPU_FTR_REAL_LE, PPC_FEATURE_TRUE_LE, 5, 0, 0},
+	{0, 0, PPC_FEATURE_HAS_MMU, 0,		0, 0, 0},
+	{0, 0, PPC_FEATURE_HAS_FPU, 0,		0, 1, 0},
+	{CPU_FTR_CTRL, 0, 0, 0,			0, 3, 0},
+	{CPU_FTR_NOEXECUTE, 0, 0, 0,		0, 6, 0},
+	{CPU_FTR_NODSISRALIGN, 0, 0, 0,		1, 1, 1},
+	{0, MMU_FTR_CI_LARGE_PAGE, 0, 0,		1, 2, 0},
+	{CPU_FTR_REAL_LE, 0, PPC_FEATURE_TRUE_LE, 0, 5, 0, 0},
 	/*
 	 * If the kernel doesn't support TM (ie. CONFIG_PPC_TRANSACTIONAL_MEM=n),
 	 * we don't want to turn on CPU_FTR_TM here, so we use CPU_FTR_TM_COMP
 	 * which is 0 if the kernel doesn't support TM.
 	 */
-	{CPU_FTR_TM_COMP, 0, 0,		22, 0, 0},
+	{CPU_FTR_TM_COMP, 0, 0, 0,		22, 0, 0},
 };
 
 static void __init scan_features(unsigned long node, const unsigned char *ftrs,
@@ -196,10 +197,12 @@ static void __init scan_features(unsigne
 		if (bit ^ fp->invert) {
 			cur_cpu_spec->cpu_features |= fp->cpu_features;
 			cur_cpu_spec->cpu_user_features |= fp->cpu_user_ftrs;
+			cur_cpu_spec->cpu_user_features2 |= fp->cpu_user_ftrs2;
 			cur_cpu_spec->mmu_features |= fp->mmu_features;
 		} else {
 			cur_cpu_spec->cpu_features &= ~fp->cpu_features;
 			cur_cpu_spec->cpu_user_features &= ~fp->cpu_user_ftrs;
+			cur_cpu_spec->cpu_user_features2 &= ~fp->cpu_user_ftrs2;
 			cur_cpu_spec->mmu_features &= ~fp->mmu_features;
 		}
 	}
diff -druNp --no-dereference linux-libre-4.1.23-gnu/arch/s390/include/asm/hugetlb.h linux-libre-4.1.24-gnu/arch/s390/include/asm/hugetlb.h
--- linux-libre-4.1.23-gnu/arch/s390/include/asm/hugetlb.h	2016-04-25 11:57:36.000000000 -0400
+++ linux-libre-4.1.24-gnu/arch/s390/include/asm/hugetlb.h	2016-05-11 00:10:35.000000000 -0400
@@ -14,6 +14,7 @@
 
 #define is_hugepage_only_range(mm, addr, len)	0
 #define hugetlb_free_pgd_range			free_pgd_range
+#define hugepages_supported()			(MACHINE_HAS_HPAGE)
 
 void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
 		     pte_t *ptep, pte_t pte);
diff -druNp --no-dereference linux-libre-4.1.23-gnu/arch/s390/include/asm/pci.h linux-libre-4.1.24-gnu/arch/s390/include/asm/pci.h
--- linux-libre-4.1.23-gnu/arch/s390/include/asm/pci.h	2016-04-25 11:57:36.000000000 -0400
+++ linux-libre-4.1.24-gnu/arch/s390/include/asm/pci.h	2016-05-11 00:10:35.000000000 -0400
@@ -45,7 +45,8 @@ struct zpci_fmb {
 	u64 rpcit_ops;
 	u64 dma_rbytes;
 	u64 dma_wbytes;
-} __packed __aligned(64);
+	u64 pad[2];
+} __packed __aligned(128);
 
 enum zpci_state {
 	ZPCI_FN_STATE_RESERVED,
diff -druNp --no-dereference linux-libre-4.1.23-gnu/arch/x86/crypto/sha-mb/sha1_mb.c linux-libre-4.1.24-gnu/arch/x86/crypto/sha-mb/sha1_mb.c
--- linux-libre-4.1.23-gnu/arch/x86/crypto/sha-mb/sha1_mb.c	2016-04-25 11:57:36.000000000 -0400
+++ linux-libre-4.1.24-gnu/arch/x86/crypto/sha-mb/sha1_mb.c	2016-05-11 00:10:35.000000000 -0400
@@ -456,10 +456,10 @@ static int sha_complete_job(struct mcryp
 
 			req = cast_mcryptd_ctx_to_req(req_ctx);
 			if (irqs_disabled())
-				rctx->complete(&req->base, ret);
+				req_ctx->complete(&req->base, ret);
 			else {
 				local_bh_disable();
-				rctx->complete(&req->base, ret);
+				req_ctx->complete(&req->base, ret);
 				local_bh_enable();
 			}
 		}
diff -druNp --no-dereference linux-libre-4.1.23-gnu/arch/x86/include/asm/hugetlb.h linux-libre-4.1.24-gnu/arch/x86/include/asm/hugetlb.h
--- linux-libre-4.1.23-gnu/arch/x86/include/asm/hugetlb.h	2016-04-25 11:57:36.000000000 -0400
+++ linux-libre-4.1.24-gnu/arch/x86/include/asm/hugetlb.h	2016-05-11 00:10:35.000000000 -0400
@@ -4,6 +4,7 @@
 #include <asm/page.h>
 #include <asm-generic/hugetlb.h>
 
+#define hugepages_supported() cpu_has_pse
 
 static inline int is_hugepage_only_range(struct mm_struct *mm,
 					 unsigned long addr,
diff -druNp --no-dereference linux-libre-4.1.23-gnu/drivers/crypto/ccp/ccp-crypto-aes-cmac.c linux-libre-4.1.24-gnu/drivers/crypto/ccp/ccp-crypto-aes-cmac.c
--- linux-libre-4.1.23-gnu/drivers/crypto/ccp/ccp-crypto-aes-cmac.c	2016-04-25 11:57:36.000000000 -0400
+++ linux-libre-4.1.24-gnu/drivers/crypto/ccp/ccp-crypto-aes-cmac.c	2016-05-11 00:10:35.000000000 -0400
@@ -207,6 +207,9 @@ static int ccp_aes_cmac_export(struct ah
 	struct ccp_aes_cmac_req_ctx *rctx = ahash_request_ctx(req);
 	struct ccp_aes_cmac_exp_ctx state;
 
+	/* Don't let anything leak to 'out' */
+	memset(&state, 0, sizeof(state));
+
 	state.null_msg = rctx->null_msg;
 	memcpy(state.iv, rctx->iv, sizeof(state.iv));
 	state.buf_count = rctx->buf_count;
diff -druNp --no-dereference linux-libre-4.1.23-gnu/drivers/crypto/ccp/ccp-crypto-sha.c linux-libre-4.1.24-gnu/drivers/crypto/ccp/ccp-crypto-sha.c
--- linux-libre-4.1.23-gnu/drivers/crypto/ccp/ccp-crypto-sha.c	2016-04-25 11:57:36.000000000 -0400
+++ linux-libre-4.1.24-gnu/drivers/crypto/ccp/ccp-crypto-sha.c	2016-05-11 00:10:35.000000000 -0400
@@ -199,6 +199,9 @@ static int ccp_sha_export(struct ahash_r
 	struct ccp_sha_req_ctx *rctx = ahash_request_ctx(req);
 	struct ccp_sha_exp_ctx state;
 
+	/* Don't let anything leak to 'out' */
+	memset(&state, 0, sizeof(state));
+
 	state.type = rctx->type;
 	state.msg_bits = rctx->msg_bits;
 	state.first = rctx->first;
diff -druNp --no-dereference linux-libre-4.1.23-gnu/drivers/edac/sb_edac.c linux-libre-4.1.24-gnu/drivers/edac/sb_edac.c
--- linux-libre-4.1.23-gnu/drivers/edac/sb_edac.c	2016-04-25 11:57:36.000000000 -0400
+++ linux-libre-4.1.24-gnu/drivers/edac/sb_edac.c	2016-05-11 00:10:35.000000000 -0400
@@ -1316,7 +1316,7 @@ static int get_memory_error_data(struct
 	}
 
 	ch_way = TAD_CH(reg) + 1;
-	sck_way = 1 << TAD_SOCK(reg);
+	sck_way = TAD_SOCK(reg);
 
 	if (ch_way == 3)
 		idx = addr >> 6;
@@ -1355,7 +1355,7 @@ static int get_memory_error_data(struct
 		switch(ch_way) {
 		case 2:
 		case 4:
-			sck_xch = 1 << sck_way * (ch_way >> 1);
+			sck_xch = (1 << sck_way) * (ch_way >> 1);
 			break;
 		default:
 			sprintf(msg, "Invalid mirror set. Can't decode addr");
@@ -1391,7 +1391,7 @@ static int get_memory_error_data(struct
 
 	ch_addr = addr - offset;
 	ch_addr >>= (6 + shiftup);
-	ch_addr /= ch_way * sck_way;
+	ch_addr /= sck_xch;
 	ch_addr <<= (6 + shiftup);
 	ch_addr |= addr & ((1 << (6 + shiftup)) - 1);
 
diff -druNp --no-dereference linux-libre-4.1.23-gnu/drivers/gpu/drm/drm_dp_mst_topology.c linux-libre-4.1.24-gnu/drivers/gpu/drm/drm_dp_mst_topology.c
--- linux-libre-4.1.23-gnu/drivers/gpu/drm/drm_dp_mst_topology.c	2016-04-25 11:57:36.000000000 -0400
+++ linux-libre-4.1.24-gnu/drivers/gpu/drm/drm_dp_mst_topology.c	2016-05-11 00:10:35.000000000 -0400
@@ -1663,13 +1663,19 @@ static int drm_dp_payload_send_msg(struc
 	struct drm_dp_mst_branch *mstb;
 	int len, ret, port_num;
 
+	port = drm_dp_get_validated_port_ref(mgr, port);
+	if (!port)
+		return -EINVAL;
+
 	port_num = port->port_num;
 	mstb = drm_dp_get_validated_mstb_ref(mgr, port->parent);
 	if (!mstb) {
 		mstb = drm_dp_get_last_connected_port_and_mstb(mgr, port->parent, &port_num);
 
-		if (!mstb)
+		if (!mstb) {
+			drm_dp_put_port(port);
 			return -EINVAL;
+		}
 	}
 
 	txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL);
@@ -1695,6 +1701,7 @@ static int drm_dp_payload_send_msg(struc
 	kfree(txmsg);
 fail_put:
 	drm_dp_put_mst_branch_device(mstb);
+	drm_dp_put_port(port);
 	return ret;
 }
 
diff -druNp --no-dereference linux-libre-4.1.23-gnu/drivers/gpu/drm/i915/intel_uncore.c linux-libre-4.1.24-gnu/drivers/gpu/drm/i915/intel_uncore.c
--- linux-libre-4.1.23-gnu/drivers/gpu/drm/i915/intel_uncore.c	2016-04-25 11:57:36.000000000 -0400
+++ linux-libre-4.1.24-gnu/drivers/gpu/drm/i915/intel_uncore.c	2016-05-11 00:10:35.000000000 -0400
@@ -1074,7 +1074,11 @@ static void intel_uncore_fw_domains_init
 	} else if (IS_HASWELL(dev) || IS_BROADWELL(dev)) {
 		dev_priv->uncore.funcs.force_wake_get =
 			fw_domains_get_with_thread_status;
-		dev_priv->uncore.funcs.force_wake_put = fw_domains_put;
+		if (IS_HASWELL(dev))
+			dev_priv->uncore.funcs.force_wake_put =
+				fw_domains_put_with_fifo;
+		else
+			dev_priv->uncore.funcs.force_wake_put = fw_domains_put;
 		fw_domain_init(dev_priv, FW_DOMAIN_ID_RENDER,
 			       FORCEWAKE_MT, FORCEWAKE_ACK_HSW);
 	} else if (IS_IVYBRIDGE(dev)) {
diff -druNp --no-dereference linux-libre-4.1.23-gnu/drivers/gpu/drm/radeon/radeon_atpx_handler.c linux-libre-4.1.24-gnu/drivers/gpu/drm/radeon/radeon_atpx_handler.c
--- linux-libre-4.1.23-gnu/drivers/gpu/drm/radeon/radeon_atpx_handler.c	2016-04-25 11:57:36.000000000 -0400
+++ linux-libre-4.1.24-gnu/drivers/gpu/drm/radeon/radeon_atpx_handler.c	2016-05-11 00:10:35.000000000 -0400
@@ -62,10 +62,6 @@ bool radeon_has_atpx(void) {
 	return radeon_atpx_priv.atpx_detected;
 }
 
-bool radeon_has_atpx_dgpu_power_cntl(void) {
-	return radeon_atpx_priv.atpx.functions.power_cntl;
-}
-
 /**
  * radeon_atpx_call - call an ATPX method
  *
@@ -145,6 +141,10 @@ static void radeon_atpx_parse_functions(
  */
 static int radeon_atpx_validate(struct radeon_atpx *atpx)
 {
+	/* make sure required functions are enabled */
+	/* dGPU power control is required */
+	atpx->functions.power_cntl = true;
+
 	if (atpx->functions.px_params) {
 		union acpi_object *info;
 		struct atpx_px_params output;
diff -druNp --no-dereference linux-libre-4.1.23-gnu/drivers/gpu/drm/radeon/radeon_connectors.c linux-libre-4.1.24-gnu/drivers/gpu/drm/radeon/radeon_connectors.c
--- linux-libre-4.1.23-gnu/drivers/gpu/drm/radeon/radeon_connectors.c	2016-04-25 11:57:36.000000000 -0400
+++ linux-libre-4.1.24-gnu/drivers/gpu/drm/radeon/radeon_connectors.c	2016-05-11 00:10:35.000000000 -0400
@@ -1977,10 +1977,12 @@ radeon_add_atom_connector(struct drm_dev
 						   rdev->mode_info.dither_property,
 						   RADEON_FMT_DITHER_DISABLE);
 
-			if (radeon_audio != 0)
+			if (radeon_audio != 0) {
 				drm_object_attach_property(&radeon_connector->base.base,
 							   rdev->mode_info.audio_property,
 							   RADEON_AUDIO_AUTO);
+				radeon_connector->audio = RADEON_AUDIO_AUTO;
+			}
 			if (ASIC_IS_DCE5(rdev))
 				drm_object_attach_property(&radeon_connector->base.base,
 							   rdev->mode_info.output_csc_property,
@@ -2105,6 +2107,7 @@ radeon_add_atom_connector(struct drm_dev
 				drm_object_attach_property(&radeon_connector->base.base,
 							   rdev->mode_info.audio_property,
 							   RADEON_AUDIO_AUTO);
+				radeon_connector->audio = RADEON_AUDIO_AUTO;
 			}
 			if (connector_type == DRM_MODE_CONNECTOR_DVII) {
 				radeon_connector->dac_load_detect = true;
@@ -2160,6 +2163,7 @@ radeon_add_atom_connector(struct drm_dev
 				drm_object_attach_property(&radeon_connector->base.base,
 							   rdev->mode_info.audio_property,
 							   RADEON_AUDIO_AUTO);
+				radeon_connector->audio = RADEON_AUDIO_AUTO;
 			}
 			if (ASIC_IS_DCE5(rdev))
 				drm_object_attach_property(&radeon_connector->base.base,
@@ -2212,6 +2216,7 @@ radeon_add_atom_connector(struct drm_dev
 				drm_object_attach_property(&radeon_connector->base.base,
 							   rdev->mode_info.audio_property,
 							   RADEON_AUDIO_AUTO);
+				radeon_connector->audio = RADEON_AUDIO_AUTO;
 			}
 			if (ASIC_IS_DCE5(rdev))
 				drm_object_attach_property(&radeon_connector->base.base,
diff -druNp --no-dereference linux-libre-4.1.23-gnu/drivers/gpu/drm/radeon/radeon_device.c linux-libre-4.1.24-gnu/drivers/gpu/drm/radeon/radeon_device.c
--- linux-libre-4.1.23-gnu/drivers/gpu/drm/radeon/radeon_device.c	2016-04-25 11:57:36.000000000 -0400
+++ linux-libre-4.1.24-gnu/drivers/gpu/drm/radeon/radeon_device.c	2016-05-11 00:10:35.000000000 -0400
@@ -103,12 +103,6 @@ static const char radeon_family_name[][1
 	"LAST",
 };
 
-#if defined(CONFIG_VGA_SWITCHEROO)
-bool radeon_has_atpx_dgpu_power_cntl(void);
-#else
-static inline bool radeon_has_atpx_dgpu_power_cntl(void) { return false; }
-#endif
-
 #define RADEON_PX_QUIRK_DISABLE_PX  (1 << 0)
 #define RADEON_PX_QUIRK_LONG_WAKEUP (1 << 1)
 
@@ -1433,7 +1427,7 @@ int radeon_device_init(struct radeon_dev
 	 * ignore it */
 	vga_client_register(rdev->pdev, rdev, NULL, radeon_vga_set_decode);
 
-	if ((rdev->flags & RADEON_IS_PX) && radeon_has_atpx_dgpu_power_cntl())
+	if (rdev->flags & RADEON_IS_PX)
 		runtime = true;
 	vga_switcheroo_register_client(rdev->pdev, &radeon_switcheroo_ops, runtime);
 	if (runtime)
diff -druNp --no-dereference linux-libre-4.1.23-gnu/drivers/gpu/drm/radeon/radeon_ttm.c linux-libre-4.1.24-gnu/drivers/gpu/drm/radeon/radeon_ttm.c
--- linux-libre-4.1.23-gnu/drivers/gpu/drm/radeon/radeon_ttm.c	2016-04-25 11:57:36.000000000 -0400
+++ linux-libre-4.1.24-gnu/drivers/gpu/drm/radeon/radeon_ttm.c	2016-05-11 00:10:35.000000000 -0400
@@ -235,6 +235,8 @@ static int radeon_verify_access(struct t
 {
 	struct radeon_bo *rbo = container_of(bo, struct radeon_bo, tbo);
 
+	if (radeon_ttm_tt_has_userptr(bo->ttm))
+		return -EPERM;
 	return drm_vma_node_verify_access(&rbo->gem_base.vma_node, filp);
 }
 
diff -druNp --no-dereference linux-libre-4.1.23-gnu/drivers/gpu/drm/radeon/si_dpm.c linux-libre-4.1.24-gnu/drivers/gpu/drm/radeon/si_dpm.c
--- linux-libre-4.1.23-gnu/drivers/gpu/drm/radeon/si_dpm.c	2016-04-25 11:57:36.000000000 -0400
+++ linux-libre-4.1.24-gnu/drivers/gpu/drm/radeon/si_dpm.c	2016-05-11 00:10:35.000000000 -0400
@@ -2926,6 +2926,10 @@ static struct si_dpm_quirk si_dpm_quirk_
 	{ PCI_VENDOR_ID_ATI, 0x6810, 0x1462, 0x3036, 0, 120000 },
 	{ PCI_VENDOR_ID_ATI, 0x6811, 0x174b, 0xe271, 0, 120000 },
 	{ PCI_VENDOR_ID_ATI, 0x6810, 0x174b, 0xe271, 85000, 90000 },
+	{ PCI_VENDOR_ID_ATI, 0x6811, 0x1762, 0x2015, 0, 120000 },
+	{ PCI_VENDOR_ID_ATI, 0x6811, 0x1043, 0x2015, 0, 120000 },
+	{ PCI_VENDOR_ID_ATI, 0x6811, 0x148c, 0x2015, 0, 120000 },
+	{ PCI_VENDOR_ID_ATI, 0x6810, 0x1682, 0x9275, 0, 120000 },
 	{ 0, 0, 0, 0 },
 };
 
diff -druNp --no-dereference linux-libre-4.1.23-gnu/drivers/input/tablet/gtco.c linux-libre-4.1.24-gnu/drivers/input/tablet/gtco.c
--- linux-libre-4.1.23-gnu/drivers/input/tablet/gtco.c	2016-04-25 11:57:36.000000000 -0400
+++ linux-libre-4.1.24-gnu/drivers/input/tablet/gtco.c	2016-05-11 00:10:35.000000000 -0400
@@ -858,6 +858,14 @@ static int gtco_probe(struct usb_interfa
 		goto err_free_buf;
 	}
 
+	/* Sanity check that a device has an endpoint */
+	if (usbinterface->altsetting[0].desc.bNumEndpoints < 1) {
+		dev_err(&usbinterface->dev,
+			"Invalid number of endpoints\n");
+		error = -EINVAL;
+		goto err_free_urb;
+	}
+
 	/*
 	 * The endpoint is always altsetting 0, we know this since we know
 	 * this device only has one interrupt endpoint
@@ -879,7 +887,7 @@ static int gtco_probe(struct usb_interfa
 	 * HID report descriptor
 	 */
 	if (usb_get_extra_descriptor(usbinterface->cur_altsetting,
-				     HID_DEVICE_TYPE, &hid_desc) != 0){
+				     HID_DEVICE_TYPE, &hid_desc) != 0) {
 		dev_err(&usbinterface->dev,
 			"Can't retrieve exta USB descriptor to get hid report descriptor length\n");
 		error = -EIO;
diff -druNp --no-dereference linux-libre-4.1.23-gnu/drivers/misc/mei/bus.c linux-libre-4.1.24-gnu/drivers/misc/mei/bus.c
--- linux-libre-4.1.23-gnu/drivers/misc/mei/bus.c	2016-04-25 11:57:36.000000000 -0400
+++ linux-libre-4.1.24-gnu/drivers/misc/mei/bus.c	2016-05-11 00:10:35.000000000 -0400
@@ -238,11 +238,6 @@ static ssize_t ___mei_cl_send(struct mei
 	dev = cl->dev;
 
 	mutex_lock(&dev->device_lock);
-	if (dev->dev_state != MEI_DEV_ENABLED) {
-		rets = -ENODEV;
-		goto out;
-	}
-
 	if (!mei_cl_is_connected(cl)) {
 		rets = -ENODEV;
 		goto out;
@@ -292,10 +287,6 @@ ssize_t __mei_cl_recv(struct mei_cl *cl,
 	dev = cl->dev;
 
 	mutex_lock(&dev->device_lock);
-	if (dev->dev_state != MEI_DEV_ENABLED) {
-		rets = -ENODEV;
-		goto out;
-	}
 
 	cb = mei_cl_read_cb(cl, NULL);
 	if (cb)
diff -druNp --no-dereference linux-libre-4.1.23-gnu/drivers/net/wireless/intel/iwlwifi/pcie/trans.c linux-libre-4.1.24-gnu/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
--- linux-libre-4.1.23-gnu/drivers/net/wireless/intel/iwlwifi/pcie/trans.c	2016-04-25 11:57:36.000000000 -0400
+++ linux-libre-4.1.24-gnu/drivers/net/wireless/intel/iwlwifi/pcie/trans.c	2016-05-11 00:10:35.000000000 -0400
@@ -731,8 +731,8 @@ static int iwl_pcie_rsa_race_bug_wa(stru
 	 */
 	val = iwl_read_prph(trans, PREG_AUX_BUS_WPROT_0);
 	if (val & (BIT(1) | BIT(17))) {
-		IWL_INFO(trans,
-			 "can't access the RSA semaphore it is write protected\n");
+		IWL_DEBUG_INFO(trans,
+			       "can't access the RSA semaphore it is write protected\n");
 		return 0;
 	}
 
diff -druNp --no-dereference linux-libre-4.1.23-gnu/drivers/pinctrl/mediatek/pinctrl-mtk-common.c linux-libre-4.1.24-gnu/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
--- linux-libre-4.1.23-gnu/drivers/pinctrl/mediatek/pinctrl-mtk-common.c	2016-04-25 11:57:36.000000000 -0400
+++ linux-libre-4.1.24-gnu/drivers/pinctrl/mediatek/pinctrl-mtk-common.c	2016-05-11 00:10:35.000000000 -0400
@@ -852,7 +852,8 @@ static int mtk_gpio_set_debounce(struct
 	struct mtk_pinctrl *pctl = dev_get_drvdata(chip->dev);
 	int eint_num, virq, eint_offset;
 	unsigned int set_offset, bit, clr_bit, clr_offset, rst, i, unmask, dbnc;
-	static const unsigned int dbnc_arr[] = {0 , 1, 16, 32, 64, 128, 256};
+	static const unsigned int debounce_time[] = {500, 1000, 16000, 32000, 64000,
+						128000, 256000};
 	const struct mtk_desc_pin *pin;
 	struct irq_data *d;
 
@@ -870,9 +871,9 @@ static int mtk_gpio_set_debounce(struct
 	if (!mtk_eint_can_en_debounce(pctl, eint_num))
 		return -ENOSYS;
 
-	dbnc = ARRAY_SIZE(dbnc_arr);
-	for (i = 0; i < ARRAY_SIZE(dbnc_arr); i++) {
-		if (debounce <= dbnc_arr[i]) {
+	dbnc = ARRAY_SIZE(debounce_time);
+	for (i = 0; i < ARRAY_SIZE(debounce_time); i++) {
+		if (debounce <= debounce_time[i]) {
 			dbnc = i;
 			break;
 		}
diff -druNp --no-dereference linux-libre-4.1.23-gnu/drivers/usb/gadget/function/f_fs.c linux-libre-4.1.24-gnu/drivers/usb/gadget/function/f_fs.c
--- linux-libre-4.1.23-gnu/drivers/usb/gadget/function/f_fs.c	2016-04-25 11:57:36.000000000 -0400
+++ linux-libre-4.1.24-gnu/drivers/usb/gadget/function/f_fs.c	2016-05-11 00:10:35.000000000 -0400
@@ -646,6 +646,7 @@ static void ffs_user_copy_worker(struct
 						   work);
 	int ret = io_data->req->status ? io_data->req->status :
 					 io_data->req->actual;
+	bool kiocb_has_eventfd = io_data->kiocb->ki_flags & IOCB_EVENTFD;
 
 	if (io_data->read && ret > 0) {
 		use_mm(io_data->mm);
@@ -657,13 +658,11 @@ static void ffs_user_copy_worker(struct
 
 	io_data->kiocb->ki_complete(io_data->kiocb, ret, ret);
 
-	if (io_data->ffs->ffs_eventfd &&
-	    !(io_data->kiocb->ki_flags & IOCB_EVENTFD))
+	if (io_data->ffs->ffs_eventfd && !kiocb_has_eventfd)
 		eventfd_signal(io_data->ffs->ffs_eventfd, 1);
 
 	usb_ep_free_request(io_data->ep, io_data->req);
 
-	io_data->kiocb->private = NULL;
 	if (io_data->read)
 		kfree(io_data->to_free);
 	kfree(io_data->buf);
diff -druNp --no-dereference linux-libre-4.1.23-gnu/include/drm/drm_cache.h linux-libre-4.1.24-gnu/include/drm/drm_cache.h
--- linux-libre-4.1.23-gnu/include/drm/drm_cache.h	2016-04-25 11:57:36.000000000 -0400
+++ linux-libre-4.1.24-gnu/include/drm/drm_cache.h	2016-05-11 00:10:35.000000000 -0400
@@ -39,6 +39,8 @@ static inline bool drm_arch_can_wc_memor
 {
 #if defined(CONFIG_PPC) && !defined(CONFIG_NOT_COHERENT_CACHE)
 	return false;
+#elif defined(CONFIG_MIPS) && defined(CONFIG_CPU_LOONGSON3)
+	return false;
 #else
 	return true;
 #endif
diff -druNp --no-dereference linux-libre-4.1.23-gnu/include/linux/hugetlb.h linux-libre-4.1.24-gnu/include/linux/hugetlb.h
--- linux-libre-4.1.23-gnu/include/linux/hugetlb.h	2016-04-25 11:57:36.000000000 -0400
+++ linux-libre-4.1.24-gnu/include/linux/hugetlb.h	2016-05-11 00:10:35.000000000 -0400
@@ -460,15 +460,14 @@ static inline spinlock_t *huge_pte_lockp
 	return &mm->page_table_lock;
 }
 
-static inline bool hugepages_supported(void)
-{
-	/*
-	 * Some platform decide whether they support huge pages at boot
-	 * time. On these, such as powerpc, HPAGE_SHIFT is set to 0 when
-	 * there is no such support
-	 */
-	return HPAGE_SHIFT != 0;
-}
+#ifndef hugepages_supported
+/*
+ * Some platform decide whether they support huge pages at boot
+ * time. Some of them, such as powerpc, set HPAGE_SHIFT to 0
+ * when there is no such support
+ */
+#define hugepages_supported() (HPAGE_SHIFT != 0)
+#endif
 
 #else	/* CONFIG_HUGETLB_PAGE */
 struct hstate {};
diff -druNp --no-dereference linux-libre-4.1.23-gnu/kernel/futex.c linux-libre-4.1.24-gnu/kernel/futex.c
--- linux-libre-4.1.23-gnu/kernel/futex.c	2016-04-25 11:57:36.000000000 -0400
+++ linux-libre-4.1.24-gnu/kernel/futex.c	2016-05-11 00:10:35.000000000 -0400
@@ -1157,10 +1157,20 @@ static int wake_futex_pi(u32 __user *uad
 	 */
 	newval = FUTEX_WAITERS | task_pid_vnr(new_owner);
 
-	if (cmpxchg_futex_value_locked(&curval, uaddr, uval, newval))
+	if (cmpxchg_futex_value_locked(&curval, uaddr, uval, newval)) {
 		ret = -EFAULT;
-	else if (curval != uval)
-		ret = -EINVAL;
+	} else if (curval != uval) {
+		/*
+		 * If a unconditional UNLOCK_PI operation (user space did not
+		 * try the TID->0 transition) raced with a waiter setting the
+		 * FUTEX_WAITERS flag between get_user() and locking the hash
+		 * bucket lock, retry the operation.
+		 */
+		if ((FUTEX_TID_MASK & curval) == uval)
+			ret = -EAGAIN;
+		else
+			ret = -EINVAL;
+	}
 	if (ret) {
 		raw_spin_unlock(&pi_state->pi_mutex.wait_lock);
 		return ret;
@@ -2419,6 +2429,15 @@ retry:
 		 */
 		if (ret == -EFAULT)
 			goto pi_faulted;
+		/*
+		 * A unconditional UNLOCK_PI op raced against a waiter
+		 * setting the FUTEX_WAITERS bit. Try again.
+		 */
+		if (ret == -EAGAIN) {
+			spin_unlock(&hb->lock);
+			put_futex_key(&key);
+			goto retry;
+		}
 		goto out_unlock;
 	}
 
diff -druNp --no-dereference linux-libre-4.1.23-gnu/Makefile linux-libre-4.1.24-gnu/Makefile
--- linux-libre-4.1.23-gnu/Makefile	2016-04-28 15:16:09.000000000 -0400
+++ linux-libre-4.1.24-gnu/Makefile	2016-05-12 08:11:33.000000000 -0400
@@ -1,6 +1,6 @@
 VERSION = 4
 PATCHLEVEL = 1
-SUBLEVEL = 23
+SUBLEVEL = 24
 EXTRAVERSION = -gnu
 NAME = Series 4800
 
diff -druNp --no-dereference linux-libre-4.1.23-gnu/net/netlink/af_netlink.c linux-libre-4.1.24-gnu/net/netlink/af_netlink.c
--- linux-libre-4.1.23-gnu/net/netlink/af_netlink.c	2016-04-25 11:57:36.000000000 -0400
+++ linux-libre-4.1.24-gnu/net/netlink/af_netlink.c	2016-05-11 00:10:35.000000000 -0400
@@ -1290,7 +1290,7 @@ static int netlink_release(struct socket
 
 	skb_queue_purge(&sk->sk_write_queue);
 
-	if (nlk->portid) {
+	if (nlk->portid && nlk->bound) {
 		struct netlink_notify n = {
 						.net = sock_net(sk),
 						.protocol = sk->sk_protocol,
diff -druNp --no-dereference linux-libre-4.1.23-gnu/net/wireless/nl80211.c linux-libre-4.1.24-gnu/net/wireless/nl80211.c
--- linux-libre-4.1.23-gnu/net/wireless/nl80211.c	2016-04-25 11:57:36.000000000 -0400
+++ linux-libre-4.1.24-gnu/net/wireless/nl80211.c	2016-05-11 00:10:35.000000000 -0400
@@ -12777,7 +12777,7 @@ static int nl80211_netlink_notify(struct
 	struct wireless_dev *wdev;
 	struct cfg80211_beacon_registration *reg, *tmp;
 
-	if (state != NETLINK_URELEASE)
+	if (state != NETLINK_URELEASE || notify->protocol != NETLINK_GENERIC)
 		return NOTIFY_DONE;
 
 	rcu_read_lock();
diff -druNp --no-dereference linux-libre-4.1.23-gnu/sound/pci/hda/hda_intel.c linux-libre-4.1.24-gnu/sound/pci/hda/hda_intel.c
--- linux-libre-4.1.23-gnu/sound/pci/hda/hda_intel.c	2016-04-25 11:57:36.000000000 -0400
+++ linux-libre-4.1.24-gnu/sound/pci/hda/hda_intel.c	2016-05-11 00:10:35.000000000 -0400
@@ -307,6 +307,10 @@ enum {
 	(AZX_DCAPS_INTEL_PCH | AZX_DCAPS_SEPARATE_STREAM_TAG |\
 	 AZX_DCAPS_I915_POWERWELL)
 
+#define AZX_DCAPS_INTEL_BROXTON \
+	(AZX_DCAPS_INTEL_PCH | AZX_DCAPS_SEPARATE_STREAM_TAG |\
+	 AZX_DCAPS_I915_POWERWELL)
+
 /* quirks for ATI SB / AMD Hudson */
 #define AZX_DCAPS_PRESET_ATI_SB \
 	(AZX_DCAPS_NO_TCSEL | AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB |\
@@ -2039,6 +2043,12 @@ static const struct pci_device_id azx_id
 	/* Sunrise Point-LP */
 	{ PCI_DEVICE(0x8086, 0x9d70),
 	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_SKYLAKE },
+	/* Broxton-P(Apollolake) */
+	{ PCI_DEVICE(0x8086, 0x5a98),
+	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_BROXTON },
+	/* Broxton-T */
+	{ PCI_DEVICE(0x8086, 0x1a98),
+	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_BROXTON },
 	/* Haswell */
 	{ PCI_DEVICE(0x8086, 0x0a0c),
 	  .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL },
diff -druNp --no-dereference linux-libre-4.1.23-gnu/sound/pci/hda/patch_realtek.c linux-libre-4.1.24-gnu/sound/pci/hda/patch_realtek.c
--- linux-libre-4.1.23-gnu/sound/pci/hda/patch_realtek.c	2016-04-25 11:57:36.000000000 -0400
+++ linux-libre-4.1.24-gnu/sound/pci/hda/patch_realtek.c	2016-05-11 00:10:35.000000000 -0400
@@ -5318,6 +5318,7 @@ static const struct snd_pci_quirk alc269
 	SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1028, 0x0665, "Dell XPS 13", ALC288_FIXUP_DELL_XPS_13),
+	SND_PCI_QUIRK(0x1028, 0x0669, "Dell Optiplex 9020m", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1028, 0x069a, "Dell Vostro 5480", ALC290_FIXUP_SUBWOOFER_HSJACK),
 	SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
 	SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
diff -druNp --no-dereference linux-libre-4.1.23-gnu/sound/pci/pcxhr/pcxhr_core.c linux-libre-4.1.24-gnu/sound/pci/pcxhr/pcxhr_core.c
--- linux-libre-4.1.23-gnu/sound/pci/pcxhr/pcxhr_core.c	2016-04-25 11:57:36.000000000 -0400
+++ linux-libre-4.1.24-gnu/sound/pci/pcxhr/pcxhr_core.c	2016-05-11 00:10:35.000000000 -0400
@@ -1341,5 +1341,6 @@ irqreturn_t pcxhr_threaded_irq(int irq,
 	}
 
 	pcxhr_msg_thread(mgr);
+	mutex_unlock(&mgr->lock);
 	return IRQ_HANDLED;
 }
