@@ -100,7 +100,6 @@ static int max30101_init(const struct device *dev)
100100 uint8_t part_id ;
101101 uint8_t mode_cfg ;
102102 uint32_t led_chan ;
103- int fifo_chan ;
104103
105104 if (!device_is_ready (config -> i2c .bus )) {
106105 LOG_ERR ("Bus device is not ready" );
@@ -142,7 +141,7 @@ static int max30101_init(const struct device *dev)
142141
143142 /* Write the mode configuration register */
144143 if (i2c_reg_write_byte_dt (& config -> i2c , MAX30101_REG_MODE_CFG ,
145- config -> mode )) {
144+ max30101_mode_convert [ config -> mode ] )) {
146145 return - EIO ;
147146 }
148147
@@ -165,23 +164,24 @@ static int max30101_init(const struct device *dev)
165164 config -> led_pa [2 ])) {
166165 return - EIO ;
167166 }
167+ if (i2c_reg_write_byte_dt (& config -> i2c , MAX30101_REG_LED4_PA , config -> led_pa [2 ])) {
168+ return - EIO ;
169+ }
168170
169- #ifdef CONFIG_MAX30101_MULTI_LED_MODE
170- uint8_t multi_led [2 ];
171+ if (! config -> mode ) {
172+ uint8_t multi_led [2 ];
171173
172- /* Write the multi-LED mode control registers */
173- multi_led [0 ] = (config -> slot [1 ] << 4 ) | (config -> slot [0 ]);
174- multi_led [1 ] = (config -> slot [3 ] << 4 ) | (config -> slot [2 ]);
174+ /* Write the multi-LED mode control registers */
175+ multi_led [0 ] = (config -> slot [1 ] << 4 ) | (config -> slot [0 ]);
176+ multi_led [1 ] = (config -> slot [3 ] << 4 ) | (config -> slot [2 ]);
175177
176- if (i2c_reg_write_byte_dt (& config -> i2c , MAX30101_REG_MULTI_LED ,
177- multi_led [0 ])) {
178- return - EIO ;
179- }
180- if (i2c_reg_write_byte_dt (& config -> i2c , MAX30101_REG_MULTI_LED + 1 ,
181- multi_led [1 ])) {
182- return - EIO ;
178+ if (i2c_reg_write_byte_dt (& config -> i2c , MAX30101_REG_MULTI_LED , multi_led [0 ])) {
179+ return - EIO ;
180+ }
181+ if (i2c_reg_write_byte_dt (& config -> i2c , MAX30101_REG_MULTI_LED + 1 , multi_led [1 ])) {
182+ return - EIO ;
183+ }
183184 }
184- #endif
185185
186186 /* Initialize the channel map and active channel count */
187187 data -> num_channels = 0U ;
@@ -192,9 +192,8 @@ static int max30101_init(const struct device *dev)
192192 /* Count the number of active channels and build a map that translates
193193 * the LED channel number (red/ir/green) to the fifo channel number.
194194 */
195- for (fifo_chan = 0 ; fifo_chan < MAX30101_MAX_NUM_CHANNELS ;
196- fifo_chan ++ ) {
197- led_chan = (config -> slot [fifo_chan ] & MAX30101_SLOT_LED_MASK )- 1 ;
195+ for (int fifo_chan = 0 ; fifo_chan < MAX30101_MAX_NUM_CHANNELS ; fifo_chan ++ ) {
196+ led_chan = (config -> slot [fifo_chan ] & MAX30101_SLOT_LED_MASK ) - 1 ;
198197 if (led_chan < MAX30101_MAX_NUM_CHANNELS ) {
199198 data -> map [led_chan ] = fifo_chan ;
200199 data -> num_channels ++ ;
@@ -204,47 +203,39 @@ static int max30101_init(const struct device *dev)
204203 return 0 ;
205204}
206205
207- static struct max30101_config max30101_config = {
208- .i2c = I2C_DT_SPEC_INST_GET (0 ),
209- .fifo = (CONFIG_MAX30101_SMP_AVE << MAX30101_FIFO_CFG_SMP_AVE_SHIFT ) |
210- #ifdef CONFIG_MAX30101_FIFO_ROLLOVER_EN
211- MAX30101_FIFO_CFG_ROLLOVER_EN_MASK |
212- #endif
213- (CONFIG_MAX30101_FIFO_A_FULL <<
214- MAX30101_FIFO_CFG_FIFO_FULL_SHIFT ),
215-
216- #if defined(CONFIG_MAX30101_HEART_RATE_MODE )
217- .mode = MAX30101_MODE_HEART_RATE ,
218- .slot [0 ] = MAX30101_SLOT_RED_LED1_PA ,
219- .slot [1 ] = MAX30101_SLOT_DISABLED ,
220- .slot [2 ] = MAX30101_SLOT_DISABLED ,
221- .slot [3 ] = MAX30101_SLOT_DISABLED ,
222- #elif defined(CONFIG_MAX30101_SPO2_MODE )
223- .mode = MAX30101_MODE_SPO2 ,
224- .slot [0 ] = MAX30101_SLOT_RED_LED1_PA ,
225- .slot [1 ] = MAX30101_SLOT_IR_LED2_PA ,
226- .slot [2 ] = MAX30101_SLOT_DISABLED ,
227- .slot [3 ] = MAX30101_SLOT_DISABLED ,
228- #else
229- .mode = MAX30101_MODE_MULTI_LED ,
230- .slot [0 ] = CONFIG_MAX30101_SLOT1 ,
231- .slot [1 ] = CONFIG_MAX30101_SLOT2 ,
232- .slot [2 ] = CONFIG_MAX30101_SLOT3 ,
233- .slot [3 ] = CONFIG_MAX30101_SLOT4 ,
234- #endif
235-
236- .spo2 = (CONFIG_MAX30101_ADC_RGE << MAX30101_SPO2_ADC_RGE_SHIFT ) |
237- (CONFIG_MAX30101_SR << MAX30101_SPO2_SR_SHIFT ) |
238- (MAX30101_PW_18BITS << MAX30101_SPO2_PW_SHIFT ),
239-
240- .led_pa [0 ] = CONFIG_MAX30101_LED1_PA ,
241- .led_pa [1 ] = CONFIG_MAX30101_LED2_PA ,
242- .led_pa [2 ] = CONFIG_MAX30101_LED3_PA ,
243- };
244-
245- static struct max30101_data max30101_data ;
246-
247- SENSOR_DEVICE_DT_INST_DEFINE (0 , max30101_init , NULL ,
248- & max30101_data , & max30101_config ,
249- POST_KERNEL , CONFIG_SENSOR_INIT_PRIORITY ,
250- & max30101_driver_api );
206+ #define MAX30101_CHECK (n ) \
207+ BUILD_ASSERT(DT_INST_PROP_LEN(n, led_pa) == 3, \
208+ "MAX30101 led-pa property must have exactly 3 elements"); \
209+ BUILD_ASSERT(DT_INST_PROP_LEN(n, led_slot) == 4, \
210+ "MAX30101 led-slot property must have exactly 4 elements")
211+
212+ #define MAX30101_SLOT_CFG (n ) \
213+ COND_CODE_1(DT_INST_ENUM_HAS_VALUE(n, acq_mode, heart_rate), \
214+ (MAX30101_HR_SLOTS), \
215+ (COND_CODE_1(DT_INST_ENUM_HAS_VALUE(n, acq_mode, spo2), \
216+ (MAX30101_SPO2_SLOTS), \
217+ (MAX30101_MULTI_LED(n)) \
218+ )) \
219+ )
220+
221+ #define MAX30101_INIT (n ) \
222+ MAX30101_CHECK(n); \
223+ static const struct max30101_config max30101_config_##n = { \
224+ .i2c = I2C_DT_SPEC_INST_GET(n), \
225+ .fifo = (DT_INST_ENUM_IDX(n, smp_ave) << MAX30101_FIFO_CFG_SMP_AVE_SHIFT) | \
226+ (DT_INST_PROP(n, fifo_rollover_en) \
227+ << MAX30101_FIFO_CFG_ROLLOVER_EN_SHIFT) | \
228+ (DT_INST_PROP(n, fifo_a_full) << MAX30101_FIFO_CFG_FIFO_FULL_SHIFT), \
229+ .mode = DT_INST_ENUM_IDX(n, acq_mode), \
230+ .spo2 = (DT_INST_ENUM_IDX(n, adc_rge) << MAX30101_SPO2_ADC_RGE_SHIFT) | \
231+ (DT_INST_ENUM_IDX(n, smp_sr) << MAX30101_SPO2_SR_SHIFT) | \
232+ (DT_INST_ENUM_IDX(n, led_pw) << MAX30101_SPO2_PW_SHIFT), \
233+ .led_pa = DT_INST_PROP(n, led_pa), \
234+ .slot = MAX30101_SLOT_CFG(n), \
235+ }; \
236+ static struct max30101_data max30101_data_##n; \
237+ SENSOR_DEVICE_DT_INST_DEFINE(n, max30101_init, NULL, &max30101_data_##n, \
238+ &max30101_config_##n, POST_KERNEL, \
239+ CONFIG_SENSOR_INIT_PRIORITY, &max30101_driver_api);
240+
241+ DT_INST_FOREACH_STATUS_OKAY (MAX30101_INIT )
0 commit comments