summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHung-Te Lin <hungte@chromium.org>2013-04-15 18:06:32 +0800
committerStefan Reinauer <stefan.reinauer@coreboot.org>2013-04-16 01:07:16 +0200
commit76720d064da18d67c1be53ab4c0b2af6f1fcfd06 (patch)
treeda0759975b3a071dfcbd00f155495d4bb0dd9c37
parent6bfbb33a64f95bcfdf46f8a35c342177886bb594 (diff)
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>
-rw-r--r--src/ec/google/chromeec/ec.c56
-rw-r--r--src/ec/google/chromeec/ec.h1
-rw-r--r--src/ec/google/chromeec/ec_lpc.c49
3 files changed, 59 insertions, 47 deletions
diff --git a/src/ec/google/chromeec/ec.c b/src/ec/google/chromeec/ec.c
index e068bed6dc..d94338fa18 100644
--- a/src/ec/google/chromeec/ec.c
+++ b/src/ec/google/chromeec/ec.c
@@ -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);
diff --git a/src/ec/google/chromeec/ec.h b/src/ec/google/chromeec/ec.h
index a4c196056f..3eb555c103 100644
--- a/src/ec/google/chromeec/ec.h
+++ b/src/ec/google/chromeec/ec.h
@@ -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);
diff --git a/src/ec/google/chromeec/ec_lpc.c b/src/ec/google/chromeec/ec_lpc.c
index 6443592532..4e8d3fbb77 100644
--- a/src/ec/google/chromeec/ec_lpc.c
+++ b/src/ec/google/chromeec/ec_lpc.c
@@ -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)) {