Index: linux-4.4.39-rt50/drivers/acpi/acpica/hwvalid.c
===================================================================
--- linux-4.4.39-rt50.orig/drivers/acpi/acpica/hwvalid.c
+++ linux-4.4.39-rt50/drivers/acpi/acpica/hwvalid.c
@@ -42,6 +42,7 @@
  */
 
 #include <acpi/acpi.h>
+#include <linux/dmi.h>
 #include "accommon.h"
 
 #define _COMPONENT          ACPI_HARDWARE
@@ -281,11 +282,30 @@ acpi_status acpi_hw_read_port(acpi_io_ad
  *
  *****************************************************************************/
 
+static int lenovo_quirk = -1;
 acpi_status acpi_hw_write_port(acpi_io_address address, u32 value, u32 width)
 {
 	acpi_status status;
 	u32 i;
 
+	/*
+	 * A Lenovo board exhibits latencies of about 1 ms when 47 is written
+	 * to the address 0xb2 - don't do that whatever it is used for.
+	 */
+	if (lenovo_quirk == -1) {
+		/* 3.12. kernel: DMI little/big endian mismatch */
+		char *broken1 = "E02159D6-249E-E111-8130-F0141B445900";
+		/* 3.18+ kernel: DMI correct */
+		char *broken2 = "D65921E0-9E24-11E1-8130-F0141B445900";
+		const char *this = dmi_get_system_info(DMI_PRODUCT_UUID);
+
+		lenovo_quirk = !strcmp(this, broken1);
+		if (!lenovo_quirk)
+			lenovo_quirk = !strcmp(this, broken2);
+	}
+	if (lenovo_quirk && address == 0xb2 && value == 47 && width == 8)
+		return AE_OK;
+
 	/* Truncate address to 16 bits if requested */
 
 	if (acpi_gbl_truncate_io_addresses) {