blob: fc2829a6c1ebb8e2099932bf9cf8771aa064d8cf [file] [log] [blame]
/*
* 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_device PM device resources reference (NULL if device does not use PM).
*
* @param data_ptr Pointer to the device's private data.
*
* @param cfg_ptr 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_ptr 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_device, \
data_ptr, cfg_ptr, level, prio, \
api_ptr, ...) \
DEVICE_DT_DEFINE(node_id, init_fn, pm_device, \
data_ptr, cfg_ptr, level, prio, \
api_ptr, __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_ */