summaryrefslogtreecommitdiff
path: root/zephyr/shim
diff options
context:
space:
mode:
authorKeith Short <keithshort@chromium.org>2021-04-22 09:46:49 -0600
committerCommit Bot <commit-bot@chromium.org>2021-04-29 18:33:44 +0000
commitfa1bf3e35e77d75f0ae1f916bb91ff8c36dd3549 (patch)
treea4af33276262bb44f1c72e2bdf17022bad980ee2 /zephyr/shim
parent0a4905af4b7eda51f17633c8a54a4d4d17860453 (diff)
downloadchrome-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.h3
-rw-r--r--zephyr/shim/src/adc.c38
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);