diff options
author | Keith Short <keithshort@chromium.org> | 2021-04-22 09:46:49 -0600 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-04-29 18:33:44 +0000 |
commit | fa1bf3e35e77d75f0ae1f916bb91ff8c36dd3549 (patch) | |
tree | a4af33276262bb44f1c72e2bdf17022bad980ee2 /zephyr/shim | |
parent | 0a4905af4b7eda51f17633c8a54a4d4d17860453 (diff) | |
download | chrome-ec-fa1bf3e35e77d75f0ae1f916bb91ff8c36dd3549.tar.gz |
zephyr: adc: Add call to setup ADC channels
The ADC shim driver needs to call adc_channel_setup() for all defined
ADC channels so that the pin configuration is correct.
This change saves 2mW of power in deep sleep mode on the NPCX7.
BUG=b:186305651
BRANCH=none
TEST=zmake testall
TEST=Measure S0ix power on Volteer
Cq-Depend: chromium:2855276
Signed-off-by: Keith Short <keithshort@chromium.org>
Change-Id: If293f7b1bc73facd619c050243c845dd8b3b54f6
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2855524
Reviewed-by: Yuval Peress <peress@chromium.org>
Diffstat (limited to 'zephyr/shim')
-rw-r--r-- | zephyr/shim/include/zephyr_adc.h | 3 | ||||
-rw-r--r-- | zephyr/shim/src/adc.c | 38 |
2 files changed, 30 insertions, 11 deletions
diff --git a/zephyr/shim/include/zephyr_adc.h b/zephyr/shim/include/zephyr_adc.h index fb63407c16..583c9f9cd7 100644 --- a/zephyr/shim/include/zephyr_adc.h +++ b/zephyr/shim/include/zephyr_adc.h @@ -6,6 +6,8 @@ #ifndef __CROS_EC_ZEPHYR_ADC_H #define __CROS_EC_ZEPHYR_ADC_H +#include <drivers/adc.h> + #ifdef CONFIG_PLATFORM_EC_ADC #define ZSHIM_ADC_ID(node_id) DT_ENUM_UPPER_TOKEN(node_id, enum_name) @@ -25,6 +27,7 @@ struct adc_t { uint8_t input_ch; int factor_mul; int factor_div; + struct adc_channel_cfg channel_cfg; }; extern const struct adc_t adc_channels[]; diff --git a/zephyr/shim/src/adc.c b/zephyr/shim/src/adc.c index 3e7aa6f37f..c6fbed23c5 100644 --- a/zephyr/shim/src/adc.c +++ b/zephyr/shim/src/adc.c @@ -3,29 +3,45 @@ * found in the LICENSE file. */ -#include "adc.h" #include <drivers/adc.h> +#include "adc.h" +#include "zephyr_adc.h" #define ADC_DEV DT_LABEL(DT_NODELABEL(adc0)) const struct device *adc_dev; -#if DT_NODE_EXISTS(DT_INST(0, named_adc_channels)) -#define ADC_CHANNEL_COMMA(node_id) \ - [ZSHIM_ADC_ID(node_id)] = { \ - .name = DT_LABEL(node_id), \ - .input_ch = DT_PROP(node_id, channel), \ - .factor_mul = DT_PROP(node_id, mul), \ - .factor_div = DT_PROP(node_id, div), \ +#define HAS_NAMED_ADC_CHANNELS DT_NODE_EXISTS(DT_INST(0, named_adc_channels)) + +#if HAS_NAMED_ADC_CHANNELS +#define ADC_CHANNEL_COMMA(node_id) \ + [ZSHIM_ADC_ID(node_id)] = { \ + .name = DT_LABEL(node_id), \ + .input_ch = DT_PROP(node_id, channel), \ + .factor_mul = DT_PROP(node_id, mul), \ + .factor_div = DT_PROP(node_id, div), \ + .channel_cfg = { \ + .channel_id = DT_PROP(node_id, channel), \ + .gain = DT_ENUM_TOKEN(node_id, gain), \ + .reference = DT_ENUM_TOKEN(node_id, reference), \ + .acquisition_time = \ + DT_PROP(node_id, acquisition_time), \ + .differential = DT_PROP(node_id, differential), \ + }, \ }, -const struct adc_t adc_channels[] = { - DT_FOREACH_CHILD(DT_INST(0, named_adc_channels), ADC_CHANNEL_COMMA) - }; +const struct adc_t adc_channels[] = { DT_FOREACH_CHILD( + DT_INST(0, named_adc_channels), ADC_CHANNEL_COMMA) }; #endif /* named_adc_channels */ static int init_device_bindings(const struct device *device) { ARG_UNUSED(device); adc_dev = device_get_binding(ADC_DEV); + +#if HAS_NAMED_ADC_CHANNELS + for (int i = 0; i < ARRAY_SIZE(adc_channels); i++) + adc_channel_setup(adc_dev, &adc_channels[i].channel_cfg); +#endif + return 0; } SYS_INIT(init_device_bindings, POST_KERNEL, 51); |