blob: b81c5b1c3790ad3567fd14d3ff9abce2a8d841ca [file] [log] [blame]
Angel Pons182dbde2020-04-02 23:49:05 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Mike Loptien573a1d62013-03-18 11:19:26 -06002
3/* SMBUS Support */
4Mutex (SBX0, 0x00)
5OperationRegion (SMB0, SystemIO, 0xB00, 0x0C)
6 Field (SMB0, ByteAcc, NoLock, Preserve) {
Paul Menzel7b1a8a72015-06-14 11:55:27 +02007 HSTS, 8, /* SMBUS status */
Mike Loptien573a1d62013-03-18 11:19:26 -06008 SSTS, 8, /* SMBUS slave status */
9 HCNT, 8, /* SMBUS control */
10 HCMD, 8, /* SMBUS host cmd */
11 HADD, 8, /* SMBUS address */
12 DAT0, 8, /* SMBUS data0 */
13 DAT1, 8, /* SMBUS data1 */
14 BLKD, 8, /* SMBUS block data */
15 SCNT, 8, /* SMBUS slave control */
Paul Menzel4159a802013-07-14 00:24:31 +020016 SCMD, 8, /* SMBUS shadow cmd */
Mike Loptien573a1d62013-03-18 11:19:26 -060017 SEVT, 8, /* SMBUS slave event */
Paul Menzel7b1a8a72015-06-14 11:55:27 +020018 SDAT, 8 /* SMBUS slave data */
Mike Loptien573a1d62013-03-18 11:19:26 -060019}
20
21Method (WCLR, 0, NotSerialized) { /* clear SMBUS status register */
Elyes HAOUAS65648422021-01-27 12:18:42 +010022 HSTS = 0x1e
23 Local0 = 0xfa
24 While ((HSTS & 0x1e) != 0) && (Local0 > 0)) {
Mike Loptien573a1d62013-03-18 11:19:26 -060025 Stall (0x64)
Elyes HAOUAS65648422021-01-27 12:18:42 +010026 Local0--
Mike Loptien573a1d62013-03-18 11:19:26 -060027 }
28
29 Return (Local0)
30}
31
32Method (SWTC, 1, NotSerialized) {
Elyes HAOUAS65648422021-01-27 12:18:42 +010033 Local0 = Arg0
34 Local2 = 0x07
35 Local1 = 1
36 While (Local1 == 1) {
37 Local3 = HSTS & 0x1e
38 If (Local3 != 0) { /* read success */
39 If (Local3 != 0x02) {
40 Local2 = 0
Mike Loptien573a1d62013-03-18 11:19:26 -060041 }
42
Elyes HAOUAS65648422021-01-27 12:18:42 +010043 Local1 = 0
Mike Loptien573a1d62013-03-18 11:19:26 -060044 }
45 Else {
Elyes HAOUAS65648422021-01-27 12:18:42 +010046 If (Local0 < 0x0A) { /* read failure */
47 Local2 = 0x10
48 Local1 = 0
Mike Loptien573a1d62013-03-18 11:19:26 -060049 }
50 Else {
51 Sleep (0x0A) /* 10 ms, try again */
Elyes HAOUAS65648422021-01-27 12:18:42 +010052 Local0 -= 0x0a
Mike Loptien573a1d62013-03-18 11:19:26 -060053 }
54 }
55 }
56
57 Return (Local2)
58}
59
60Method (SMBR, 3, NotSerialized) {
Elyes HAOUAS65648422021-01-27 12:18:42 +010061 Local0 = 0x07
62 If (Acquire (SBX0, 0xFFFF) == 0) {
63 Local0 = WCLR () /* clear SMBUS status register before read data */
64 If (Local0 == 0) {
Mike Loptien573a1d62013-03-18 11:19:26 -060065 Release (SBX0)
66 Return (0x0)
67 }
68
Elyes HAOUAS65648422021-01-27 12:18:42 +010069 HSTS = 0x1f
70 HADD = (Arg1 << 1) | 1
71 HCMD = Arg2
72 If (Arg0 == 0x07) {
73 HCNT = 0x48 /* read byte */
Mike Loptien573a1d62013-03-18 11:19:26 -060074 }
75
Elyes HAOUAS65648422021-01-27 12:18:42 +010076 Local1 = SWTC (0x03E8) /* 1000 ms */
77 If (Local1 == 0) {
78 If (Arg0 == 0x07) {
79 Local0 = DAT0
Mike Loptien573a1d62013-03-18 11:19:26 -060080 }
81 }
82 Else {
Elyes HAOUAS65648422021-01-27 12:18:42 +010083 Local0 = Local1
Mike Loptien573a1d62013-03-18 11:19:26 -060084 }
85
86 Release (SBX0)
87 }
88
89 /* DBGO("the value of SMBusData0 register ") */
90 /* DBGO(Arg2) */
91 /* DBGO(" is ") */
92 /* DBGO(Local0) */
93 /* DBGO("\n") */
94
95 Return (Local0)
96}