mmc: sdhci-pci: Allow for 3 bytes from Intel DSM
authorAdrian Hunter <adrian.hunter@intel.com>
Wed, 19 Apr 2017 12:48:55 +0000 (15:48 +0300)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 24 Apr 2017 19:42:24 +0000 (21:42 +0200)
The DSM used by some Intel controllers can return a 3 byte package. Allow
for that by using memcpy to copy the bytes.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/sdhci-pci-core.c

index 833072b8453e1b6a680735c6457f8193a2e65acf..92fc3f7c538d73e9e496aacfeae45f37cd3c1a96 100644 (file)
@@ -12,6 +12,7 @@
  *     - JMicron (hardware and technical support)
  */
 
+#include <linux/string.h>
 #include <linux/delay.h>
 #include <linux/highmem.h>
 #include <linux/module.h>
@@ -413,6 +414,7 @@ static int __intel_dsm(struct intel_host *intel_host, struct device *dev,
 {
        union acpi_object *obj;
        int err = 0;
+       size_t len;
 
        obj = acpi_evaluate_dsm(ACPI_HANDLE(dev), intel_dsm_uuid, 0, fn, NULL);
        if (!obj)
@@ -423,12 +425,10 @@ static int __intel_dsm(struct intel_host *intel_host, struct device *dev,
                goto out;
        }
 
-       if (obj->buffer.length >= 4)
-               *result = *(u32 *)obj->buffer.pointer;
-       else if (obj->buffer.length >= 2)
-               *result = *(u16 *)obj->buffer.pointer;
-       else
-               *result = *(u8 *)obj->buffer.pointer;
+       len = min_t(size_t, obj->buffer.length, 4);
+
+       *result = 0;
+       memcpy(result, obj->buffer.pointer, len);
 out:
        ACPI_FREE(obj);