ACPI: EC: Allow multibyte access to EC

http://bugzilla.kernel.org/show_bug.cgi?id=14667

Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de>
Signed-off-by: Len Brown <len.brown@intel.com>

authored by Alexey Starikovskiy and committed by Len Brown dadf28a1 a3d3203e

+21 -26
+12
drivers/acpi/acpica/exprep.c
··· 468 468 469 469 acpi_ut_add_reference(obj_desc->field.region_obj); 470 470 471 + /* allow full data read from EC address space */ 472 + if (obj_desc->field.region_obj->region.space_id == 473 + ACPI_ADR_SPACE_EC) { 474 + if (obj_desc->common_field.bit_length > 8) 475 + obj_desc->common_field.access_bit_width = 476 + ACPI_ROUND_UP(obj_desc->common_field. 477 + bit_length, 8); 478 + obj_desc->common_field.access_byte_width = 479 + ACPI_DIV_8(obj_desc->common_field. 480 + access_bit_width); 481 + } 482 + 471 483 ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, 472 484 "RegionField: BitOff %X, Off %X, Gran %X, Region %p\n", 473 485 obj_desc->field.start_field_bit_offset,
+9 -26
drivers/acpi/ec.c
··· 628 628 629 629 static acpi_status 630 630 acpi_ec_space_handler(u32 function, acpi_physical_address address, 631 - u32 bits, u64 *value, 631 + u32 bits, u64 *value64, 632 632 void *handler_context, void *region_context) 633 633 { 634 634 struct acpi_ec *ec = handler_context; 635 - int result = 0, i; 636 - u8 temp = 0; 635 + int result = 0, i, bytes = bits / 8; 636 + u8 *value = (u8 *)value64; 637 637 638 638 if ((address > 0xFF) || !value || !handler_context) 639 639 return AE_BAD_PARAMETER; ··· 641 641 if (function != ACPI_READ && function != ACPI_WRITE) 642 642 return AE_BAD_PARAMETER; 643 643 644 - if (bits != 8 && acpi_strict) 645 - return AE_BAD_PARAMETER; 646 - 647 - if (EC_FLAGS_MSI) 644 + if (EC_FLAGS_MSI || bits > 8) 648 645 acpi_ec_burst_enable(ec); 649 646 650 - if (function == ACPI_READ) { 651 - result = acpi_ec_read(ec, address, &temp); 652 - *value = temp; 653 - } else { 654 - temp = 0xff & (*value); 655 - result = acpi_ec_write(ec, address, temp); 656 - } 647 + for (i = 0; i < bytes; ++i, ++address, ++value) 648 + result = (function == ACPI_READ) ? 649 + acpi_ec_read(ec, address, value) : 650 + acpi_ec_write(ec, address, *value); 657 651 658 - for (i = 8; unlikely(bits - i > 0); i += 8) { 659 - ++address; 660 - if (function == ACPI_READ) { 661 - result = acpi_ec_read(ec, address, &temp); 662 - (*value) |= ((u64)temp) << i; 663 - } else { 664 - temp = 0xff & ((*value) >> i); 665 - result = acpi_ec_write(ec, address, temp); 666 - } 667 - } 668 - 669 - if (EC_FLAGS_MSI) 652 + if (EC_FLAGS_MSI || bits > 8) 670 653 acpi_ec_burst_disable(ec); 671 654 672 655 switch (result) {