diff options
author | Adrian Hunter <adrian.hunter@intel.com> | 2017-04-19 15:48:55 +0300 |
---|---|---|
committer | Ulf Hansson <ulf.hansson@linaro.org> | 2017-04-24 22:42:24 +0300 |
commit | a72016a44703476bdb3567a13695938566e8f413 (patch) | |
tree | 1f7c0dc65c8abc6bb39a3e6fe0ec466aec09ee0f /drivers/mmc | |
parent | 3fcc78340f3a9bef2be7ad54258b06e1f177d3fd (diff) | |
download | linux-a72016a44703476bdb3567a13695938566e8f413.tar.xz |
mmc: sdhci-pci: Allow for 3 bytes from Intel DSM
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>
Diffstat (limited to 'drivers/mmc')
-rw-r--r-- | drivers/mmc/host/sdhci-pci-core.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c index 833072b8453e..92fc3f7c538d 100644 --- a/drivers/mmc/host/sdhci-pci-core.c +++ b/drivers/mmc/host/sdhci-pci-core.c @@ -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); |