summaryrefslogtreecommitdiff
path: root/drivers/mmc
diff options
context:
space:
mode:
authorAdrian Hunter <adrian.hunter@intel.com>2017-04-19 15:48:55 +0300
committerUlf Hansson <ulf.hansson@linaro.org>2017-04-24 21:42:24 +0200
commita72016a44703476bdb3567a13695938566e8f413 (patch)
tree1f7c0dc65c8abc6bb39a3e6fe0ec466aec09ee0f /drivers/mmc
parent3fcc78340f3a9bef2be7ad54258b06e1f177d3fd (diff)
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.c12
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);