mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2026-01-06 23:51:28 +00:00
If the ALS is not enabled in S3/S5 states then it will generate errors when trying to read so should be gated. This could be done with a check for chipset_state or adding a new CONFIG_ALS_POWER_GPIO to check. However the ALS is also not needed when the host is in S3/S5 yet the task continues to run in the background every 1 second. This commit adds a new task enable/disable hook to disable the task when the system is suspended and enable the task when it is resumed. In order to fit this new task in glados the als console command is guarded by a new config option. Since this is not a very frequently used/needed console command it is disabled by default. And finally the kunimitsu and strago boards try to enable ALS but they never actually enabled the ALS task so this new code was failing to build because TASK_ID_ALS did not exist. Also samus was enabling it but as TASK_NOTEST so tests will fail, though they are disabled globally on samus. BUG=chrome-os-partner:43493 BRANCH=none TEST=enable ALS on glados and successfully build and use it, also successfully build EC and tests for kunimitsu, strago, and samus which are the other boards that use the ALS task. Change-Id: I192940d7f306a1663c7cb789c313151bbb5f2b90 Signed-off-by: Duncan Laurie <dlaurie@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/298156 Reviewed-by: Shawn N <shawnn@chromium.org>
90 lines
1.8 KiB
C
90 lines
1.8 KiB
C
/* Copyright (c) 2013 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.
|
|
*/
|
|
|
|
/* This provides the interface for any Ambient Light Sensors that are connected
|
|
* to the EC instead of the AP.
|
|
*/
|
|
|
|
#include "als.h"
|
|
#include "common.h"
|
|
#include "console.h"
|
|
#include "hooks.h"
|
|
#include "host_command.h"
|
|
#include "task.h"
|
|
#include "timer.h"
|
|
#include "util.h"
|
|
|
|
#define ALS_POLL_PERIOD SECOND
|
|
|
|
static int task_timeout = -1;
|
|
|
|
int als_read(enum als_id id, int *lux)
|
|
{
|
|
int af = als[id].attenuation_factor;
|
|
return als[id].read(lux, af);
|
|
}
|
|
|
|
void als_task(void)
|
|
{
|
|
int i, val;
|
|
uint16_t *mapped = (uint16_t *)host_get_memmap(EC_MEMMAP_ALS);
|
|
uint16_t als_data;
|
|
|
|
while (1) {
|
|
task_wait_event(task_timeout);
|
|
|
|
/* If task was disabled while waiting do not read from ALS */
|
|
if (task_timeout < 0)
|
|
continue;
|
|
|
|
for (i = 0; i < EC_ALS_ENTRIES && i < ALS_COUNT; i++) {
|
|
als_data = als_read(i, &val) == EC_SUCCESS ? val : 0;
|
|
mapped[i] = als_data;
|
|
}
|
|
}
|
|
}
|
|
|
|
static void als_task_enable(void)
|
|
{
|
|
task_timeout = ALS_POLL_PERIOD;
|
|
task_wake(TASK_ID_ALS);
|
|
}
|
|
|
|
static void als_task_disable(void)
|
|
{
|
|
task_timeout = -1;
|
|
}
|
|
|
|
DECLARE_HOOK(HOOK_CHIPSET_RESUME, als_task_enable, HOOK_PRIO_DEFAULT);
|
|
DECLARE_HOOK(HOOK_CHIPSET_SUSPEND, als_task_disable, HOOK_PRIO_DEFAULT);
|
|
|
|
/*****************************************************************************/
|
|
/* Console commands */
|
|
|
|
#ifdef CONFIG_CMD_ALS
|
|
static int command_als(int argc, char **argv)
|
|
{
|
|
int i, rv, val;
|
|
|
|
for (i = 0; i < ALS_COUNT; i++) {
|
|
ccprintf("%s: ", als[i].name);
|
|
rv = als_read(i, &val);
|
|
switch (rv) {
|
|
case EC_SUCCESS:
|
|
ccprintf("%d lux\n", val);
|
|
break;
|
|
default:
|
|
ccprintf("Error %d\n", rv);
|
|
}
|
|
}
|
|
|
|
return EC_SUCCESS;
|
|
}
|
|
DECLARE_CONSOLE_COMMAND(als, command_als,
|
|
NULL,
|
|
"Print ALS values",
|
|
NULL);
|
|
#endif
|