xref: /rk3399_ARM-atf/drivers/ti/common/include/ti_container_of.h (revision a28114d66a6d43db4accef5fd5d6dab6c059e584)
1*8a46d04dSKamlesh Gurudasani /*
2*8a46d04dSKamlesh Gurudasani  * Copyright (c) 2025-2026 Texas Instruments Incorporated - https://www.ti.com
3*8a46d04dSKamlesh Gurudasani  *
4*8a46d04dSKamlesh Gurudasani  * SPDX-License-Identifier: BSD-3-Clause
5*8a46d04dSKamlesh Gurudasani  */
6*8a46d04dSKamlesh Gurudasani 
7*8a46d04dSKamlesh Gurudasani /*
8*8a46d04dSKamlesh Gurudasani  * Container Offset Macro
9*8a46d04dSKamlesh Gurudasani  *
10*8a46d04dSKamlesh Gurudasani  * This header provides the ti_container_of macro for obtaining a pointer to
11*8a46d04dSKamlesh Gurudasani  * the enclosing structure given a pointer to a member within that structure.
12*8a46d04dSKamlesh Gurudasani  */
13*8a46d04dSKamlesh Gurudasani 
14*8a46d04dSKamlesh Gurudasani #ifndef TI_CONTAINER_OF_H
15*8a46d04dSKamlesh Gurudasani #define TI_CONTAINER_OF_H
16*8a46d04dSKamlesh Gurudasani 
17*8a46d04dSKamlesh Gurudasani #include <stddef.h>
18*8a46d04dSKamlesh Gurudasani 
19*8a46d04dSKamlesh Gurudasani #include <ti_build_assert.h>
20*8a46d04dSKamlesh Gurudasani 
21*8a46d04dSKamlesh Gurudasani #define ti_check_types_match(expr1, expr2) \
22*8a46d04dSKamlesh Gurudasani 	TI_BUILD_ASSERT_OR_ZERO(sizeof(expr1) == sizeof(expr2))
23*8a46d04dSKamlesh Gurudasani 
24*8a46d04dSKamlesh Gurudasani /*
25*8a46d04dSKamlesh Gurudasani  * ti_container_of - get pointer to enclosing structure
26*8a46d04dSKamlesh Gurudasani  * @member_ptr: pointer to the structure member
27*8a46d04dSKamlesh Gurudasani  * @containing_type: the type this member is within
28*8a46d04dSKamlesh Gurudasani  * @member: the name of this member within the structure.
29*8a46d04dSKamlesh Gurudasani  *
30*8a46d04dSKamlesh Gurudasani  * Given a pointer to a member of a structure, this macro does pointer
31*8a46d04dSKamlesh Gurudasani  * subtraction to return the pointer to the enclosing type.
32*8a46d04dSKamlesh Gurudasani  */
33*8a46d04dSKamlesh Gurudasani #define ti_container_of(member_ptr, containing_type, member) \
34*8a46d04dSKamlesh Gurudasani 	 ((containing_type *) ((char *)(member_ptr) - offsetof(containing_type, member)) \
35*8a46d04dSKamlesh Gurudasani 	  + ti_check_types_match(*(member_ptr), ((containing_type *)0)->member))
36*8a46d04dSKamlesh Gurudasani 
37*8a46d04dSKamlesh Gurudasani #endif /* TI_CONTAINER_OF_H */
38