LCOV - code coverage report
Current view: top level - zephyr/devicetree - clocks.h Hit Total Coverage
Test: new.info Lines: 19 19 100.0 %
Date: 2024-12-21 18:13:37

          Line data    Source code
       1           1 : /**
       2             :  * @file
       3             :  * @brief Clocks Devicetree macro public API header file.
       4             :  */
       5             : 
       6             : /*
       7             :  * Copyright (c) 2020, Linaro Ltd.
       8             :  *
       9             :  * SPDX-License-Identifier: Apache-2.0
      10             :  */
      11             : 
      12             : #ifndef ZEPHYR_INCLUDE_DEVICETREE_CLOCKS_H_
      13             : #define ZEPHYR_INCLUDE_DEVICETREE_CLOCKS_H_
      14             : 
      15             : #ifdef __cplusplus
      16             : extern "C" {
      17             : #endif
      18             : 
      19             : /**
      20             :  * @defgroup devicetree-clocks Devicetree Clocks API
      21             :  * @ingroup devicetree
      22             :  * @{
      23             :  */
      24             : 
      25             : /**
      26             :  * @brief Test if a node has a clocks phandle-array property at a given index
      27             :  *
      28             :  * This expands to 1 if the given index is valid clocks property phandle-array index.
      29             :  * Otherwise, it expands to 0.
      30             :  *
      31             :  * Example devicetree fragment:
      32             :  *
      33             :  *     n1: node-1 {
      34             :  *             clocks = <...>, <...>;
      35             :  *     };
      36             :  *
      37             :  *     n2: node-2 {
      38             :  *             clocks = <...>;
      39             :  *     };
      40             :  *
      41             :  * Example usage:
      42             :  *
      43             :  *     DT_CLOCKS_HAS_IDX(DT_NODELABEL(n1), 0) // 1
      44             :  *     DT_CLOCKS_HAS_IDX(DT_NODELABEL(n1), 1) // 1
      45             :  *     DT_CLOCKS_HAS_IDX(DT_NODELABEL(n1), 2) // 0
      46             :  *     DT_CLOCKS_HAS_IDX(DT_NODELABEL(n2), 1) // 0
      47             :  *
      48             :  * @param node_id node identifier; may or may not have any clocks property
      49             :  * @param idx index of a clocks property phandle-array whose existence to check
      50             :  * @return 1 if the index exists, 0 otherwise
      51             :  */
      52           1 : #define DT_CLOCKS_HAS_IDX(node_id, idx) \
      53             :         DT_PROP_HAS_IDX(node_id, clocks, idx)
      54             : 
      55             : /**
      56             :  * @brief Test if a node has a clock-names array property holds a given name
      57             :  *
      58             :  * This expands to 1 if the name is available as clocks-name array property cell.
      59             :  * Otherwise, it expands to 0.
      60             :  *
      61             :  * Example devicetree fragment:
      62             :  *
      63             :  *     n1: node-1 {
      64             :  *             clocks = <...>, <...>;
      65             :  *             clock-names = "alpha", "beta";
      66             :  *     };
      67             :  *
      68             :  *     n2: node-2 {
      69             :  *             clocks = <...>;
      70             :  *             clock-names = "alpha";
      71             :  *     };
      72             :  *
      73             :  * Example usage:
      74             :  *
      75             :  *     DT_CLOCKS_HAS_NAME(DT_NODELABEL(n1), alpha) // 1
      76             :  *     DT_CLOCKS_HAS_NAME(DT_NODELABEL(n1), beta)  // 1
      77             :  *     DT_CLOCKS_HAS_NAME(DT_NODELABEL(n2), beta)  // 0
      78             :  *
      79             :  * @param node_id node identifier; may or may not have any clock-names property.
      80             :  * @param name lowercase-and-underscores clock-names cell value name to check
      81             :  * @return 1 if the clock name exists, 0 otherwise
      82             :  */
      83           1 : #define DT_CLOCKS_HAS_NAME(node_id, name) \
      84             :         DT_PROP_HAS_NAME(node_id, clocks, name)
      85             : 
      86             : /**
      87             :  * @brief Get the number of elements in a clocks property
      88             :  *
      89             :  * Example devicetree fragment:
      90             :  *
      91             :  *     n1: node-1 {
      92             :  *             clocks = <&foo>, <&bar>;
      93             :  *     };
      94             :  *
      95             :  *     n2: node-2 {
      96             :  *             clocks = <&foo>;
      97             :  *     };
      98             :  *
      99             :  * Example usage:
     100             :  *
     101             :  *     DT_NUM_CLOCKS(DT_NODELABEL(n1)) // 2
     102             :  *     DT_NUM_CLOCKS(DT_NODELABEL(n2)) // 1
     103             :  *
     104             :  * @param node_id node identifier with a clocks property
     105             :  * @return number of elements in the property
     106             :  */
     107           1 : #define DT_NUM_CLOCKS(node_id) \
     108             :         DT_PROP_LEN(node_id, clocks)
     109             : 
     110             : 
     111             : /**
     112             :  * @brief Get the node identifier for the controller phandle from a
     113             :  *        "clocks" phandle-array property at an index
     114             :  *
     115             :  * Example devicetree fragment:
     116             :  *
     117             :  *     clk1: clock-controller@... { ... };
     118             :  *
     119             :  *     clk2: clock-controller@... { ... };
     120             :  *
     121             :  *     n: node {
     122             :  *             clocks = <&clk1 10 20>, <&clk2 30 40>;
     123             :  *     };
     124             :  *
     125             :  * Example usage:
     126             :  *
     127             :  *     DT_CLOCKS_CTLR_BY_IDX(DT_NODELABEL(n), 0)) // DT_NODELABEL(clk1)
     128             :  *     DT_CLOCKS_CTLR_BY_IDX(DT_NODELABEL(n), 1)) // DT_NODELABEL(clk2)
     129             :  *
     130             :  * @param node_id node identifier
     131             :  * @param idx logical index into "clocks"
     132             :  * @return the node identifier for the clock controller referenced at
     133             :  *         index "idx"
     134             :  * @see DT_PHANDLE_BY_IDX()
     135             :  */
     136           1 : #define DT_CLOCKS_CTLR_BY_IDX(node_id, idx) \
     137             :         DT_PHANDLE_BY_IDX(node_id, clocks, idx)
     138             : 
     139             : /**
     140             :  * @brief Equivalent to DT_CLOCKS_CTLR_BY_IDX(node_id, 0)
     141             :  * @param node_id node identifier
     142             :  * @return a node identifier for the clocks controller at index 0
     143             :  *         in "clocks"
     144             :  * @see DT_CLOCKS_CTLR_BY_IDX()
     145             :  */
     146           1 : #define DT_CLOCKS_CTLR(node_id) DT_CLOCKS_CTLR_BY_IDX(node_id, 0)
     147             : 
     148             : /**
     149             :  * @brief Get the node identifier for the controller phandle from a
     150             :  *        clocks phandle-array property by name
     151             :  *
     152             :  * Example devicetree fragment:
     153             :  *
     154             :  *     clk1: clock-controller@... { ... };
     155             :  *
     156             :  *     clk2: clock-controller@... { ... };
     157             :  *
     158             :  *     n: node {
     159             :  *             clocks = <&clk1 10 20>, <&clk2 30 40>;
     160             :  *             clock-names = "alpha", "beta";
     161             :  *     };
     162             :  *
     163             :  * Example usage:
     164             :  *
     165             :  *     DT_CLOCKS_CTLR_BY_NAME(DT_NODELABEL(n), beta) // DT_NODELABEL(clk2)
     166             :  *
     167             :  * @param node_id node identifier
     168             :  * @param name lowercase-and-underscores name of a clocks element
     169             :  *             as defined by the node's clock-names property
     170             :  * @return the node identifier for the clock controller referenced by name
     171             :  * @see DT_PHANDLE_BY_NAME()
     172             :  */
     173           1 : #define DT_CLOCKS_CTLR_BY_NAME(node_id, name) \
     174             :         DT_PHANDLE_BY_NAME(node_id, clocks, name)
     175             : 
     176             : /**
     177             :  * @brief Get a clock specifier's cell value at an index
     178             :  *
     179             :  * Example devicetree fragment:
     180             :  *
     181             :  *     clk1: clock-controller@... {
     182             :  *             compatible = "vnd,clock";
     183             :  *             #clock-cells = < 2 >;
     184             :  *     };
     185             :  *
     186             :  *     n: node {
     187             :  *             clocks = < &clk1 10 20 >, < &clk1 30 40 >;
     188             :  *     };
     189             :  *
     190             :  * Bindings fragment for the vnd,clock compatible:
     191             :  *
     192             :  *     clock-cells:
     193             :  *       - bus
     194             :  *       - bits
     195             :  *
     196             :  * Example usage:
     197             :  *
     198             :  *     DT_CLOCKS_CELL_BY_IDX(DT_NODELABEL(n), 0, bus) // 10
     199             :  *     DT_CLOCKS_CELL_BY_IDX(DT_NODELABEL(n), 1, bits) // 40
     200             :  *
     201             :  * @param node_id node identifier for a node with a clocks property
     202             :  * @param idx logical index into clocks property
     203             :  * @param cell lowercase-and-underscores cell name
     204             :  * @return the cell value at index "idx"
     205             :  * @see DT_PHA_BY_IDX()
     206             :  */
     207           1 : #define DT_CLOCKS_CELL_BY_IDX(node_id, idx, cell) \
     208             :         DT_PHA_BY_IDX(node_id, clocks, idx, cell)
     209             : 
     210             : /**
     211             :  * @brief Get a clock specifier's cell value by name
     212             :  *
     213             :  * Example devicetree fragment:
     214             :  *
     215             :  *     clk1: clock-controller@... {
     216             :  *             compatible = "vnd,clock";
     217             :  *             #clock-cells = < 2 >;
     218             :  *     };
     219             :  *
     220             :  *     n: node {
     221             :  *             clocks = < &clk1 10 20 >, < &clk1 30 40 >;
     222             :  *             clock-names = "alpha", "beta";
     223             :  *     };
     224             :  *
     225             :  * Bindings fragment for the vnd,clock compatible:
     226             :  *
     227             :  *     clock-cells:
     228             :  *       - bus
     229             :  *       - bits
     230             :  *
     231             :  * Example usage:
     232             :  *
     233             :  *     DT_CLOCKS_CELL_BY_NAME(DT_NODELABEL(n), alpha, bus) // 10
     234             :  *     DT_CLOCKS_CELL_BY_NAME(DT_NODELABEL(n), beta, bits) // 40
     235             :  *
     236             :  * @param node_id node identifier for a node with a clocks property
     237             :  * @param name lowercase-and-underscores name of a clocks element
     238             :  *             as defined by the node's clock-names property
     239             :  * @param cell lowercase-and-underscores cell name
     240             :  * @return the cell value in the specifier at the named element
     241             :  * @see DT_PHA_BY_NAME()
     242             :  */
     243           1 : #define DT_CLOCKS_CELL_BY_NAME(node_id, name, cell) \
     244             :         DT_PHA_BY_NAME(node_id, clocks, name, cell)
     245             : 
     246             : /**
     247             :  * @brief Equivalent to DT_CLOCKS_CELL_BY_IDX(node_id, 0, cell)
     248             :  * @param node_id node identifier for a node with a clocks property
     249             :  * @param cell lowercase-and-underscores cell name
     250             :  * @return the cell value at index 0
     251             :  * @see DT_CLOCKS_CELL_BY_IDX()
     252             :  */
     253           1 : #define DT_CLOCKS_CELL(node_id, cell) DT_CLOCKS_CELL_BY_IDX(node_id, 0, cell)
     254             : 
     255             : /**
     256             :  * @brief Equivalent to DT_CLOCKS_HAS_IDX(DT_DRV_INST(inst), idx)
     257             :  * @param inst DT_DRV_COMPAT instance number; may or may not have any clocks property
     258             :  * @param idx index of a clocks property phandle-array whose existence to check
     259             :  * @return 1 if the index exists, 0 otherwise
     260             :  */
     261           1 : #define DT_INST_CLOCKS_HAS_IDX(inst, idx) \
     262             :         DT_CLOCKS_HAS_IDX(DT_DRV_INST(inst), idx)
     263             : 
     264             : /**
     265             :  * @brief Equivalent to DT_CLOCK_HAS_NAME(DT_DRV_INST(inst), name)
     266             :  * @param inst DT_DRV_COMPAT instance number; may or may not have any clock-names property.
     267             :  * @param name lowercase-and-underscores clock-names cell value name to check
     268             :  * @return 1 if the clock name exists, 0 otherwise
     269             :  */
     270           1 : #define DT_INST_CLOCKS_HAS_NAME(inst, name) \
     271             :         DT_CLOCKS_HAS_NAME(DT_DRV_INST(inst), name)
     272             : 
     273             : /**
     274             :  * @brief Equivalent to DT_NUM_CLOCKS(DT_DRV_INST(inst))
     275             :  * @param inst instance number
     276             :  * @return number of elements in the clocks property
     277             :  */
     278           1 : #define DT_INST_NUM_CLOCKS(inst) \
     279             :         DT_NUM_CLOCKS(DT_DRV_INST(inst))
     280             : 
     281             : /**
     282             :  * @brief Get the node identifier for the controller phandle from a
     283             :  *        "clocks" phandle-array property at an index
     284             :  *
     285             :  * @param inst instance number
     286             :  * @param idx logical index into "clocks"
     287             :  * @return the node identifier for the clock controller referenced at
     288             :  *         index "idx"
     289             :  * @see DT_CLOCKS_CTLR_BY_IDX()
     290             :  */
     291           1 : #define DT_INST_CLOCKS_CTLR_BY_IDX(inst, idx) \
     292             :         DT_CLOCKS_CTLR_BY_IDX(DT_DRV_INST(inst), idx)
     293             : 
     294             : /**
     295             :  * @brief Equivalent to DT_INST_CLOCKS_CTLR_BY_IDX(inst, 0)
     296             :  * @param inst instance number
     297             :  * @return a node identifier for the clocks controller at index 0
     298             :  *         in "clocks"
     299             :  * @see DT_CLOCKS_CTLR()
     300             :  */
     301           1 : #define DT_INST_CLOCKS_CTLR(inst) DT_INST_CLOCKS_CTLR_BY_IDX(inst, 0)
     302             : 
     303             : /**
     304             :  * @brief Get the node identifier for the controller phandle from a
     305             :  *        clocks phandle-array property by name
     306             :  *
     307             :  * @param inst instance number
     308             :  * @param name lowercase-and-underscores name of a clocks element
     309             :  *             as defined by the node's clock-names property
     310             :  * @return the node identifier for the clock controller referenced by
     311             :  *         the named element
     312             :  * @see DT_CLOCKS_CTLR_BY_NAME()
     313             :  */
     314           1 : #define DT_INST_CLOCKS_CTLR_BY_NAME(inst, name) \
     315             :         DT_CLOCKS_CTLR_BY_NAME(DT_DRV_INST(inst), name)
     316             : 
     317             : /**
     318             :  * @brief Get a DT_DRV_COMPAT instance's clock specifier's cell value
     319             :  *        at an index
     320             :  * @param inst DT_DRV_COMPAT instance number
     321             :  * @param idx logical index into clocks property
     322             :  * @param cell lowercase-and-underscores cell name
     323             :  * @return the cell value at index "idx"
     324             :  * @see DT_CLOCKS_CELL_BY_IDX()
     325             :  */
     326           1 : #define DT_INST_CLOCKS_CELL_BY_IDX(inst, idx, cell) \
     327             :         DT_CLOCKS_CELL_BY_IDX(DT_DRV_INST(inst), idx, cell)
     328             : 
     329             : /**
     330             :  * @brief Get a DT_DRV_COMPAT instance's clock specifier's cell value by name
     331             :  * @param inst DT_DRV_COMPAT instance number
     332             :  * @param name lowercase-and-underscores name of a clocks element
     333             :  *             as defined by the node's clock-names property
     334             :  * @param cell lowercase-and-underscores cell name
     335             :  * @return the cell value in the specifier at the named element
     336             :  * @see DT_CLOCKS_CELL_BY_NAME()
     337             :  */
     338           1 : #define DT_INST_CLOCKS_CELL_BY_NAME(inst, name, cell) \
     339             :         DT_CLOCKS_CELL_BY_NAME(DT_DRV_INST(inst), name, cell)
     340             : 
     341             : /**
     342             :  * @brief Equivalent to DT_INST_CLOCKS_CELL_BY_IDX(inst, 0, cell)
     343             :  * @param inst DT_DRV_COMPAT instance number
     344             :  * @param cell lowercase-and-underscores cell name
     345             :  * @return the value of the cell inside the specifier at index 0
     346             :  */
     347           1 : #define DT_INST_CLOCKS_CELL(inst, cell) \
     348             :         DT_INST_CLOCKS_CELL_BY_IDX(inst, 0, cell)
     349             : 
     350             : /**
     351             :  * @}
     352             :  */
     353             : 
     354             : #ifdef __cplusplus
     355             : }
     356             : #endif
     357             : 
     358             : #endif  /* ZEPHYR_INCLUDE_DEVICETREE_CLOCKS_H_ */

Generated by: LCOV version 1.14