Enable or disable the power button in Kconfig

Some mainboards need to disable the power button to avoid turning off
right after being turned on, while other boards ship with a jumper over
the power button and should allow the user to configure the behavior.

This adds infrastructure in the form of four mutually exclusive options
which can be selected in a mainboard Kconfig (power button forced on/off,
and user-controllable with default on/off) and one result bool which
source code can test. (Enable the button or not.)

The options have been implemented in CS5536 code and for all mainboards
which select SOUTHBRIDGE_AMD_CS5536, but should be used also by other
chipsets where applicable. Note that if chipset code uses the result
bool ENABLE_POWER_BUTTON, then every board using that chipset must
select one out of the four control options in order to build.

All touched boards should have unchanged behavior, except
pcengines/alix1c, traverse/geos and lippert/hurricane-lx where the
power button can now be configured by the user.

Build tested for alix1c, alix2d, hurricane-lx and wyse-s50. Confirmed
to work as advertised on alix1c both with button enabled and disabled.

Includes additional traverse/geos changes from Nathan and
lippert/hurricane-lx changes from Jens to correctly use the new
feature on those boards.

Signed-off-by: Peter Stuge <peter@stuge.se>
Acked-by: Aurelien Guillaume <aurelien@iwi.me>
Acked-by: Nils Jacobs <njacobs8@hetnet.nl>


git-svn-id: svn://svn.coreboot.org/coreboot/trunk@5948 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
Peter Stuge 2010-10-13 06:23:02 +00:00
parent f2573bd237
commit 51eafdeae6
21 changed files with 83 additions and 18 deletions

View File

@ -736,4 +736,43 @@ config ID_SECTION_OFFSET
hex
default 0x10
# The four POWER_BUTTON_DEFAULT_ENABLE, POWER_BUTTON_DEFAULT_DISABLE,
# POWER_BUTTON_FORCE_ENABLE and POWER_BUTTON_FORCE_DISABLE options are
# mutually exclusive. One of these options must be selected in the
# mainboard Kconfig if the chipset supports enabling and disabling of
# the power button. Chipset code uses the ENABLE_POWER_BUTTON option set
# in mainboard/Kconfig to know if the button should be enabled or not.
config POWER_BUTTON_DEFAULT_ENABLE
def_bool n
help
Select when the board has a power button which can optionally be
disabled by the user.
config POWER_BUTTON_DEFAULT_DISABLE
def_bool n
help
Select when the board has a power button which can optionally be
enabled by the user, e.g. when the board ships with a jumper over
the power switch contacts.
config POWER_BUTTON_FORCE_ENABLE
def_bool n
help
Select when the board requires that the power button is always
enabled.
config POWER_BUTTON_FORCE_DISABLE
def_bool n
help
Select when the board requires that the power button is always
disabled, e.g. when it has been hardwired to ground.
config POWER_BUTTON_IS_OPTIONAL
bool
default y if POWER_BUTTON_DEFAULT_ENABLE || POWER_BUTTON_DEFAULT_DISABLE
default n if !(POWER_BUTTON_DEFAULT_ENABLE || POWER_BUTTON_DEFAULT_DISABLE)
help
Internal option that controls ENABLE_POWER_BUTTON visibility.
source src/Kconfig.deprecated_options

View File

@ -247,4 +247,22 @@ config ROM_SIZE
default 0x200000 if COREBOOT_ROMSIZE_KB_2048
default 0x400000 if COREBOOT_ROMSIZE_KB_4096
config ENABLE_POWER_BUTTON
bool "Enable the power button" if POWER_BUTTON_IS_OPTIONAL
default y if POWER_BUTTON_DEFAULT_ENABLE
default n if POWER_BUTTON_DEFAULT_DISABLE
help
The selected mainboard can optionally have the power button tied
to ground with a jumper so that the button appears to be
constantly depressed. If this option is enabled and the jumper is
installed then the board will turn on, but turn off again after a
short timeout, usually 4 seconds.
Select Y here if you have removed the jumper and want to use an
actual power button. Select N if you have the jumper installed.
config ENABLE_POWER_BUTTON
def_bool y if !POWER_BUTTON_IS_OPTIONAL && POWER_BUTTON_FORCE_ENABLE
def_bool n if !POWER_BUTTON_IS_OPTIONAL && POWER_BUTTON_FORCE_DISABLE
endmenu

View File

@ -11,6 +11,7 @@ config BOARD_SPECIFIC_OPTIONS # dummy
select PIRQ_ROUTE
select UDELAY_TSC
select BOARD_ROMSIZE_KB_256
select POWER_BUTTON_FORCE_ENABLE
config MAINBOARD_DIR
string

View File

@ -10,6 +10,7 @@ config BOARD_SPECIFIC_OPTIONS # dummy
select PIRQ_ROUTE
select UDELAY_TSC
select BOARD_ROMSIZE_KB_256
select POWER_BUTTON_FORCE_ENABLE
config MAINBOARD_DIR
string

View File

@ -27,6 +27,7 @@ config BOARD_SPECIFIC_OPTIONS # dummy
select UDELAY_TSC
select HAVE_PIRQ_TABLE
select BOARD_ROMSIZE_KB_256
select POWER_BUTTON_FORCE_ENABLE
config MAINBOARD_DIR
string

View File

@ -10,6 +10,7 @@ config BOARD_SPECIFIC_OPTIONS # dummy
select PIRQ_ROUTE
select UDELAY_TSC
select BOARD_ROMSIZE_KB_256
select POWER_BUTTON_FORCE_DISABLE
config MAINBOARD_DIR
string

View File

@ -11,6 +11,7 @@ config BOARD_SPECIFIC_OPTIONS # dummy
select PIRQ_ROUTE
select UDELAY_TSC
select BOARD_ROMSIZE_KB_256
select POWER_BUTTON_FORCE_ENABLE
config MAINBOARD_DIR
string

View File

@ -10,6 +10,7 @@ config BOARD_SPECIFIC_OPTIONS # dummy
select HAVE_PIRQ_TABLE
select PIRQ_ROUTE
select BOARD_ROMSIZE_KB_256
select POWER_BUTTON_FORCE_ENABLE
config MAINBOARD_DIR
string

View File

@ -29,11 +29,20 @@ config IRQ_SLOT_COUNT
config BOARD_OLD_REVISION
bool "Board is old pre-3.0 revision"
default n
select POWER_BUTTON_DEFAULT_DISABLE
help
Look on the bottom side for a number like 406-0001-30. The last 2
digits state the PCB revision (3.0 in this example). For 2.0 or older
boards choose Y, for 3.0 and newer say N.
Old revision boards need a jumper shorting the power button to
power on automatically. You may enable the button only after this
jumper has been removed. New revision boards are not restricted
in this way, and always have the power button enabled.
config POWER_BUTTON_FORCE_ENABLE
def_bool y if !BOARD_OLD_REVISION
config ONBOARD_UARTS_RS485
bool "Switch on-board serial ports to RS485"
default n

View File

@ -147,14 +147,7 @@ void main(unsigned long bist)
cpuRegInit(0, DIMM0, DIMM1, DRAM_TERMINATED);
#if CONFIG_BOARD_OLD_REVISION
/*
* Old revision boards need a jumper shorting the power button to power
* on automatically. So we must disable the button's fail-safe function,
* or the board will shut down after 4 s.
*/
outl(0, PMS_IO_BASE + PM_FSD); // Fail-Save Delay register
#else
#if !CONFIG_BOARD_OLD_REVISION
int err;
/* bit0 = Spread Spectrum */
if ((err = smc_send_config(SMC_CONFIG))) {

View File

@ -14,6 +14,7 @@ config BOARD_SPECIFIC_OPTIONS # dummy
# Board is equipped with a 1 MB SPI flash, however, due to limitations
# of the IT8712F Super I/O, only the top 512 KB are directly mapped.
select BOARD_ROMSIZE_KB_512
select POWER_BUTTON_FORCE_ENABLE
config MAINBOARD_DIR
string

View File

@ -13,6 +13,7 @@ config BOARD_SPECIFIC_OPTIONS # dummy
# Standard chip is a 512 KB FWH. Replacing it with a 1 MB
# SST 49LF008A is possible.
select BOARD_ROMSIZE_KB_512
select POWER_BUTTON_FORCE_ENABLE
config MAINBOARD_DIR
string

View File

@ -14,6 +14,7 @@ config BOARD_SPECIFIC_OPTIONS # dummy
# Board is equipped with a 1 MB SPI flash, however, due to limitations
# of the IT8712F Super I/O, only the top 512 KB are directly mapped.
select BOARD_ROMSIZE_KB_512
select POWER_BUTTON_FORCE_ENABLE
config MAINBOARD_DIR
string

View File

@ -11,6 +11,7 @@ config BOARD_SPECIFIC_OPTIONS # dummy
select PIRQ_ROUTE
select UDELAY_TSC
select BOARD_ROMSIZE_KB_512
select POWER_BUTTON_DEFAULT_DISABLE
config MAINBOARD_DIR
string

View File

@ -10,6 +10,7 @@ config BOARD_SPECIFIC_OPTIONS # dummy
select PIRQ_ROUTE
select UDELAY_TSC
select BOARD_ROMSIZE_KB_512
select POWER_BUTTON_FORCE_DISABLE
config MAINBOARD_DIR
string

View File

@ -119,12 +119,6 @@ static u8 spd_read_byte(u8 device, u8 address)
/** Early mainboard specific GPIO setup. */
static void mb_gpio_init(void)
{
/*
* Disable power button, since it is hardwired to ground on this board,
* and the power would be cut off atfer a 4-second delay otherwise.
*/
outl(0x00020000, PMS_IO_BASE + 0x40);
/*
* Enable LEDs GPIO outputs to light up the leds
* This is how the original tinyBIOS sets them after boot.

View File

@ -10,6 +10,7 @@ config BOARD_SPECIFIC_OPTIONS # dummy
select PIRQ_ROUTE
select UDELAY_TSC
select BOARD_ROMSIZE_KB_1024
select POWER_BUTTON_DEFAULT_DISABLE
config MAINBOARD_DIR
string

View File

@ -11,6 +11,7 @@ config BOARD_SPECIFIC_OPTIONS # dummy
select PIRQ_ROUTE
select UDELAY_TSC
select BOARD_ROMSIZE_KB_512
select POWER_BUTTON_FORCE_ENABLE
config MAINBOARD_DIR
string

View File

@ -28,6 +28,7 @@ config BOARD_SPECIFIC_OPTIONS # dummy
select HAVE_PIRQ_TABLE
select PIRQ_ROUTE
select BOARD_ROMSIZE_KB_256
select POWER_BUTTON_FORCE_DISABLE
config MAINBOARD_DIR
string

View File

@ -134,9 +134,6 @@ void main(unsigned long bist)
cs5536_early_setup();
/* disable the power button */
outl(0x00, PMS_IO_BASE + 0x40);
/* cs5536_disable_internal_uart disable them. Set them up now... */
cs5536_setup_onchipuart(1);

View File

@ -92,8 +92,9 @@ static void cs5536_setup_iobase(void)
static void cs5536_setup_power_button(void)
{
/* Power Button Setup */
#if CONFIG_ENABLE_POWER_BUTTON
outl(0x40020000, PMS_IO_BASE + 0x40);
#endif
/* setup WORK_AUX/GPIO24, it is the external signal for 5536
* vsb_work_aux controls all voltage rails except Vstandby & Vmem.