blob: d9f6ac0a8aa8b7a70eb0f30e457fda5144508fe2 [file] [log] [blame]
/* 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)
}
}
}