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:
Hung-Te Lin 2013-04-15 18:06:32 +08:00 committed by Stefan Reinauer
parent 6bfbb33a64
commit 76720d064d
3 changed files with 59 additions and 47 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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)) {