/* SPDX-License-Identifier: GPL-2.0-only */ /* SMSC LPC47N227 */ Device (SIO1) { Name (_HID, EISAID("PNP0A05")) Name (_UID, 1) OperationRegion(SIOR, SystemIO, 0x2e, 0x02) Field (SIOR, ByteAcc, Nolock, Preserve) { INDX, 8, DATA, 8 } Mutex (SIOM, 0x00) Method (READ, 3) { Acquire (SIOM, 0xffff) If (Arg0 == 0) { INDX = 0x55 INDX = Arg1 Local1 = DATA INDX = 0xaa } Local1 &= Arg2 Release(SIOM) Return(Local1) } Method (WRIT, 3) { Acquire (SIOM, 0xffff) If (Arg0 == 0) { INDX = 0x55 INDX = Arg1 DATA = Arg2 INDX = 0xaa } Release(SIOM) } Device (COMA) { Name(_HID, EISAID("PNP0501")) Name(_UID, 1) Name(_PRW, Package() { 0x08, 0x03 }) /* Device Status */ Method (_STA, 0) { // Device disabled by coreboot? If (CMAP == 0) { Return (0) } // Is the hardware enabled? Local0 = READ (0, 0x24, 0xff) If (Local0 == 0) { Return (0xd) } Else { // Power Enabled? Local0 = READ (0, 0x02, 0x08) If (Local0 == 0) { Return (0x0d) } Else { Return (0x0f) } } } /* Device Disable */ Method (_DIS, 0) { WRIT(0, 0x24, 0x00) Local0 = READ (0, 0x28, 0x0f) WRIT(0, 0x28, Local0) Local0 = READ (0, 0x02, 0xff) Local1 = ~0x08 Local0 &= Local1 WRIT(0, 0x02, Local0) } /* Possible Resource Settings */ Name(_PRS, ResourceTemplate() { StartDependentFn(0, 1) { IO(Decode16, 0x3f8, 0x3f8, 0x8, 0x8) IRQNoFlags() { 4 } } EndDependentFn() }) /* Current Resource Settings */ Method(_CRS, 0) { Name(NONE, ResourceTemplate() { IO(Decode16, 0x000, 0x000, 0x0, 0x1) IRQNoFlags() { } }) Name(RSRC, ResourceTemplate() { IO(Decode16, 0x3f8, 0x3f8, 0x8, 0x8, _IOA) IRQNoFlags(_IRA) { 4 } }) Local0 = _STA() & 0x02 If (Local0 == 0) { Return(NONE) } CreateWordField(RSRC, \_SB.PCI0.LPCB.SIO1.COMA._CRS._IOA._MIN, IOMN) CreateWordField(RSRC, \_SB.PCI0.LPCB.SIO1.COMA._CRS._IOA._MAX, IOMX) CreateWordField(RSRC, \_SB.PCI0.LPCB.SIO1.COMA._CRS._IRA._INT, IRQ) /* I/O Base */ Local0 = READ (0, 0x24, 0xfe) Local0 <<= 2 IOMN = Local0 IOMX = Local0 /* Interrupt */ Local0 = READ (0, 0x28, 0xf0) Local0 >>= 4 IRQ = 1 << Local0 Return(RSRC) } /* Set Resource Settings */ Method(_SRS, 1) { CreateByteField(Arg0, 0x02, IOLO) CreateByteField(Arg0, 0x03, IOHI) CreateByteField(Arg0, 0x09, IRQL) WRIT(0, 0x24, 0) FindSetRightBit(IRQL, Local0) Local0-- Local0 <<= 4 Local1 = READ (0, 0x28, 0x0f) Local0 |= Local1 WRIT(0, 0x28, Local0) Local0 = IOLO Local0 >>= 2 Local0 &= 0xfe Local1 = IOHI Local1 <<= 6 Local0 |= Local1 WRIT(0, 0x24, Local0) Local0 = READ (0, 0x02, 0xff) Local0 |= 0x08 WRIT(0, 0x02, Local0) Local0 = READ (0, 0x07, 0xff) Local1 = ~0x40 Local0 &= Local1 WRIT(0, 0x07, Local0) } /* D0 state - Line drivers are on */ Method (_PS0, 0) { Local0 = READ (0, 0x02, 0xff) Local0 |= 0x08 WRIT(0, 0x02, Local0) Local0 = READ (0, 0x07, 0xff) Local1 = ~0x40 Local0 &= Local1 WRIT(0, 0x07, Local0) } /* D3 State - Line drivers are off */ Method(_PS3, 0) { Local0 = READ (0, 0x02, 0xff) Local1 = ~0x08 Local0 &= Local1 WRIT(0, 0x02, Local0) } } Device (COMB) { Name(_HID, EISAID("PNP0501")) Name(_UID, 2) Name(_PRW, Package() { 0x08, 0x03 }) /* Device Status */ Method (_STA, 0) { // Device disabled by coreboot? If (CMBP == 0) { Return (0) } /* IRDA? */ Local0 = READ (0, 0x0c, 0x38) If (Local0 != 0) { Return (0) } // Is the hardware enabled? Local0 = READ (0, 0x25, 0xff) If (Local0 == 0) { Return (0xd) } Else { // Power Enabled? Local0 = READ (0, 0x02, 0x80) If (Local0 == 0) { Return (0x0d) } Else { Return (0x0f) } } } /* Device Disable */ Method (_DIS, 0) { WRIT(0, 0x25, 0x00) Local0 = READ (0, 0x28, 0xf0) WRIT(0, 0x28, Local0) Local0 = READ (0, 0x02, 0xff) Local1 = ~0x80 Local0 &= Local1 WRIT(0, 0x02, Local0) } /* Possible Resource Settings */ Name(_PRS, ResourceTemplate() { StartDependentFn(0, 1) { IO(Decode16, 0x2f8, 0x2f8, 0x8, 0x8) IRQNoFlags() { 3 } } EndDependentFn() }) /* Current Resource Settings */ Method(_CRS, 0) { Name(NONE, ResourceTemplate() { IO(Decode16, 0x000, 0x000, 0x0, 0x1) IRQNoFlags() { } }) Name(RSRC, ResourceTemplate() { IO(Decode16, 0x2f8, 0x2f8, 0x8, 0x8, _IOB) IRQNoFlags(_IRB) { 3 } }) Local0 = _STA() & 0x02 If (Local0 == 0) { Return(NONE) } CreateWordField(RSRC, \_SB.PCI0.LPCB.SIO1.COMB._CRS._IOB._MIN, IOMN) CreateWordField(RSRC, \_SB.PCI0.LPCB.SIO1.COMB._CRS._IOB._MAX, IOMX) CreateWordField(RSRC, \_SB.PCI0.LPCB.SIO1.COMB._CRS._IRB._INT, IRQ) /* I/O Base */ Local0 = READ (0, 0x25, 0xfe) Local0 <<= 2 IOMN = Local0 IOMX = Local0 /* Interrupt */ Local0 = READ (0, 0x28, 0x0f) IRQ = 1 << Local0 Return(RSRC) } /* Set Resource Settings */ Method(_SRS, 1) { CreateByteField(Arg0, 0x02, IOLO) CreateByteField(Arg0, 0x03, IOHI) CreateByteField(Arg0, 0x09, IRQL) WRIT(0, 0x25, 0) FindSetRightBit(IRQL, Local0) Local0-- Local1 = READ (0, 0x28, 0xf0) Local0 |= Local1 WRIT(0, 0x28, Local0) Local0 = IOLO Local0 >>= 2 Local0 &= 0xfe Local1 = IOHI Local1 <<= 6 Local0 |= Local1 WRIT(0, 0x25, Local0) Local0 = READ (0, 0x0c, 0xff) Local1 = ~0x38 Local0 &= Local1 WRIT(0, 0x0c, Local0) Local0 = READ (0, 0x02, 0xff) Local0 |= 0x80 WRIT(0, 0x02, Local0) Local0 = READ (0, 0x07, 0xff) Local1 = ~0x20 Local0 &= Local1 WRIT(0, 0x07, Local0) } /* D0 state - Line drivers are on */ Method (_PS0, 0) { Local0 = READ (0, 0x02, 0xff) Local0 |= 0x80 WRIT(0, 0x02, Local0) Local0 = READ (0, 0x07, 0xff) Local1 = ~0x20 Local0 &= Local1 WRIT(0, 0x07, Local0) } /* D3 State - Line drivers are off */ Method(_PS3, 0) { Local0 = READ (0, 0x02, 0xff) Local1 = ~0x80 Local0 &= Local1 WRIT(0, 0x02, Local0) } } }