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