mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2026-01-05 14:31:31 +00:00
When cr50 is not trying to do ccd, we dont need to monitor the devices. Disable device state detection interrupts and the AP and EC UARTs. BUG=none BRANCH=none TEST=gru and kevin monitor devices correctly when ccd is enabled, and dont monitor anything when it is disabled. Change-Id: Ic3f5974320486ff6dd0147c490a1c294cc2f6a76 Signed-off-by: Mary Ruthven <mruthven@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/356770 Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
106 lines
2.3 KiB
C
106 lines
2.3 KiB
C
/* Copyright 2016 The Chromium OS Authors. All rights reserved.
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* 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;
|
|
}
|
|
|
|
void device_set_state(enum device_type device, enum device_state state)
|
|
{
|
|
if (device_states[device].state == state)
|
|
return;
|
|
|
|
device_states[device].state = state;
|
|
}
|
|
|
|
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);
|