Hi,
On 4/14/23 20:02, Daniel Bertalan wrote:
> 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: Daniel Bertalan <da...@da...v>
Interestig, this looks like a pretty clean solution to me.
Mark Pearson, do you have any remarks on this ?
Regards,
Hans
> ---
> drivers/platform/x86/thinkpad_acpi.c | 16 ++++++++++++++++
> 1 file changed, 16 insertions(+)
>
> diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c
> index 7191ff2625b1..6fe82f805ea8 100644
> --- a/drivers/platform/x86/thinkpad_acpi.c
> +++ b/drivers/platform/x86/thinkpad_acpi.c
> @@ -11699,6 +11699,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;
>
> @@ -11724,6 +11725,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();
|