Instead of adding a new property type, read buffer properties as integers. Even though the internal representation in ACPI is different, the data type is the same (byte) than on 8-bit integers. Signed-off-by: Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxx> --- drivers/acpi/property.c | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/drivers/acpi/property.c b/drivers/acpi/property.c index d3f6d95e0fb19..f23d15abadd65 100644 --- a/drivers/acpi/property.c +++ b/drivers/acpi/property.c @@ -1108,6 +1108,10 @@ static int acpi_data_prop_read_single(const struct acpi_device_data *data, size_t i; \ \ for (i = 0; i < nval; i++) { \ + if (items->type == ACPI_TYPE_BUFFER) { \ + val[i] = items->buffer.pointer[i]; \ + continue; \ + } \ if (items[i].type != ACPI_TYPE_INTEGER) \ return -EPROTO; \ if (items[i].integer.value > U##bits##_MAX) \ @@ -1163,18 +1167,40 @@ static int acpi_data_prop_read(const struct acpi_device_data *data, } ret = acpi_data_get_property_array(data, propname, ACPI_TYPE_ANY, &obj); + if (ret && proptype >= DEV_PROP_U8 && proptype <= DEV_PROP_U64) + ret = acpi_data_get_property(data, propname, ACPI_TYPE_BUFFER, + &obj); if (ret) return ret; - if (!val) + if (!val) { + if (obj->type == ACPI_TYPE_BUFFER) + return obj->buffer.length; + return obj->package.count; + } - if (proptype != DEV_PROP_STRING && nval > obj->package.count) - return -EOVERFLOW; + switch (proptype) { + case DEV_PROP_STRING: + break; + case DEV_PROP_U8 ... DEV_PROP_U64: + if (obj->type == ACPI_TYPE_BUFFER) { + if (nval <= obj->buffer.length) + break; + return -EOVERFLOW; + } + fallthrough; + default: + if (nval > obj->package.count) + return -EOVERFLOW; + } if (nval == 0) return -EINVAL; - items = obj->package.elements; + if (obj->type != ACPI_TYPE_BUFFER) + items = obj->package.elements; + else + items = obj; switch (proptype) { case DEV_PROP_U8: -- 2.30.2