/* 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) }