| /* |
| * Copyright 2022 Intel Corporation |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #ifndef ZEPHYR_INCLUDE_DRIVERS_I3C_DEVICETREE_H_ |
| #define ZEPHYR_INCLUDE_DRIVERS_I3C_DEVICETREE_H_ |
| |
| /** |
| * @brief I3C Devicetree related bits |
| * @defgroup i3c_devicetree I3C Devicetree related bits |
| * @ingroup i3c_interface |
| * @{ |
| */ |
| |
| #include <zephyr/device.h> |
| #include <zephyr/kernel.h> |
| #include <zephyr/types.h> |
| #include <zephyr/sys/util.h> |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /** |
| * @brief Structure initializer for i3c_device_id from devicetree |
| * |
| * This helper macro expands to a static initializer for a <tt>struct |
| * i3c_device_id</tt> by reading the relevant device data from devicetree. |
| * |
| * @param node_id Devicetree node identifier for the I3C device whose |
| * struct i3c_device_id to create an initializer for |
| */ |
| #define I3C_DEVICE_ID_DT(node_id) \ |
| { \ |
| .pid = ((uint64_t)DT_PROP_BY_IDX(node_id, reg, 1) << 32)\ |
| | DT_PROP_BY_IDX(node_id, reg, 2), \ |
| } |
| |
| /** |
| * @brief Structure initializer for i3c_device_id from devicetree instance |
| * |
| * This is equivalent to |
| * <tt>I3C_DEVICE_ID_DT(DT_DRV_INST(inst))</tt>. |
| * |
| * @param inst Devicetree instance number |
| */ |
| #define I3C_DEVICE_ID_DT_INST(inst) \ |
| I3C_DEVICE_ID_DT(DT_DRV_INST(inst)) |
| |
| /** |
| * @brief Structure initializer for i3c_device_desc from devicetree |
| * |
| * This helper macro expands to a static initializer for a <tt>struct |
| * i3c_device_desc</tt> by reading the relevant bus and device data |
| * from the devicetree. |
| * |
| * @param node_id Devicetree node identifier for the I3C device whose |
| * struct i3c_device_desc to create an initializer for |
| */ |
| #define I3C_DEVICE_DESC_DT(node_id) \ |
| { \ |
| .bus = DEVICE_DT_GET(DT_BUS(node_id)), \ |
| .dev = DEVICE_DT_GET(node_id), \ |
| .static_addr = DT_PROP_BY_IDX(node_id, reg, 0), \ |
| .pid = ((uint64_t)DT_PROP_BY_IDX(node_id, reg, 1) << 32)\ |
| | DT_PROP_BY_IDX(node_id, reg, 2), \ |
| .init_dynamic_addr = \ |
| DT_PROP_OR(node_id, assigned_address, 0), \ |
| }, |
| |
| /** |
| * @brief Structure initializer for i3c_device_desc from devicetree instance |
| * |
| * This is equivalent to |
| * <tt>I3C_DEVICE_DESC_DT(DT_DRV_INST(inst))</tt>. |
| * |
| * @param inst Devicetree instance number |
| */ |
| #define I3C_DEVICE_DESC_DT_INST(inst) \ |
| I3C_DEVICE_DESC_DT(DT_DRV_INST(inst)) |
| |
| /** |
| * @brief Structure initializer for i3c_device_desc from devicetree |
| * |
| * This is mainly used by <tt>I3C_DEVICE_ARRAY_DT()</tt> to only |
| * create a struct if and only if it is an I3C device. |
| */ |
| #define I3C_DEVICE_DESC_DT_FILTERED(node_id) \ |
| COND_CODE_0(DT_PROP_BY_IDX(node_id, reg, 1), \ |
| (), (I3C_DEVICE_DESC_DT(node_id))) |
| |
| /** |
| * @brief Array initializer for a list of i3c_device_desc from devicetree |
| * |
| * This is a helper macro to generate an array for a list of i3c_device_desc |
| * from device tree. |
| * |
| * @param node_id Devicetree node identifier of the I3C controller |
| */ |
| #define I3C_DEVICE_ARRAY_DT(node_id) \ |
| { \ |
| DT_FOREACH_CHILD_STATUS_OKAY( \ |
| node_id, \ |
| I3C_DEVICE_DESC_DT_FILTERED) \ |
| } |
| |
| /** |
| * @brief Array initializer for a list of i3c_device_desc from devicetree instance |
| * |
| * This is equivalent to |
| * <tt>I3C_DEVICE_ARRAY_DT(DT_DRV_INST(inst))</tt>. |
| * |
| * @param inst Devicetree instance number of the I3C controller |
| */ |
| #define I3C_DEVICE_ARRAY_DT_INST(inst) \ |
| I3C_DEVICE_ARRAY_DT(DT_DRV_INST(inst)) |
| |
| /** |
| * @brief Like DEVICE_DT_DEFINE() with I3C target device specifics. |
| * |
| * Defines a I3C target device which implements the I3C target device API. |
| * |
| * @param node_id The devicetree node identifier. |
| * |
| * @param init_fn Name of the init function of the driver. |
| * |
| * @param pm PM device resources reference (NULL if device does not use PM). |
| * |
| * @param data Pointer to the device's private data. |
| * |
| * @param config The address to the structure containing the |
| * configuration information for this instance of the driver. |
| * |
| * @param level The initialization level. See SYS_INIT() for |
| * details. |
| * |
| * @param prio Priority within the selected initialization level. See |
| * SYS_INIT() for details. |
| * |
| * @param api Provides an initial pointer to the API function struct |
| * used by the driver. Can be NULL. |
| */ |
| #define I3C_DEVICE_DT_DEFINE(node_id, init_fn, pm, data, config, level, \ |
| prio, api, ...) \ |
| DEVICE_DT_DEFINE(node_id, init_fn, pm, data, config, level, \ |
| prio, api, __VA_ARGS__) |
| |
| /** |
| * @brief Like I3C_TARGET_DT_DEFINE() for an instance of a DT_DRV_COMPAT compatible |
| * |
| * @param inst instance number. This is replaced by |
| * <tt>DT_DRV_COMPAT(inst)</tt> in the call to I3C_TARGET_DT_DEFINE(). |
| * |
| * @param ... other parameters as expected by I3C_TARGET_DT_DEFINE(). |
| */ |
| #define I3C_DEVICE_DT_INST_DEFINE(inst, ...) \ |
| I3C_DEVICE_DT_DEFINE(DT_DRV_INST(inst), __VA_ARGS__) |
| |
| /** |
| * @brief Structure initializer for i3c_i2c_device_desc from devicetree |
| * |
| * This helper macro expands to a static initializer for a <tt>struct |
| * i3c_i2c_device_desc</tt> by reading the relevant bus and device data |
| * from the devicetree. |
| * |
| * @param node_id Devicetree node identifier for the I3C device whose |
| * struct i3c_i2c_device_desc to create an initializer for |
| */ |
| #define I3C_I2C_DEVICE_DESC_DT(node_id) \ |
| { \ |
| .bus = DEVICE_DT_GET(DT_BUS(node_id)), \ |
| .addr = DT_PROP_BY_IDX(node_id, reg, 0), \ |
| .lvr = DT_PROP_BY_IDX(node_id, reg, 2), \ |
| }, |
| |
| /** |
| * @brief Structure initializer for i3c_i2c_device_desc from devicetree instance |
| * |
| * This is equivalent to |
| * <tt>I3C_I2C_DEVICE_DESC_DT(DT_DRV_INST(inst))</tt>. |
| * |
| * @param inst Devicetree instance number |
| */ |
| #define I3C_I2C_DEVICE_DESC_DT_INST(inst) \ |
| I3C_I2C_DEVICE_DESC_DT(DT_DRV_INST(inst)) |
| |
| |
| /** |
| * @brief Structure initializer for i3c_i2c_device_desc from devicetree |
| * |
| * This is mainly used by <tt>I3C_I2C_DEVICE_ARRAY_DT()</tt> to only |
| * create a struct if and only if it is an I2C device. |
| */ |
| #define I3C_I2C_DEVICE_DESC_DT_FILTERED(node_id) \ |
| COND_CODE_0(DT_PROP_BY_IDX(node_id, reg, 1), \ |
| (I3C_I2C_DEVICE_DESC_DT(node_id)), ()) |
| |
| /** |
| * @brief Array initializer for a list of i3c_i2c_device_desc from devicetree |
| * |
| * This is a helper macro to generate an array for a list of |
| * i3c_i2c_device_desc from device tree. |
| * |
| * @param node_id Devicetree node identifier of the I3C controller |
| */ |
| #define I3C_I2C_DEVICE_ARRAY_DT(node_id) \ |
| { \ |
| DT_FOREACH_CHILD_STATUS_OKAY( \ |
| node_id, \ |
| I3C_I2C_DEVICE_DESC_DT_FILTERED) \ |
| } |
| |
| /** |
| * @brief Array initializer for a list of i3c_i2c_device_desc from devicetree instance |
| * |
| * This is equivalent to |
| * <tt>I3C_I2C_DEVICE_ARRAY_DT(DT_DRV_INST(inst))</tt>. |
| * |
| * @param inst Devicetree instance number of the I3C controller |
| */ |
| #define I3C_I2C_DEVICE_ARRAY_DT_INST(inst) \ |
| I3C_I2C_DEVICE_ARRAY_DT(DT_DRV_INST(inst)) |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| /** |
| * @} |
| */ |
| |
| #endif /* ZEPHYR_INCLUDE_DRIVERS_I3C_DEVICETREE_H_ */ |