summaryrefslogtreecommitdiff
path: root/zephyr/include/emul/tcpc/emul_ps8xxx.h
diff options
context:
space:
mode:
Diffstat (limited to 'zephyr/include/emul/tcpc/emul_ps8xxx.h')
-rw-r--r--zephyr/include/emul/tcpc/emul_ps8xxx.h141
1 files changed, 141 insertions, 0 deletions
diff --git a/zephyr/include/emul/tcpc/emul_ps8xxx.h b/zephyr/include/emul/tcpc/emul_ps8xxx.h
new file mode 100644
index 0000000000..110def22ec
--- /dev/null
+++ b/zephyr/include/emul/tcpc/emul_ps8xxx.h
@@ -0,0 +1,141 @@
+/* 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 Backend API for PS8xxx emulator
+ */
+
+#ifndef __EMUL_PS8XXX_H
+#define __EMUL_PS8XXX_H
+
+#include <emul.h>
+#include <drivers/i2c.h>
+#include <drivers/i2c_emul.h>
+
+/**
+ * @brief PS8xxx emulator backend API
+ * @defgroup ps8xxx_emul PS8xxx emulator
+ * @{
+ *
+ * PS8xxx emulator is extension for the TCPCI emulator. It is able to emulate
+ * PS8805 and PS8815 devices. It registers "hidden" I2C devices with the I2C
+ * emulation controller.
+ * Application may alter emulator state:
+ *
+ * - call @ref ps8xxx_emul_set_product_id to select which device is emulated
+ * (PS8805 or PS8815)
+ * - call @ref ps8xxx_emul_get_tcpci to get TCPCI emulator pointer that is used
+ * as base for PS8xxx emulator. The pointer can be used in tcpci_emul_*
+ * functions.
+ * - call @ref ps8xxx_emul_get_i2c_emul to get "hidden" I2C device (port 0, 1
+ * or GPIO)
+ * - call @ref ps8xxx_emul_set_chip_rev to set PS8805 chip revision
+ * - call @ref ps8xxx_emul_set_hw_rev to set PS8815 HW revision
+ * - call @ref ps8xxx_emul_set_gpio_ctrl to set GPIO control register
+ */
+
+/** Types of "hidden" I2C devices */
+enum ps8xxx_emul_port {
+ PS8XXX_EMUL_PORT_0,
+ PS8XXX_EMUL_PORT_1,
+ PS8XXX_EMUL_PORT_GPIO,
+ PS8XXX_EMUL_PORT_INVAL,
+};
+
+/* For now all devices supported by this emulator has the same FW rev reg */
+#define PS8XXX_REG_FW_REV 0x82
+
+/**
+ * @brief Get pointer to specific "hidden" I2C device
+ *
+ * @param emul Pointer to PS8xxx emulator
+ * @param port Select which "hidden" I2C device should be obtained
+ *
+ * @return NULL if given "hidden" I2C device cannot be found
+ * @return pointer to "hidden" I2C device
+ */
+struct i2c_emul *ps8xxx_emul_get_i2c_emul(const struct emul *emul,
+ enum ps8xxx_emul_port port);
+
+/**
+ * @brief Get pointer to TCPCI emulator that is base for PS8xxx emulator
+ *
+ * @param emul Pointer to PS8xxx emulator
+ *
+ * @return pointer to TCPCI emulator
+ */
+const struct emul *ps8xxx_emul_get_tcpci(const struct emul *emul);
+
+/**
+ * @brief Set value of chip revision register on PS8805
+ *
+ * @param emul Pointer to PS8xxx emulator
+ * @param chip_rev Value to be set
+ */
+void ps8xxx_emul_set_chip_rev(const struct emul *emul, uint8_t chip_rev);
+
+/**
+ * @brief Set value of HW revision register on PS8815
+ *
+ * @param emul Pointer to PS8xxx emulator
+ * @param hw_rev Value to be set
+ */
+void ps8xxx_emul_set_hw_rev(const struct emul *emul, uint16_t hw_rev);
+
+/**
+ * @brief Set value of GPIO control register
+ *
+ * @param emul Pointer to PS8xxx emulator
+ * @param gpio_ctrl Value to be set
+ */
+void ps8xxx_emul_set_gpio_ctrl(const struct emul *emul, uint8_t gpio_ctrl);
+
+/**
+ * @brief Get value of GPIO control register
+ *
+ * @param emul Pointer to PS8xxx emulator
+ *
+ * @return Value of GPIO control register
+ */
+uint8_t ps8xxx_emul_get_gpio_ctrl(const struct emul *emul);
+
+/**
+ * @brief Get value of mux usb DCI configuration register
+ *
+ * @param emul Pointer to PS8xxx emulator
+ *
+ * @return Value of mux usb DCI configuration register
+ */
+uint8_t ps8xxx_emul_get_dci_cfg(const struct emul *emul);
+
+/**
+ * @brief Set product ID of emulated PS8xxx device. This change behaviour
+ * of emulator to mimic that device. Currently supported are PS8805 and
+ * PS8815
+ *
+ * @param emul Pointer to PS8xxx emulator
+ * @param product_id Value to be set
+ *
+ * @return 0 on success
+ * @return -EINVAL when unsupported product ID is selected
+ */
+int ps8xxx_emul_set_product_id(const struct emul *emul, uint16_t product_id);
+
+/**
+ * @brief Get product ID of emulated PS8xxx device
+ *
+ * @param emul Pointer to PS8xxx emulator
+ *
+ * @return Product ID of emulated PS8xxx device
+ */
+uint16_t ps8xxx_emul_get_product_id(const struct emul *emul);
+
+/**
+ * @}
+ */
+
+#endif /* __EMUL_PS8XXX */