diff options
author | Dawid Niedzwiecki <dn@semihalf.com> | 2021-05-11 13:37:40 +0200 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-05-14 10:25:25 +0000 |
commit | 6e1449eb477f73dbba8bddf4c3dae907a93bb065 (patch) | |
tree | a0bf9fae326690f1c4e02f5a1ee950e9eb7e4a2d /zephyr/include/drivers | |
parent | 4ab13c794e5f5c8a1b85ec08f932e6751f3b4516 (diff) | |
download | chrome-ec-6e1449eb477f73dbba8bddf4c3dae907a93bb065.tar.gz |
zephyr: Rework CBI to be used as a driver
Rework the CBI support in Zephyr to be used via driver API.
Change also approach what to do with SSFC - let sensor drivers decide
how to handle alternative sensors.
BUG=b:183990188
BRANCH=none
TEST=Add alternative motion sensors to the device tree, modify CBI SSFC
with 'cbi set 8 value 4', reboot EC and verify that the new sensors are
used with the 'accelinfo' command.
Signed-off-by: Dawid Niedzwiecki <dn@semihalf.com>
Change-Id: I701af96bfa7a17333220530a5c63b8e8aaeb0d6b
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2862727
Reviewed-by: Yuval Peress <peress@chromium.org>
Diffstat (limited to 'zephyr/include/drivers')
-rw-r--r-- | zephyr/include/drivers/cros_cbi.h | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/zephyr/include/drivers/cros_cbi.h b/zephyr/include/drivers/cros_cbi.h new file mode 100644 index 0000000000..aa55e03b77 --- /dev/null +++ b/zephyr/include/drivers/cros_cbi.h @@ -0,0 +1,102 @@ +/* Copyright 2021 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. + */ + +/** + * @file + * @brief Chrome OS-specific API for access to Cros Board Info(CBI) + */ + +#ifndef ZEPHYR_INCLUDE_DRIVERS_CROS_CBI_H_ +#define ZEPHYR_INCLUDE_DRIVERS_CROS_CBI_H_ + +#include <kernel.h> +#include <device.h> +#include <devicetree.h> + +#define CBI_SSFC_VALUE_COMPAT named_cbi_ssfc_value +#define CBI_SSFC_VALUE_ID(id) DT_CAT(CBI_SSFC_VALUE_, id) +#define CBI_SSFC_VALUE_ID_WITH_COMMA(id) CBI_SSFC_VALUE_ID(id), +#define CBI_SSFC_VALUE_INST_ENUM(inst, _) \ + CBI_SSFC_VALUE_ID_WITH_COMMA(DT_INST(inst, CBI_SSFC_VALUE_COMPAT)) +#define CROS_CBI_LABEL "cros_cbi" + +enum cbi_ssfc_value_id { + UTIL_LISTIFY(DT_NUM_INST_STATUS_OKAY(CBI_SSFC_VALUE_COMPAT), + CBI_SSFC_VALUE_INST_ENUM) + CBI_SSFC_VALUE_COUNT +}; + +/** + * @cond INTERNAL_HIDDEN + * + * cros cbi raw driver API definition and system call entry points + * + * (Internal use only.) + */ +typedef int (*cros_cbi_api_init)(const struct device *dev); +typedef int (*cros_cbi_api_ssfc_check_match)(const struct device *dev, + enum cbi_ssfc_value_id value_id); + +__subsystem struct cros_cbi_driver_api { + cros_cbi_api_init init; + cros_cbi_api_ssfc_check_match ssfc_check_match; +}; + +/** + * @endcond + */ + +/** + * @brief Initialize CBI. + * + * @param dev Pointer to the device structure for the CBI instance. + * + * @return 0 If successful. + * @retval -ENOTSUP Not supported api function. + */ +__syscall int cros_cbi_init(const struct device *dev); + +static inline int z_impl_cros_cbi_init(const struct device *dev) +{ + const struct cros_cbi_driver_api *api = + (const struct cros_cbi_driver_api *)dev->api; + + if (!api->init) { + return -ENOTSUP; + } + + return api->init(dev); +} + +/** + * @brief Check if the CBI SSFC value matches the one in the EEPROM + * + * @param dev Pointer to the device. + * + * @return 1 If matches, 0 if not. + * @retval -ENOTSUP Not supported api function. + */ +__syscall int cros_cbi_ssfc_check_match(const struct device *dev, + enum cbi_ssfc_value_id value_id); + +static inline int +z_impl_cros_cbi_ssfc_check_match(const struct device *dev, + enum cbi_ssfc_value_id value_id) +{ + const struct cros_cbi_driver_api *api = + (const struct cros_cbi_driver_api *)dev->api; + + if (!api->ssfc_check_match) { + return -ENOTSUP; + } + + return api->ssfc_check_match(dev, value_id); +} + +/** + * @} + */ +#include <syscalls/cros_cbi.h> +#endif /* ZEPHYR_INCLUDE_DRIVERS_CROS_CBI_H_ */ |