blob: b81c5b1c3790ad3567fd14d3ff9abce2a8d841ca [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0-only */
/* SMBUS Support */
Mutex (SBX0, 0x00)
OperationRegion (SMB0, SystemIO, 0xB00, 0x0C)
Field (SMB0, ByteAcc, NoLock, Preserve) {
HSTS, 8, /* SMBUS status */
SSTS, 8, /* SMBUS slave status */
HCNT, 8, /* SMBUS control */
HCMD, 8, /* SMBUS host cmd */
HADD, 8, /* SMBUS address */
DAT0, 8, /* SMBUS data0 */
DAT1, 8, /* SMBUS data1 */
BLKD, 8, /* SMBUS block data */
SCNT, 8, /* SMBUS slave control */
SCMD, 8, /* SMBUS shadow cmd */
SEVT, 8, /* SMBUS slave event */
SDAT, 8 /* SMBUS slave data */
}
Method (WCLR, 0, NotSerialized) { /* clear SMBUS status register */
HSTS = 0x1e
Local0 = 0xfa
While ((HSTS & 0x1e) != 0) && (Local0 > 0)) {
Stall (0x64)
Local0--
}
Return (Local0)
}
Method (SWTC, 1, NotSerialized) {
Local0 = Arg0
Local2 = 0x07
Local1 = 1
While (Local1 == 1) {
Local3 = HSTS & 0x1e
If (Local3 != 0) { /* read success */
If (Local3 != 0x02) {
Local2 = 0
}
Local1 = 0
}
Else {
If (Local0 < 0x0A) { /* read failure */
Local2 = 0x10
Local1 = 0
}
Else {
Sleep (0x0A) /* 10 ms, try again */
Local0 -= 0x0a
}
}
}
Return (Local2)
}
Method (SMBR, 3, NotSerialized) {
Local0 = 0x07
If (Acquire (SBX0, 0xFFFF) == 0) {
Local0 = WCLR () /* clear SMBUS status register before read data */
If (Local0 == 0) {
Release (SBX0)
Return (0x0)
}
HSTS = 0x1f
HADD = (Arg1 << 1) | 1
HCMD = Arg2
If (Arg0 == 0x07) {
HCNT = 0x48 /* read byte */
}
Local1 = SWTC (0x03E8) /* 1000 ms */
If (Local1 == 0) {
If (Arg0 == 0x07) {
Local0 = DAT0
}
}
Else {
Local0 = Local1
}
Release (SBX0)
}
/* DBGO("the value of SMBusData0 register ") */
/* DBGO(Arg2) */
/* DBGO(" is ") */
/* DBGO(Local0) */
/* DBGO("\n") */
Return (Local0)
}