mb/google/rex/var/rex0: add HID over SPI ACPI driver

Add driver to support ELAN touchscreen using SPI for rex

* See "HID Over SPI Protocol Specification" section 5.2 - ACPI enum
* https://www.microsoft.com/en-us/download/details.aspx?id=103325

BUG=b:278783755
TEST=Kernel driver is able to communicate with device. Also tested
S0ix, ran 'suspend_stress_test -c 1' - no issues in suspend/resume.

Signed-off-by: Eran Mitrani <mitrani@google.com>
Change-Id: Id51d385ce350cef23da4184b044c74569f4dd3f0
Reviewed-on: https://review.coreboot.org/c/coreboot/+/74885
Reviewed-by: Elyes Haouas <ehaouas@noos.fr>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Subrata Banik <subratabanik@google.com>
This commit is contained in:
Eran Mitrani 2023-05-02 13:58:58 -07:00 committed by Elyes Haouas
parent 0507e069b0
commit 3ed0b977eb
1 changed files with 152 additions and 0 deletions

View File

@ -0,0 +1,152 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* ELAN7B18UH - HID over SPI
* See "HID Over SPI Protocol Specification" section 5.2 - ACPI enum
* https://www.microsoft.com/en-us/download/details.aspx?id=103325
* NOTES:
* 1. Make sure TOUCH_SCR_IRQ is defined according to the board's schematics
* 2. Include this file under the scope for the correct SPI, e.g.:
* Scope (\_SB.PCI0.SPI0)
* {
* #include <variant/acpi/hid_spi_elan.asl>
* }
*/
Device(TCSC) {
Name (_HID, "ELAN9006") /* VendorID + DeviceID - <VVVVdddd> */
Name (_CID, "PNP0C51") /* Compatible ID - PNP0C51 */
Name (_SUB, "ELAN0732") /* SubVendorID + SubSystemID - <VVVVssss> */
Name (_HRV, 0x0001) /* Hardware Revision Number - 2 bytes */
Method (_STA, 0)
{
Return (0xf)
}
Name (_CRS, ResourceTemplate () {
SpiSerialBusV2 (
0, /* DeviceSelection */
PolarityLow, /* DeviceSelectionPolarity */
FourWireMode, /* WireMode */
8, /* DataBitLength */
ControllerInitiated, /* SlaveMode */
0x0B71B00, /* ConnectionSpeed (12MHz) */
ClockPolarityLow, /* ClockPolarity */
ClockPhaseFirst, /* ClockPhase */
"\\_SB.PCI0.SPI0", /* ResourceSource */
0, /* ResourceSourceIndex */
ResourceConsumer, /* ResourceUsage */
)
Interrupt(ResourceConsumer, Level, ActiveLow, Shared)
{
TOUCH_SCR_IRQ
}
})
/* _DSM - Device-Specific Method */
/* Arg0: UUID Unique function identifier */
/* Arg1: Integer Revision ID - Will be 3 for HidSpi V1 */
/* Arg2: Integer Function Index (0 = Return Supported Functions) */
/* Arg3: Package Parameters */
Method (_DSM, 4) {
/* HIDSPI UUID */
If(Arg0 == ToUUID("6E2AC436-0FCF-41AF-A265-B32A220DCFAB")) {
/* Switch on the function index */
switch(ToInteger(Arg2)) {
case(0) {
/* Switch on the revision level */
switch(ToInteger(Arg1)) {
case (3) {
/* HidSpi v1: Functions 0-6 */
Return(Buffer(One) { 0x7F })
}
default {
/* Unsupported revision */
Return(Buffer(One) { 0x00 })
}
}
}
case(1) {
/* Elan Input Report Header address - 0x1000*/
Return (0x1000)
}
case(2) {
/* Elan Input Report Body address - 0x1100*/
Return (0x1100)
}
case(3) {
/* Elan Output Report Header address - 0x2000 */
Return (0x2000)
}
case(4) {
/* Read opcode */
Return (Buffer(1) {0x0B})
}
case(5) {
/* Write opcode */
Return (Buffer(1) {0x02})
}
case(6) {
/* Flags */
Return (0x0000)
}
default {
/* Unsupported function index */
Return (Buffer() {0})
}
}
}
else {
/* No functions are supported for this UUID. */
return (Buffer() {0})
}
}
Method(_RST, 0, Serialized) {
/* De-assert the reset signal for 20ms */
CTXS(GPP_C01)
Sleep(20)
STXS(GPP_C01)
}
Name (_PR0, Package (0x01) /* Power Resources for D0 */
{
PR00
})
Name (_PR3, Package (0x01) /* Power Resources for D3hot */
{
PR00
})
PowerResource (PR00, 0x00, 0x0000)
{
Method (_STA, 0, NotSerialized) /* Status */
{
Return (1)
}
Method (_ON, 0, Serialized) /* Power On */
{
CTXS (GPP_C01)
STXS (GPP_C00)
Sleep (1)
STXS (GPP_C01)
Sleep (20)
STXS (GPP_C06)
}
Method (_OFF, 0, Serialized) /* Power Off */
{
CTXS (GPP_C06)
Sleep (2)
CTXS (GPP_C01)
Sleep (2)
CTXS (GPP_C00)
}
}
}