Hi again,
first, I have posted this question already on Stackoverflow [1] and Reddit [2] but forgot to put it on the mailing list.
I have a touchscreen controller (which is an I2C slave) that I need to enable via APCI. This should be done by calling the _PS0 ACPI method. I call this method by using AcpiEvaluateObject with no arguments and no return values.
When calling this method on the parent object (I2C4), everything goes fine but calling it on the touch screen controller (TCS2), it fails. What also makes me wonder is that it returns AE_AML_UNINITIALIZED_ARG even though it doesn't take any args (according to the DSDT).
Calling the _CRS method on the same object also works without any problems. I also looked into the Linux kernel source how they change ACPI power states and they use the exact same mechanism. It boils down to the use of acpi_evaluate_object in acpi_dev_pm_explicit_set which also seems to work on the touchscreen device.
what am I missing to successfully enable the touchscreen device via ACPI? Is there something the Linux kernel is initializing implicitly (I couldn't find something like this)?
The current workaround for this issue is to use the GPIO pins to enable the controller. But this isn't the desired way since it requires an additional GPIO driver that takes ~100 LOC and also a separate ACPI initialization for this driver.
Besides that other functions that are needed to get initial parameters return errors. On the specific device I have the following examples:
_SB_.I2C4.SSCN _SB_.I2C4.FMCN _SB_.I2C4.FPCN _SB_.I2C4.HSCN
Similar things also happen on the GPIO device (_SB_.GPO1).
Regards, Johannes
[1]: https://stackoverflow.com/questions/44382881/acpi-ps0-failing-with-uninitial... [2]: https://www.reddit.com/r/osdev/comments/6mtlv7/acpi_psx_function_returns_ae_... DSDT: https://gist.github.com/jklmnn/15ed561202e04390e7bc366c0f803577#file-dsdt-ds...