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 <console/console.h>
|
||||||
#include <arch/io.h>
|
#include <arch/io.h>
|
||||||
#include <delay.h>
|
#include <delay.h>
|
||||||
#include <device/pnp.h>
|
|
||||||
#ifndef __PRE_RAM__
|
#ifndef __PRE_RAM__
|
||||||
#include <elog.h>
|
#include <elog.h>
|
||||||
#include <stdlib.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 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 chromeec_command cec_cmd;
|
||||||
struct ec_google_chromeec_config *conf = dev->chip_info;
|
struct ec_response_get_version cec_resp = {{0}};
|
||||||
struct ec_response_get_version lpcv_cmd;
|
|
||||||
|
|
||||||
if (!dev->enabled)
|
|
||||||
return;
|
|
||||||
|
|
||||||
printk(BIOS_DEBUG, "Google Chrome EC: Initializing keyboard.\n");
|
printk(BIOS_DEBUG, "Google Chrome EC: Initializing keyboard.\n");
|
||||||
pc_keyboard_init(&conf->keyboard);
|
|
||||||
|
|
||||||
google_chromeec_hello();
|
google_chromeec_hello();
|
||||||
|
|
||||||
memset(&lpcv_cmd, 0, sizeof(lpcv_cmd));
|
|
||||||
cec_cmd.cmd_code = EC_CMD_GET_VERSION;
|
cec_cmd.cmd_code = EC_CMD_GET_VERSION;
|
||||||
cec_cmd.cmd_version = 0;
|
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_in = 0;
|
||||||
cec_cmd.cmd_size_out = sizeof(lpcv_cmd);
|
cec_cmd.cmd_size_out = sizeof(cec_resp);
|
||||||
google_chromeec_command(&cec_cmd);
|
google_chromeec_command(&cec_cmd);
|
||||||
|
|
||||||
if (cec_cmd.cmd_code) {
|
if (cec_cmd.cmd_code) {
|
||||||
@ -271,16 +264,16 @@ static void google_chromeec_init(device_t dev)
|
|||||||
"Google Chrome EC: version command failed!\n");
|
"Google Chrome EC: version command failed!\n");
|
||||||
} else {
|
} else {
|
||||||
printk(BIOS_DEBUG, "Google Chrome EC: version:\n");
|
printk(BIOS_DEBUG, "Google Chrome EC: version:\n");
|
||||||
printk(BIOS_DEBUG, " ro: %s\n", lpcv_cmd.version_string_ro);
|
printk(BIOS_DEBUG, " ro: %s\n", cec_resp.version_string_ro);
|
||||||
printk(BIOS_DEBUG, " rw: %s\n", lpcv_cmd.version_string_rw);
|
printk(BIOS_DEBUG, " rw: %s\n", cec_resp.version_string_rw);
|
||||||
printk(BIOS_DEBUG, " running image: %d\n",
|
printk(BIOS_DEBUG, " running image: %d\n",
|
||||||
lpcv_cmd.current_image);
|
cec_resp.current_image);
|
||||||
ec_image_type = lpcv_cmd.current_image;
|
ec_image_type = cec_resp.current_image;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cec_cmd.cmd_code ||
|
if (cec_cmd.cmd_code ||
|
||||||
(recovery_mode_enabled() &&
|
(recovery_mode_enabled() &&
|
||||||
(lpcv_cmd.current_image != EC_IMAGE_RO))) {
|
(cec_resp.current_image != EC_IMAGE_RO))) {
|
||||||
struct ec_params_reboot_ec reboot_ec;
|
struct ec_params_reboot_ec reboot_ec;
|
||||||
/* Reboot the EC and make it come back in RO mode */
|
/* Reboot the EC and make it come back in RO mode */
|
||||||
reboot_ec.cmd = EC_REBOOT_COLD;
|
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)
|
int google_ec_running_ro(void)
|
||||||
{
|
{
|
||||||
return (ec_image_type == EC_IMAGE_RO);
|
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);
|
u8 google_chromeec_get_event(void);
|
||||||
int google_ec_running_ro(void);
|
int google_ec_running_ro(void);
|
||||||
u16 google_chromeec_get_board_version(void);
|
u16 google_chromeec_get_board_version(void);
|
||||||
|
void google_chromeec_init(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint8_t google_chromeec_calc_checksum(const uint8_t *data, int size);
|
uint8_t google_chromeec_calc_checksum(const uint8_t *data, int size);
|
||||||
|
@ -18,9 +18,13 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include <console/console.h>
|
#include <console/console.h>
|
||||||
#include <arch/io.h>
|
#include <arch/io.h>
|
||||||
#include <delay.h>
|
#include <delay.h>
|
||||||
|
#include <device/pnp.h>
|
||||||
|
#include "chip.h"
|
||||||
#include "ec.h"
|
#include "ec.h"
|
||||||
#include "ec_commands.h"
|
#include "ec_commands.h"
|
||||||
|
|
||||||
@ -180,6 +184,51 @@ int google_chromeec_command(struct chromeec_command *cec_command)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifndef __PRE_RAM__
|
#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)
|
u8 google_chromeec_get_event(void)
|
||||||
{
|
{
|
||||||
if (google_chromeec_wait_ready(EC_LPC_ADDR_ACPI_CMD)) {
|
if (google_chromeec_wait_ready(EC_LPC_ADDR_ACPI_CMD)) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user