Commit 3a133f7c authored by Daniel Bertalan's avatar Daniel Bertalan Committed by Hans de Goede
Browse files

platform/x86: thinkpad_acpi: Fix Embedded Controller access on X380 Yoga



On the X380 Yoga, the `ECRD` and `ECWR` ACPI objects cannot be used for
accessing the Embedded Controller: instead of a method that reads from
the EC's memory, `ECRD` is the name of a location in high memory. This
meant that trying to call them would fail with the following message:

  ACPI: \_SB.PCI0.LPCB.EC.ECRD: 1 arguments were passed to a non-method
  ACPI object (RegionField)

With this commit, it is now possible to access the EC and read
temperature and fan speed information. Note that while writes to the
HFSP register do go through (as indicated by subsequent reads showing
the new value), the fan does not actually change its speed.

Signed-off-by: default avatarDaniel Bertalan <dani@danielbertalan.dev>
Link: https://lore.kernel.org/r/20230414180034.63914-1-dani@danielbertalan.dev


Reviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
parent 14f6f0e3
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -11691,6 +11691,7 @@ static int __init thinkpad_acpi_module_init(void)
{
	const struct dmi_system_id *dmi_id;
	int ret, i;
	acpi_object_type obj_type;

	tpacpi_lifecycle = TPACPI_LIFE_INIT;

@@ -11716,6 +11717,21 @@ static int __init thinkpad_acpi_module_init(void)
	TPACPI_ACPIHANDLE_INIT(ecrd);
	TPACPI_ACPIHANDLE_INIT(ecwr);

	/*
	 * Quirk: in some models (e.g. X380 Yoga), an object named ECRD
	 * exists, but it is a register, not a method.
	 */
	if (ecrd_handle) {
		acpi_get_type(ecrd_handle, &obj_type);
		if (obj_type != ACPI_TYPE_METHOD)
			ecrd_handle = NULL;
	}
	if (ecwr_handle) {
		acpi_get_type(ecwr_handle, &obj_type);
		if (obj_type != ACPI_TYPE_METHOD)
			ecwr_handle = NULL;
	}

	tpacpi_wq = create_singlethread_workqueue(TPACPI_WORKQUEUE_NAME);
	if (!tpacpi_wq) {
		thinkpad_acpi_module_exit();