summaryrefslogtreecommitdiff
path: root/chip/lm4
diff options
context:
space:
mode:
authorFurquan Shaikh <furquan@chromium.org>2017-10-09 22:02:22 -0700
committerchrome-bot <chrome-bot@chromium.org>2017-10-17 23:14:19 -0700
commitb9e07ce1bfa42ea2a5e7564575b0072c13811c31 (patch)
tree16e69783b0b8e1825c88a2753912949dc9ef7ef8 /chip/lm4
parent501fba17a93c5a08afd4bdaeb9c632712557c362 (diff)
downloadchrome-ec-b9e07ce1bfa42ea2a5e7564575b0072c13811c31.tar.gz
host_event: Move host events and mask handling into common code
Instead of duplicating the handling of host events and host event masks in chip lpc drivers, add routines in common code to provide basic functions like setting/getting of masks, setting/getting of events and handling of masks transitions across sysjump. BUG=None BRANCH=None TEST=make -j buildall. Verified following: 1. Event masks are correctly retained across sysjumps. 2. Wake from S3 works fine. 3. Wake from S0ix works fine. 4. SCI generated correctly. Change-Id: Ie409f91b12788e4b902b2627e31ba5ce40ff1d27 Signed-off-by: Furquan Shaikh <furquan@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/707771 Reviewed-by: Shawn N <shawnn@chromium.org>
Diffstat (limited to 'chip/lm4')
-rw-r--r--chip/lm4/lpc.c110
1 files changed, 17 insertions, 93 deletions
diff --git a/chip/lm4/lpc.c b/chip/lm4/lpc.c
index 4da0f8e1f8..c374fb686e 100644
--- a/chip/lm4/lpc.c
+++ b/chip/lm4/lpc.c
@@ -54,10 +54,6 @@
#define CPUTS(outstr) cputs(CC_LPC, outstr)
#define CPRINTS(format, args...) cprints(CC_LPC, format, ## args)
-#define LPC_SYSJUMP_TAG 0x4c50 /* "LP" */
-
-static uint32_t host_events; /* Currently pending SCI/SMI events */
-static uint32_t event_mask[3]; /* Event masks for each type */
static struct host_packet lpc_packet;
static struct host_cmd_handler_args host_cmd_args;
static uint8_t host_cmd_flags; /* Flags from host command */
@@ -153,6 +149,8 @@ static inline void keyboard_irq_assert(void)
*/
static void lpc_generate_smi(void)
{
+ uint32_t smi;
+
/* Enforce signal-high for long enough to debounce high */
gpio_set_level(GPIO_PCH_SMI_L, 1);
udelay(65);
@@ -162,9 +160,9 @@ static void lpc_generate_smi(void)
/* Set signal high, now that we've generated the edge */
gpio_set_level(GPIO_PCH_SMI_L, 1);
- if (host_events & event_mask[LPC_HOST_EVENT_SMI])
- CPRINTS("smi 0x%08x",
- host_events & event_mask[LPC_HOST_EVENT_SMI]);
+ smi = lpc_get_host_events_by_type(LPC_HOST_EVENT_SMI);
+ if (smi)
+ CPRINTS("smi 0x%08x", smi);
}
/**
@@ -172,6 +170,8 @@ static void lpc_generate_smi(void)
*/
static void lpc_generate_sci(void)
{
+ uint32_t sci;
+
#ifdef CONFIG_SCI_GPIO
/* Enforce signal-high for long enough to debounce high */
gpio_set_level(CONFIG_SCI_GPIO, 1);
@@ -185,9 +185,9 @@ static void lpc_generate_sci(void)
LM4_LPC_LPCCTL |= LM4_LPC_SCI_START;
#endif
- if (host_events & event_mask[LPC_HOST_EVENT_SCI])
- CPRINTS("sci 0x%08x",
- host_events & event_mask[LPC_HOST_EVENT_SCI]);
+ sci = lpc_get_host_events_by_type(LPC_HOST_EVENT_SCI);
+ if (sci)
+ CPRINTS("sci 0x%08x", sci);
}
/**
@@ -341,7 +341,7 @@ void lpc_comx_put_char(int c)
* - SMI pulse via EC_SMI_L GPIO
* - SCI pulse via LPC0SCI
*/
-static void update_host_event_status(void)
+void lpc_update_host_event_status(void)
{
int need_sci = 0;
int need_smi = 0;
@@ -352,7 +352,7 @@ static void update_host_event_status(void)
/* Disable LPC interrupt while updating status register */
task_disable_irq(LM4_IRQ_LPC);
- if (host_events & event_mask[LPC_HOST_EVENT_SMI]) {
+ if (lpc_get_host_events_by_type(LPC_HOST_EVENT_SMI)) {
/* Only generate SMI for first event */
if (!(LM4_LPC_ST(LPC_CH_ACPI) & LM4_LPC_ST_SMI))
need_smi = 1;
@@ -360,7 +360,7 @@ static void update_host_event_status(void)
} else
LM4_LPC_ST(LPC_CH_ACPI) &= ~LM4_LPC_ST_SMI;
- if (host_events & event_mask[LPC_HOST_EVENT_SCI]) {
+ if (lpc_get_host_events_by_type(LPC_HOST_EVENT_SCI)) {
/* Generate SCI for every event */
need_sci = 1;
LM4_LPC_ST(LPC_CH_ACPI) |= LM4_LPC_ST_SCI;
@@ -368,12 +368,13 @@ static void update_host_event_status(void)
LM4_LPC_ST(LPC_CH_ACPI) &= ~LM4_LPC_ST_SCI;
/* Copy host events to mapped memory */
- *(uint32_t *)host_get_memmap(EC_MEMMAP_HOST_EVENTS) = host_events;
+ *(uint32_t *)host_get_memmap(EC_MEMMAP_HOST_EVENTS) =
+ lpc_get_host_events();
task_enable_irq(LM4_IRQ_LPC);
/* Process the wake events. */
- lpc_update_wake(host_events & event_mask[LPC_HOST_EVENT_WAKE]);
+ lpc_update_wake(lpc_get_host_events_by_type(LPC_HOST_EVENT_WAKE));
/* Send pulse on SMI signal if needed */
if (need_smi)
@@ -384,54 +385,6 @@ static void update_host_event_status(void)
lpc_generate_sci();
}
-void lpc_set_host_event_state(uint32_t mask)
-{
- if (mask != host_events) {
- host_events = mask;
- update_host_event_status();
- }
-}
-
-int lpc_query_host_event_state(void)
-{
- const uint32_t any_mask = event_mask[0] | event_mask[1] | event_mask[2];
- int evt_index = 0;
- int i;
-
- for (i = 0; i < 32; i++) {
- const uint32_t e = (1 << i);
-
- if (host_events & e) {
- host_clear_events(e);
-
- /*
- * If host hasn't unmasked this event, drop it. We do
- * this at query time rather than event generation time
- * so that the host has a chance to unmask events
- * before they're dropped by a query.
- */
- if (!(e & any_mask))
- continue;
-
- evt_index = i + 1; /* Events are 1-based */
- break;
- }
- }
-
- return evt_index;
-}
-
-void lpc_set_host_event_mask(enum lpc_host_event_type type, uint32_t mask)
-{
- event_mask[type] = mask;
- update_host_event_status();
-}
-
-uint32_t lpc_get_host_event_mask(enum lpc_host_event_type type)
-{
- return event_mask[type];
-}
-
void lpc_set_acpi_status_mask(uint8_t mask)
{
uint32_t set_mask = 0;
@@ -667,32 +620,6 @@ void lpc_interrupt(void)
}
DECLARE_IRQ(LM4_IRQ_LPC, lpc_interrupt, 2);
-/**
- * Preserve event masks across a sysjump.
- */
-static void lpc_sysjump(void)
-{
- system_add_jump_tag(LPC_SYSJUMP_TAG, 1,
- sizeof(event_mask), event_mask);
-}
-DECLARE_HOOK(HOOK_SYSJUMP, lpc_sysjump, HOOK_PRIO_DEFAULT);
-
-/**
- * Restore event masks after a sysjump.
- */
-static void lpc_post_sysjump(void)
-{
- const uint32_t *prev_mask;
- int size, version;
-
- prev_mask = (const uint32_t *)system_get_jump_tag(LPC_SYSJUMP_TAG,
- &version, &size);
- if (!prev_mask || version != 1 || size != sizeof(event_mask))
- return;
-
- memcpy(event_mask, prev_mask, sizeof(event_mask));
-}
-
/* Enable LPC ACPI-EC interrupts */
void lpc_enable_acpi_interrupts(void)
{
@@ -862,14 +789,11 @@ static void lpc_init(void)
uart_comx_enable();
#endif
- /* Restore event masks if needed */
- lpc_post_sysjump();
-
/* Sufficiently initialized */
init_done = 1;
/* Update host events now that we can copy them to memmap */
- update_host_event_status();
+ lpc_update_host_event_status();
}
/*
* Set prio to higher than default; this way LPC memory mapped data is ready