summaryrefslogtreecommitdiff
path: root/common/device_state.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/device_state.c')
-rw-r--r--common/device_state.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/common/device_state.c b/common/device_state.c
index 2b3f969d4c..650e2671ef 100644
--- a/common/device_state.c
+++ b/common/device_state.c
@@ -3,9 +3,12 @@
* found in the LICENSE file.
*/
+#include "console.h"
#include "device_state.h"
#include "hooks.h"
+static int enabled = 1;
+
int device_get_state(enum device_type device)
{
return device_states[device].state;
@@ -23,7 +26,80 @@ static void check_device_state(void)
{
int i;
+ if (!enabled)
+ return;
+
for (i = 0; i < DEVICE_COUNT; i++)
board_update_device_state(i);
}
DECLARE_HOOK(HOOK_SECOND, check_device_state, HOOK_PRIO_DEFAULT);
+
+static int device_has_interrupts(enum device_type device)
+{
+ return (device_states[device].deferred &&
+ device_states[device].detect_on != GPIO_COUNT &&
+ device_states[device].detect_off != GPIO_COUNT);
+}
+
+static void disable_interrupts(enum device_type device)
+{
+ if (!device_has_interrupts(device))
+ return;
+
+ /* Cancel any deferred callbacks */
+ hook_call_deferred(device_states[device].deferred, -1);
+
+ /* Disable gpio interrupts */
+ gpio_disable_interrupt(device_states[device].detect_on);
+ gpio_disable_interrupt(device_states[device].detect_off);
+}
+
+static void enable_interrupts(enum device_type device)
+{
+ if (!device_has_interrupts(device))
+ return;
+
+ /* Enable gpio interrupts */
+ gpio_enable_interrupt(device_states[device].detect_on);
+ gpio_enable_interrupt(device_states[device].detect_off);
+}
+
+void device_detect_state_enable(int enable)
+{
+ int i;
+
+ enabled = enable;
+ for (i = 0; i < DEVICE_COUNT; i++) {
+ if (enabled) {
+ enable_interrupts(i);
+ board_update_device_state(i);
+ } else {
+ disable_interrupts(i);
+ device_set_state(i, DEVICE_STATE_UNKNOWN);
+ }
+ }
+}
+
+static void print_state(const char *name, enum device_state state)
+{
+ ccprintf("%-9s %s\n", name, state == DEVICE_STATE_ON ? "on" :
+ state == DEVICE_STATE_OFF ? "off" : "unknown");
+}
+
+static int command_devices(int argc, char **argv)
+{
+ int i;
+
+ if (!enabled)
+ ccprintf("Device monitoring disabled\n");
+ else
+ for (i = 0; i < DEVICE_COUNT; i++)
+ print_state(device_states[i].name,
+ device_states[i].state);
+
+ return EC_SUCCESS;
+}
+DECLARE_CONSOLE_COMMAND(devices, command_devices,
+ "",
+ "Get the device states",
+ NULL);