From c2fff4a3e471063d5df826eb4670062a25f09282 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fin=20Maa=C3=9F?= Date: Thu, 10 Apr 2025 10:26:48 +0200 Subject: [PATCH] devicetree: Enhance DT_ENUM_HAS_VALUE macro for arrays MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On arrays DT_ENUM_HAS_VALUE() and DT_INST_ENUM_HAS_VALUE() were only checking the first index, this changes it to check all indexes. Signed-off-by: Fin Maaß --- include/zephyr/devicetree.h | 4 ++-- scripts/dts/gen_defines.py | 2 ++ tests/lib/devicetree/api/src/main.c | 16 ++++++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/include/zephyr/devicetree.h b/include/zephyr/devicetree.h index 0860ae6b19b..68dac5081f8 100644 --- a/include/zephyr/devicetree.h +++ b/include/zephyr/devicetree.h @@ -1045,14 +1045,14 @@ IS_ENABLED(DT_CAT8(node_id, _P_, prop, _IDX_, idx, _ENUM_VAL_, value, _EXISTS)) /** - * @brief Equivalent to DT_ENUM_HAS_VALUE_BY_IDX(node_id, prop, 0, value). + * @brief Does a node enumeration property have a given value? * @param node_id node identifier * @param prop lowercase-and-underscores property name * @param value lowercase-and-underscores enumeration value * @return 1 if the node property has the value @a value, 0 otherwise. */ #define DT_ENUM_HAS_VALUE(node_id, prop, value) \ - DT_ENUM_HAS_VALUE_BY_IDX(node_id, prop, 0, value) + IS_ENABLED(DT_CAT6(node_id, _P_, prop, _ENUM_VAL_, value, _EXISTS)) /** * @brief Get a string property's value as a token. diff --git a/scripts/dts/gen_defines.py b/scripts/dts/gen_defines.py index ee6a88dd1d1..93c4c3a635b 100755 --- a/scripts/dts/gen_defines.py +++ b/scripts/dts/gen_defines.py @@ -686,6 +686,8 @@ def enum_macros(prop: edtlib.Property, macro: str): ret[f"{macro}_IDX_{i}_EXISTS"] = 1 # DT_N__P__IDX__ENUM_VAL__EXISTS 1 ret[f"{macro}_IDX_{i}_ENUM_VAL_{subval}_EXISTS"] = 1 + # DT_N__P__ENUM_VAL__EXISTS 1 + ret[f"{macro}_ENUM_VAL_{subval}_EXISTS"] = 1 return ret diff --git a/tests/lib/devicetree/api/src/main.c b/tests/lib/devicetree/api/src/main.c index d3cd23721d7..bb214ec6a76 100644 --- a/tests/lib/devicetree/api/src/main.c +++ b/tests/lib/devicetree/api/src/main.c @@ -2193,6 +2193,12 @@ ZTEST(devicetree_api, test_enums) zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 2, bar)); zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 2, zoo)); + /* DT_ENUM_HAS_VALUE on string-array enum */ + zassert_true(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_string_array), val, foo)); + zassert_true(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_string_array), val, zoo)); + zassert_true(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_string_array), val, foo)); + zassert_false(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_string_array), val, baz)); + /* DT_ENUM_IDX_BY_IDX and DT_ENUM_HAS_VALUE_BY_IDX on int-array enum */ zassert_equal(DT_ENUM_IDX_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 0), 3); zassert_equal(DT_ENUM_IDX_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 1), 4); @@ -2210,6 +2216,16 @@ ZTEST(devicetree_api, test_enums) zassert_true(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 3, 0)); zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 3, 2)); zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 3, 1)); + + /* DT_ENUM_HAS_VALUE on int-array enum */ + zassert_true(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_int_array), val, 0)); + zassert_false(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_int_array), val, 1)); + zassert_false(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_int_array), val, 2)); + zassert_true(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_int_array), val, 3)); + zassert_true(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_int_array), val, 4)); + zassert_false(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_int_array), val, 5)); + zassert_false(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_int_array), val, 6)); + zassert_false(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_int_array), val, 7)); } #undef TO_MY_ENUM #undef TO_MY_ENUM_2