|
3201 | 3201 | */ |
3202 | 3202 | #define DT_FOREACH_STATUS_OKAY(compat, fn) \ |
3203 | 3203 | COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \ |
3204 | | - (DT_CAT(DT_FOREACH_OKAY_, compat)(fn)), \ |
| 3204 | + (UTIL_CAT(DT_FOREACH_OKAY_, compat)(fn)), \ |
3205 | 3205 | ()) |
3206 | 3206 |
|
3207 | 3207 | /** |
|
3254 | 3254 | compat)(fn, __VA_ARGS__)), \ |
3255 | 3255 | ()) |
3256 | 3256 |
|
| 3257 | +/** |
| 3258 | + * @brief Call @p fn on all nodes with compatible `compat` |
| 3259 | + * and status `okay` with multiple arguments |
| 3260 | + * |
| 3261 | + * |
| 3262 | + * @param compat lowercase-and-underscores devicetree compatible |
| 3263 | + * @param fn Macro to call for each enabled node. Must accept a |
| 3264 | + * devicetree compatible and instance number. |
| 3265 | + * @param ... Additional arguments to pass to @p fn |
| 3266 | + * |
| 3267 | + * @see DT_INST_FOREACH_STATUS_OKAY_VARGS |
| 3268 | + */ |
| 3269 | +#define DT_COMPAT_FOREACH_STATUS_OKAY_VARGS(compat, fn, ...) \ |
| 3270 | + COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(compat), \ |
| 3271 | + (UTIL_CAT(DT_FOREACH_OKAY_INST_VARGS_, \ |
| 3272 | + compat)(fn, compat, __VA_ARGS__)), \ |
| 3273 | + ()) |
| 3274 | + |
| 3275 | + |
3257 | 3276 | /** |
3258 | 3277 | * @brief Invokes @p fn for each node label of a given node |
3259 | 3278 | * |
|
4459 | 4478 | #define DT_ANY_INST_HAS_PROP_STATUS_OKAY(prop) \ |
4460 | 4479 | COND_CODE_1(IS_EMPTY(DT_ANY_INST_HAS_PROP_STATUS_OKAY_(prop)), (0), (1)) |
4461 | 4480 |
|
| 4481 | +/** |
| 4482 | + * @brief Check if any device node with status `okay` has a given |
| 4483 | + * property. |
| 4484 | + * |
| 4485 | + * @param prop lowercase-and-underscores property name |
| 4486 | + * |
| 4487 | + * Example devicetree overlay: |
| 4488 | + * |
| 4489 | + * @code{.dts} |
| 4490 | + * &i2c0 { |
| 4491 | + * sensor0: sensor@0 { |
| 4492 | + * compatible = "vnd,some-sensor"; |
| 4493 | + * status = "okay"; |
| 4494 | + * reg = <0>; |
| 4495 | + * foo = <1>; |
| 4496 | + * bar = <2>; |
| 4497 | + * }; |
| 4498 | + * |
| 4499 | + * sensor1: sensor@1 { |
| 4500 | + * compatible = "vnd,some-sensor"; |
| 4501 | + * status = "okay"; |
| 4502 | + * reg = <1>; |
| 4503 | + * foo = <2>; |
| 4504 | + * }; |
| 4505 | + * |
| 4506 | + * sensor2: sensor@2 { |
| 4507 | + * compatible = "vnd,some-sensor"; |
| 4508 | + * status = "disabled"; |
| 4509 | + * reg = <2>; |
| 4510 | + * baz = <1>; |
| 4511 | + * }; |
| 4512 | + * }; |
| 4513 | + * @endcode |
| 4514 | + * |
| 4515 | + * Example usage: |
| 4516 | + * |
| 4517 | + * @code{.c} |
| 4518 | + * |
| 4519 | + * DT_ANY_COMPAT_HAS_PROP_STATUS_OKAY(vnd_some_sensor, foo) // 1 |
| 4520 | + * DT_ANY_COMPAT_HAS_PROP_STATUS_OKAY(vnd_some_sensor, bar) // 1 |
| 4521 | + * DT_ANY_COMPAT_HAS_PROP_STATUS_OKAY(vnd_some_sensor, baz) // 0 |
| 4522 | + * @endcode |
| 4523 | + */ |
| 4524 | +#define DT_ANY_COMPAT_HAS_PROP_STATUS_OKAY(compat, prop) \ |
| 4525 | + (DT_COMPAT_FOREACH_STATUS_OKAY_VARGS(compat, DT_COMPAT_NODE_HAS_PROP_AND_OR, prop) 0) |
| 4526 | + |
4462 | 4527 | /** |
4463 | 4528 | * @brief Call @p fn on all nodes with compatible `DT_DRV_COMPAT` |
4464 | 4529 | * and status `okay` |
|
4536 | 4601 | * |
4537 | 4602 | * |
4538 | 4603 | * @param fn Macro to call for each enabled node. Must accept an |
4539 | | - * instance number as its only parameter. |
| 4604 | + * instance number. |
4540 | 4605 | * @param ... variable number of arguments to pass to @p fn |
4541 | 4606 | * |
4542 | 4607 | * @see DT_INST_FOREACH_STATUS_OKAY |
| 4608 | + * @see DT_COMPAT_FOREACH_STATUS_OKAY_VARGS |
4543 | 4609 | */ |
4544 | 4610 | #define DT_INST_FOREACH_STATUS_OKAY_VARGS(fn, ...) \ |
4545 | | - COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \ |
4546 | | - (UTIL_CAT(DT_FOREACH_OKAY_INST_VARGS_, \ |
4547 | | - DT_DRV_COMPAT)(fn, __VA_ARGS__)), \ |
| 4611 | + COND_CODE_1(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), \ |
| 4612 | + (UTIL_CAT(DT_FOREACH_OKAY_INST_VARGS_, \ |
| 4613 | + DT_DRV_COMPAT)(fn, __VA_ARGS__)), \ |
4548 | 4614 | ()) |
4549 | 4615 |
|
4550 | 4616 | /** |
|
4806 | 4872 | #define DT_NODE_HAS_STATUS_INTERNAL(node_id, status) \ |
4807 | 4873 | IS_ENABLED(DT_CAT3(node_id, _STATUS_, status)) |
4808 | 4874 |
|
| 4875 | +/** @brief Helper macro to OR multiple has property checks in a loop macro |
| 4876 | + * (for the specified device) |
| 4877 | + */ |
| 4878 | +#define DT_COMPAT_NODE_HAS_PROP_AND_OR(inst, compat, prop) \ |
| 4879 | + DT_NODE_HAS_PROP(DT_INST(inst, compat), prop) || |
| 4880 | + |
4809 | 4881 | /** |
4810 | 4882 | * @def DT_U64_C |
4811 | 4883 | * @brief Macro to add ULL postfix to the devicetree address constants |
|
0 commit comments