ec/lenovo/h8: Add function to query sense state
* Add function to wait for sense registers to become valid. * Add function to retrieve Fn-Key state. Tested on Lenovo T500: * It takes about 700msec for the registers to become valid. Tested on Lenovo T520: * It takes less than 150msec for the registers to become valid. Change-Id: Ie27e2881a256c4efb3def11f05070c446db6e5fc Signed-off-by: Patrick Rudolph <siro@das-labor.org> Reviewed-on: https://review.coreboot.org/c/coreboot/+/29204 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Philipp Deppenwiese <zaolin.daisuki@gmail.com> Reviewed-by: Nico Huber <nico.h@gmx.de>
This commit is contained in:
parent
1d3b3c3c09
commit
2dc00fab7c
|
@ -1,5 +1,12 @@
|
|||
ifeq ($(CONFIG_EC_LENOVO_H8),y)
|
||||
|
||||
ramstage-y += sense.c
|
||||
verstage-y += sense.c
|
||||
romstage-y += sense.c
|
||||
bootblock-y += sense.c
|
||||
postcar-y += sense.c
|
||||
smm-y += sense.c
|
||||
|
||||
ifneq ($(filter y,$(CONFIG_H8_BEEP_ON_DEATH) $(CONFIG_H8_FLASH_LEDS_ON_DEATH)),)
|
||||
romstage-y += panic.c
|
||||
ramstage-y += panic.c
|
||||
|
|
|
@ -38,6 +38,9 @@ void h8_usb_always_on(void);
|
|||
|
||||
void h8_mainboard_init_dock (void);
|
||||
|
||||
int h8_get_fn_key(void);
|
||||
int h8_get_sense_ready(void);
|
||||
|
||||
void h8_bluetooth_enable(int on);
|
||||
bool h8_bluetooth_nv_enable(void);
|
||||
bool h8_has_bdc(struct device *dev);
|
||||
|
@ -135,8 +138,10 @@ void h8_ssdt_generator(struct device *dev);
|
|||
#define H8_EVENT_FN_PRESS 0x39
|
||||
|
||||
#define H8_STATUS0 0x46
|
||||
#define H8_STATUS0_FN_KEY_DOWN 0x01
|
||||
#define H8_STATUS1 0x47
|
||||
#define H8_STATUS2 0x48
|
||||
#define H8_STATUS3 0x49
|
||||
|
||||
#define H8_EVENT_BAT0 0x4a
|
||||
#define H8_EVENT_BAT0_STATE 0x4b
|
||||
|
|
|
@ -0,0 +1,54 @@
|
|||
/*
|
||||
* This file is part of the coreboot project.
|
||||
*
|
||||
* Copyright (C) 2018 Patrick Rudolph <siro@das-labor.org>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <ec/acpi/ec.h>
|
||||
|
||||
#include "h8.h"
|
||||
|
||||
/**
|
||||
* Return the EC sense status register state.
|
||||
*
|
||||
* Observations showed the sense registers are all zero until the EC populates
|
||||
* them after some time. Likely the EC sets all bits to it's valid state at
|
||||
* once, but there's no prove as the firmware isn't available.
|
||||
*
|
||||
* Wait for any register having at least one bit set.
|
||||
* Unlikely that all register will be zero after booting has finished.
|
||||
*
|
||||
* @return 1 if the EC provides valid data in sense status registers
|
||||
*/
|
||||
int h8_get_sense_ready(void)
|
||||
{
|
||||
static const u8 regs[] = { H8_STATUS0, H8_STATUS1, H8_STATUS2,
|
||||
H8_STATUS3};
|
||||
|
||||
for (size_t i = 0; i < ARRAY_SIZE(regs); i++) {
|
||||
if (ec_read(regs[i]))
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the state of Fn key.
|
||||
* Only valid if h8_get_sense_ready (see above) returns true.
|
||||
*
|
||||
* @return 1 if the key is pressed.
|
||||
*/
|
||||
int h8_get_fn_key(void)
|
||||
{
|
||||
return ec_read(H8_STATUS0) & H8_STATUS0_FN_KEY_DOWN;
|
||||
}
|
Loading…
Reference in New Issue