@@ -461,6 +461,8 @@ struct device {
461461 struct device_state * state ;
462462 /** Address of the device instance private data */
463463 void * data ;
464+ /** Initialization function (optional) */
465+ int (* init_fn )(const struct device * );
464466#if defined(CONFIG_DEVICE_DEPS ) || defined(__DOXYGEN__ )
465467 /**
466468 * Optional pointer to dependencies associated with the device.
@@ -1055,6 +1057,7 @@ device_get_dt_nodelabels(const struct device *dev)
10551057 * @brief Initializer for @ref device.
10561058 *
10571059 * @param name_ Name of the device.
1060+ * @param init_fn_ Init function (optional).
10581061 * @param pm_ Reference to @ref pm_device_base (optional).
10591062 * @param data_ Reference to device data.
10601063 * @param config_ Reference to device config.
@@ -1064,14 +1067,15 @@ device_get_dt_nodelabels(const struct device *dev)
10641067 * @param node_id_ Devicetree node identifier
10651068 * @param dev_id_ Device identifier token, as passed to Z_DEVICE_BASE_DEFINE
10661069 */
1067- #define Z_DEVICE_INIT (name_ , pm_ , data_ , config_ , api_ , state_ , deps_ , node_id_ , \
1068- dev_id_ ) \
1070+ #define Z_DEVICE_INIT (name_ , init_fn_ , pm_ , data_ , config_ , api_ , state_ , deps_ , \
1071+ node_id_ , dev_id_ ) \
10691072 { \
10701073 .name = name_, \
10711074 .config = (config_), \
10721075 .api = (api_), \
10731076 .state = (state_), \
10741077 .data = (data_), \
1078+ .init_fn = (init_fn_), \
10751079 IF_ENABLED(CONFIG_DEVICE_DEPS, (.deps = (deps_),)) /**/ \
10761080 IF_ENABLED (CONFIG_PM_DEVICE , Z_DEVICE_INIT_PM_BASE (pm_ )) /**/ \
10771081 IF_ENABLED (CONFIG_DEVICE_DT_METADATA , \
@@ -1107,6 +1111,7 @@ device_get_dt_nodelabels(const struct device *dev)
11071111 * software device).
11081112 * @param dev_id Device identifier (used to name the defined @ref device).
11091113 * @param name Name of the device.
1114+ * @param init_fn Init function.
11101115 * @param pm Reference to @ref pm_device_base associated with the device.
11111116 * (optional).
11121117 * @param data Reference to device data.
@@ -1116,14 +1121,14 @@ device_get_dt_nodelabels(const struct device *dev)
11161121 * @param api Reference to device API.
11171122 * @param ... Optional dependencies, manually specified.
11181123 */
1119- #define Z_DEVICE_BASE_DEFINE (node_id , dev_id , name , pm , data , config , level , prio , api , state , \
1120- deps ) \
1124+ #define Z_DEVICE_BASE_DEFINE (node_id , dev_id , name , init_fn , pm , data , config , level , prio , api , \
1125+ state , deps ) \
11211126 COND_CODE_1(DT_NODE_EXISTS(node_id), (), (static)) \
11221127 COND_CODE_1(Z_DEVICE_IS_MUTABLE(node_id), (), (const)) \
11231128 STRUCT_SECTION_ITERABLE_NAMED_ALTERNATE( \
11241129 device, COND_CODE_1(Z_DEVICE_IS_MUTABLE(node_id), (device_mutable), (device)), \
11251130 Z_DEVICE_SECTION_NAME(level, prio), DEVICE_NAME_GET(dev_id)) = \
1126- Z_DEVICE_INIT(name, pm, data, config, api, state, deps, node_id, dev_id)
1131+ Z_DEVICE_INIT(name, init_fn, pm, data, config, api, state, deps, node_id, dev_id)
11271132
11281133/**
11291134 * @brief Issue an error if the given init level is not supported.
@@ -1142,32 +1147,27 @@ device_get_dt_nodelabels(const struct device *dev)
11421147 * @param node_id Devicetree node id for the device (DT_INVALID_NODE if a
11431148 * software device).
11441149 * @param dev_id Device identifier.
1145- * @param init_fn_ Device init function.
11461150 * @param level Initialization level.
11471151 * @param prio Initialization priority.
11481152 */
1149- #define Z_DEVICE_INIT_ENTRY_DEFINE (node_id , dev_id , init_fn_ , level , prio ) \
1153+ #define Z_DEVICE_INIT_ENTRY_DEFINE (node_id , dev_id , level , prio ) \
11501154 Z_DEVICE_CHECK_INIT_LEVEL(level) \
11511155 \
11521156 static const Z_DECL_ALIGN(struct init_entry) __used __noasan Z_INIT_ENTRY_SECTION( \
11531157 level, prio, Z_DEVICE_INIT_SUB_PRIO(node_id)) \
11541158 Z_INIT_ENTRY_NAME(DEVICE_NAME_GET(dev_id)) = { \
11551159 COND_CODE_1(Z_DEVICE_IS_MUTABLE(node_id), \
1156- (.init_fn = { .dev_rw = init_fn_ }, \
1157- .dev = { .dev_rw = &DEVICE_NAME_GET(dev_id)}), \
1158- (.init_fn = { .dev = init_fn_ }, \
1159- .dev = { .dev = &DEVICE_NAME_GET(dev_id)})) \
1160+ (.dev = { .dev_rw = &DEVICE_NAME_GET(dev_id)}), \
1161+ (.dev = { .dev = &DEVICE_NAME_GET(dev_id)})) \
11601162 }
11611163
1162- #define Z_DEFER_DEVICE_INIT_ENTRY_DEFINE (node_id , dev_id , init_fn_ ) \
1164+ #define Z_DEFER_DEVICE_INIT_ENTRY_DEFINE (node_id , dev_id ) \
11631165 static const Z_DECL_ALIGN(struct init_entry) __used __noasan \
11641166 __attribute__((__section__(".z_deferred_init"))) \
11651167 Z_INIT_ENTRY_NAME(DEVICE_NAME_GET(dev_id)) = { \
11661168 COND_CODE_1(Z_DEVICE_IS_MUTABLE(node_id), \
1167- (.init_fn = { .dev_rw = init_fn_ }, \
1168- .dev = { .dev_rw = &DEVICE_NAME_GET(dev_id)}), \
1169- (.init_fn = { .dev = init_fn_ }, \
1170- .dev = { .dev = &DEVICE_NAME_GET(dev_id)})) \
1169+ (.dev = { .dev_rw = &DEVICE_NAME_GET(dev_id)}), \
1170+ (.dev = { .dev = &DEVICE_NAME_GET(dev_id)})) \
11711171 }
11721172
11731173/**
@@ -1202,13 +1202,11 @@ device_get_dt_nodelabels(const struct device *dev)
12021202 (IF_ENABLED(DT_NODE_EXISTS(node_id), \
12031203 (Z_DEVICE_DT_METADATA_DEFINE(node_id, dev_id);))))\
12041204 \
1205- Z_DEVICE_BASE_DEFINE(node_id, dev_id, name, pm, data, config, level, \
1206- prio, api, state, Z_DEVICE_DEPS_NAME(dev_id)); \
1205+ Z_DEVICE_BASE_DEFINE(node_id, dev_id, name, init_fn, pm, data, config, \
1206+ level, prio, api, state, Z_DEVICE_DEPS_NAME(dev_id)); \
12071207 COND_CODE_1(DEVICE_DT_DEFER(node_id), \
1208- (Z_DEFER_DEVICE_INIT_ENTRY_DEFINE(node_id, dev_id, \
1209- init_fn)), \
1210- (Z_DEVICE_INIT_ENTRY_DEFINE(node_id, dev_id, init_fn, \
1211- level, prio))); \
1208+ (Z_DEFER_DEVICE_INIT_ENTRY_DEFINE(node_id, dev_id)), \
1209+ (Z_DEVICE_INIT_ENTRY_DEFINE(node_id, dev_id, level, prio)));\
12121210 IF_ENABLED(CONFIG_LLEXT_EXPORT_DEVICES, \
12131211 (IF_ENABLED(DT_NODE_EXISTS(node_id), \
12141212 (Z_DEVICE_EXPORT(node_id);))))
0 commit comments