blob: 541dce3c890ce9fe7693c1b0bdc413125c4b1401 [file] [log] [blame]
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2011 Christoph Grenz <christophg+cb@grenz-bonn.de>
* Copyright (C) 2013 secunet Security Networks AG
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
/* =================== Keyboard Controller ================== */
/*
* Just uses the default i/o ports 0x60/0x64, irq 1 (and 12 for PS/2
* mouse). Do we have any system that needs this configurable?
*
* Controlled by the following preprocessor defines:
*
* SUPERIO_CHIP_NAME The name of the Super I/O chip (unique, required)
* SUPERIO_KBC_LDN The logical device number on the Super I/O
* chip for this keyboard controller (required)
* SUPERIO_KBC_PS2M If defined, PS/2 mouse support is included in
* the KBC_LDN. Mouse irq is set at IRQ1 of the
* KBC_LDN.
* SUPERIO_KBC_PS2LDN If defined, specifies a second LDN to configure
* PS/2 mouse support. Mouse irq is set at IRQ0 of
* this LDN.
* SUPERIO_KBC_PS2M and SUPERIO_KBC_PS2LDN are mutually exclusive.
*/
#include "pnp.asl"
#ifndef SUPERIO_CHIP_NAME
# error "SUPERIO_CHIP_NAME is not defined."
#endif
#ifndef SUPERIO_KBC_LDN
# error "SUPERIO_KBC_LDN is not defined."
#endif
#if defined(SUPERIO_KBC_PS2M) && defined(SUPERIO_KBC_PS2LDN)
# error "SUPERIO_KBC_PS2M and SUPERIO_KBC_PS2LDN are mutually exclusive."
#endif
Device (SUPERIO_ID(KBD, SUPERIO_KBC_LDN)) {
Name (_HID, EisaId ("PNP0303"))
Name (_UID, SUPERIO_UID(KBD, SUPERIO_KBC_LDN))
Method (_STA)
{
PNP_GENERIC_STA(SUPERIO_KBC_LDN)
}
Method (_DIS)
{
ENTER_CONFIG_MODE (SUPERIO_KBC_LDN)
Store (Zero, PNP_DEVICE_ACTIVE)
EXIT_CONFIG_MODE ()
#if defined(SUPERIO_KBC_PS2LDN)
Notify (SUPERIO_ID(PS2, SUPERIO_KBC_PS2LDN), 1)
#elif defined(SUPERIO_KBC_PS2M)
Notify (SUPERIO_ID(PS2, SUPERIO_KBC_LDN), 1)
#endif
}
Method (_PSC) {
PNP_DEFAULT_PSC
}
Method (_CRS, 0, Serialized)
{
Name (CRS, ResourceTemplate () {
IO (Decode16, 0x0000, 0x0000, 0x01, 0x01, IO0)
IO (Decode16, 0x0000, 0x0000, 0x01, 0x01, IO1)
IRQNoFlags (IR0) {}
})
ENTER_CONFIG_MODE (SUPERIO_KBC_LDN)
PNP_READ_IO(PNP_IO0, CRS, IO0)
PNP_READ_IO(PNP_IO1, CRS, IO1)
PNP_READ_IRQ(PNP_IRQ0, CRS, IR0)
EXIT_CONFIG_MODE ()
Return (CRS)
}
Name (_PRS, ResourceTemplate ()
{
StartDependentFn (0,0) {
IO (Decode16, 0x0060, 0x0060, 0x01, 0x01)
IO (Decode16, 0x0064, 0x0064, 0x01, 0x01)
IRQNoFlags () {1}
}
EndDependentFn()
})
Method (_SRS, 1, Serialized)
{
Name (TMPL, ResourceTemplate () {
IO (Decode16, 0x0000, 0x0000, 0x01, 0x01, IO0)
IO (Decode16, 0x0000, 0x0000, 0x01, 0x01, IO1)
IRQNoFlags (IR0) {}
})
ENTER_CONFIG_MODE (SUPERIO_KBC_LDN)
PNP_WRITE_IO(PNP_IO0, Arg0, IO0)
PNP_WRITE_IO(PNP_IO1, Arg0, IO1)
PNP_WRITE_IRQ(PNP_IRQ0, Arg0, IR0)
Store (One, PNP_DEVICE_ACTIVE)
EXIT_CONFIG_MODE ()
#if defined(SUPERIO_KBC_PS2LDN)
Notify (SUPERIO_ID(PS2, SUPERIO_KBC_PS2LDN), 1)
#elif defined(SUPERIO_KBC_PS2M)
Notify (SUPERIO_ID(PS2, SUPERIO_KBC_LDN), 1)
#endif
}
}
#if defined(SUPERIO_KBC_PS2M)
Device (SUPERIO_ID(PS2, SUPERIO_KBC_LDN)) {
Name (_HID, EisaId ("PNP0F13"))
Name (_UID, SUPERIO_UID(PS2, SUPERIO_KBC_LDN))
Method (_STA)
{
Return (^^SUPERIO_ID(KBD, SUPERIO_KBC_LDN)._STA ())
}
Method (_PSC) {
Return (^^SUPERIO_ID(KBD, SUPERIO_KBC_LDN)._PSC ())
}
Method (_CRS, 0, Serialized)
{
Name (CRS, ResourceTemplate () {
IRQNoFlags (IR1) {}
})
ENTER_CONFIG_MODE (SUPERIO_KBC_LDN)
PNP_READ_IRQ(PNP_IRQ1, CRS, IR1)
EXIT_CONFIG_MODE ()
Return (CRS)
}
Name (_PRS, ResourceTemplate ()
{
StartDependentFn (0,0) {
IRQNoFlags () {12}
}
EndDependentFn()
})
Method (_SRS, 1, Serialized)
{
Name (TMPL, ResourceTemplate () {
IRQNoFlags (IR1) {}
})
ENTER_CONFIG_MODE (SUPERIO_KBC_LDN)
PNP_WRITE_IRQ(PNP_IRQ1, Arg0, IR1)
EXIT_CONFIG_MODE ()
}
}
#elif defined(SUPERIO_KBC_PS2LDN)
Device (SUPERIO_ID(PS2, SUPERIO_KBC_PS2LDN)) {
Name (_HID, EisaId ("PNP0F13"))
Name (_UID, SUPERIO_UID(PS2, SUPERIO_KBC_PS2LDN))
Method (_STA)
{
Store (^^SUPERIO_ID(KBD, SUPERIO_KBC_LDN)._STA (), Local0)
If (LEqual (Local0, DEVICE_PRESENT_ACTIVE)) {
PNP_GENERIC_STA(SUPERIO_KBC_PS2LDN)
} Else {
Return (Local0)
}
}
Method (_DIS)
{
ENTER_CONFIG_MODE (SUPERIO_KBC_PS2LDN)
Store (Zero, PNP_DEVICE_ACTIVE)
EXIT_CONFIG_MODE ()
}
Method (_PSC) {
PNP_DEFAULT_PSC
}
Method (_CRS, 0, Serialized)
{
Name (CRS, ResourceTemplate () {
IRQNoFlags (IR1) {}
})
ENTER_CONFIG_MODE (SUPERIO_KBC_PS2LDN)
PNP_READ_IRQ(PNP_IRQ0, CRS, IR1)
EXIT_CONFIG_MODE ()
Return (CRS)
}
Name (_PRS, ResourceTemplate ()
{
StartDependentFn (0,0) {
IRQNoFlags () {12}
}
EndDependentFn()
})
Method (_SRS, 1, Serialized)
{
Name (TMPL, ResourceTemplate () {
IRQNoFlags (IR1) {}
})
ENTER_CONFIG_MODE (SUPERIO_KBC_PS2LDN)
PNP_WRITE_IRQ(PNP_IRQ0, Arg0, IR1)
Store (One, PNP_DEVICE_ACTIVE)
EXIT_CONFIG_MODE ()
}
}
#endif