ec/google: Move plug-n-play initialization to LPC protocol.
"Plug-n-play" is not supported on all platforms using Google's Chrome EC. For example, EC on I2C bus will need explicit configuration and initialization. So move the plug-n-play initialization to the LPC implementation. Verified by building Google/Link (with EC/LPC) successfully. Change-Id: I49e5943503fd5301aa2b2f8c1265f3813719d7e3 Signed-off-by: Hung-Te Lin <hungte@chromium.org> Reviewed-on: http://review.coreboot.org/3089 Tested-by: build bot (Jenkins) Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net> Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
This commit is contained in:
parent
6bfbb33a64
commit
76720d064d
|
@ -21,7 +21,6 @@
|
|||
#include <console/console.h>
|
||||
#include <arch/io.h>
|
||||
#include <delay.h>
|
||||
#include <device/pnp.h>
|
||||
#ifndef __PRE_RAM__
|
||||
#include <elog.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -244,26 +243,20 @@ int google_chromeec_hello(void)
|
|||
|
||||
static int ec_image_type; /* Cached EC image type (ro or rw). */
|
||||
|
||||
static void google_chromeec_init(device_t dev)
|
||||
void google_chromeec_init(void)
|
||||
{
|
||||
struct chromeec_command cec_cmd;
|
||||
struct ec_google_chromeec_config *conf = dev->chip_info;
|
||||
struct ec_response_get_version lpcv_cmd;
|
||||
|
||||
if (!dev->enabled)
|
||||
return;
|
||||
struct ec_response_get_version cec_resp = {{0}};
|
||||
|
||||
printk(BIOS_DEBUG, "Google Chrome EC: Initializing keyboard.\n");
|
||||
pc_keyboard_init(&conf->keyboard);
|
||||
|
||||
google_chromeec_hello();
|
||||
|
||||
memset(&lpcv_cmd, 0, sizeof(lpcv_cmd));
|
||||
cec_cmd.cmd_code = EC_CMD_GET_VERSION;
|
||||
cec_cmd.cmd_version = 0;
|
||||
cec_cmd.cmd_data_out = &lpcv_cmd;
|
||||
cec_cmd.cmd_data_out = &cec_resp;
|
||||
cec_cmd.cmd_size_in = 0;
|
||||
cec_cmd.cmd_size_out = sizeof(lpcv_cmd);
|
||||
cec_cmd.cmd_size_out = sizeof(cec_resp);
|
||||
google_chromeec_command(&cec_cmd);
|
||||
|
||||
if (cec_cmd.cmd_code) {
|
||||
|
@ -271,16 +264,16 @@ static void google_chromeec_init(device_t dev)
|
|||
"Google Chrome EC: version command failed!\n");
|
||||
} else {
|
||||
printk(BIOS_DEBUG, "Google Chrome EC: version:\n");
|
||||
printk(BIOS_DEBUG, " ro: %s\n", lpcv_cmd.version_string_ro);
|
||||
printk(BIOS_DEBUG, " rw: %s\n", lpcv_cmd.version_string_rw);
|
||||
printk(BIOS_DEBUG, " ro: %s\n", cec_resp.version_string_ro);
|
||||
printk(BIOS_DEBUG, " rw: %s\n", cec_resp.version_string_rw);
|
||||
printk(BIOS_DEBUG, " running image: %d\n",
|
||||
lpcv_cmd.current_image);
|
||||
ec_image_type = lpcv_cmd.current_image;
|
||||
cec_resp.current_image);
|
||||
ec_image_type = cec_resp.current_image;
|
||||
}
|
||||
|
||||
if (cec_cmd.cmd_code ||
|
||||
(recovery_mode_enabled() &&
|
||||
(lpcv_cmd.current_image != EC_IMAGE_RO))) {
|
||||
(cec_resp.current_image != EC_IMAGE_RO))) {
|
||||
struct ec_params_reboot_ec reboot_ec;
|
||||
/* Reboot the EC and make it come back in RO mode */
|
||||
reboot_ec.cmd = EC_REBOOT_COLD;
|
||||
|
@ -299,37 +292,6 @@ static void google_chromeec_init(device_t dev)
|
|||
|
||||
}
|
||||
|
||||
static void google_chromeec_read_resources(device_t dev)
|
||||
{
|
||||
/* Nothing, but this function avoids an error on serial console. */
|
||||
}
|
||||
|
||||
static void google_chromeec_enable_resources(device_t dev)
|
||||
{
|
||||
/* Nothing, but this function avoids an error on serial console. */
|
||||
}
|
||||
|
||||
static struct device_operations ops = {
|
||||
.init = google_chromeec_init,
|
||||
.read_resources = google_chromeec_read_resources,
|
||||
.enable_resources = google_chromeec_enable_resources
|
||||
};
|
||||
|
||||
static struct pnp_info pnp_dev_info[] = {
|
||||
{ &ops, 0, 0, { 0, 0 }, }
|
||||
};
|
||||
|
||||
static void enable_dev(device_t dev)
|
||||
{
|
||||
pnp_enable_devices(dev, &pnp_ops, ARRAY_SIZE(pnp_dev_info),
|
||||
pnp_dev_info);
|
||||
}
|
||||
|
||||
struct chip_operations ec_google_chromeec_ops = {
|
||||
CHIP_NAME("Google Chrome EC")
|
||||
.enable_dev = enable_dev,
|
||||
};
|
||||
|
||||
int google_ec_running_ro(void)
|
||||
{
|
||||
return (ec_image_type == EC_IMAGE_RO);
|
||||
|
|
|
@ -30,6 +30,7 @@ int google_chromeec_set_wake_mask(u32 mask);
|
|||
u8 google_chromeec_get_event(void);
|
||||
int google_ec_running_ro(void);
|
||||
u16 google_chromeec_get_board_version(void);
|
||||
void google_chromeec_init(void);
|
||||
#endif
|
||||
|
||||
uint8_t google_chromeec_calc_checksum(const uint8_t *data, int size);
|
||||
|
|
|
@ -18,9 +18,13 @@
|
|||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <console/console.h>
|
||||
#include <arch/io.h>
|
||||
#include <delay.h>
|
||||
#include <device/pnp.h>
|
||||
#include "chip.h"
|
||||
#include "ec.h"
|
||||
#include "ec_commands.h"
|
||||
|
||||
|
@ -180,6 +184,51 @@ int google_chromeec_command(struct chromeec_command *cec_command)
|
|||
}
|
||||
|
||||
#ifndef __PRE_RAM__
|
||||
|
||||
#ifndef __SMM__
|
||||
static void lpc_ec_init(device_t dev)
|
||||
{
|
||||
struct ec_google_chromeec_config *conf = dev->chip_info;
|
||||
|
||||
if (!dev->enabled)
|
||||
return;
|
||||
pc_keyboard_init(&conf->keyboard);
|
||||
google_chromeec_init();
|
||||
}
|
||||
|
||||
static void lpc_ec_read_resources(device_t dev)
|
||||
{
|
||||
/* Nothing, but this function avoids an error on serial console. */
|
||||
}
|
||||
|
||||
static void lpc_ec_enable_resources(device_t dev)
|
||||
{
|
||||
/* Nothing, but this function avoids an error on serial console. */
|
||||
}
|
||||
|
||||
static struct device_operations ops = {
|
||||
.init = lpc_ec_init,
|
||||
.read_resources = lpc_ec_read_resources,
|
||||
.enable_resources = lpc_ec_enable_resources
|
||||
};
|
||||
|
||||
static struct pnp_info pnp_dev_info[] = {
|
||||
{ &ops, 0, 0, { 0, 0 }, }
|
||||
};
|
||||
|
||||
static void enable_dev(device_t dev)
|
||||
{
|
||||
pnp_enable_devices(dev, &pnp_ops, ARRAY_SIZE(pnp_dev_info),
|
||||
pnp_dev_info);
|
||||
}
|
||||
|
||||
struct chip_operations ec_google_chromeec_ops = {
|
||||
CHIP_NAME("Google Chrome EC")
|
||||
.enable_dev = enable_dev,
|
||||
};
|
||||
|
||||
#endif /* __SMM__ */
|
||||
|
||||
u8 google_chromeec_get_event(void)
|
||||
{
|
||||
if (google_chromeec_wait_ready(EC_LPC_ADDR_ACPI_CMD)) {
|
||||
|
|
Loading…
Reference in New Issue