mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-12-29 10:00:51 +00:00
For multi-byte ACPI memmap reads, we previously had a mutex to ensure data continuity. A better approach is to use a read cache. Since the kernel will enable burst mode before reading a multi-byte memmap variable and disable it afterward, we can populate the cache on the first read after enabling burst. This solution removes deadlock bugs, is contained entirely in acpi.c, and saves a deferred function. BUG=chromium:514283 TEST=Manual on Glados. Add prints in acpi_read, verify that multi-byte reads come from cache and non-burst reads continue to function as before. BRANCH=Cyan Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org> Change-Id: I74e4927bf2b433e31a9ff65d72820fa087c51722 Reviewed-on: https://chromium-review.googlesource.com/288871 Reviewed-by: Bill Richardson <wfrichar@chromium.org> Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
65 lines
1.3 KiB
C
65 lines
1.3 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 "host_command.h"
|
|
#include "task.h"
|
|
#include "timer.h"
|
|
#include "util.h"
|
|
|
|
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) {
|
|
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;
|
|
}
|
|
|
|
task_wait_event(SECOND);
|
|
}
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* Console commands */
|
|
|
|
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);
|