@@ -76,6 +76,8 @@ struct npm13xx_charger_data {
7676#define ADC_OFFSET_RESULTS 0x10U
7777#define ADC_OFFSET_IBAT_EN 0x24U
7878
79+ #define ADC_CONV_TIME_US 250U
80+
7981/* nPM13xx VBUS register offsets */
8082#define VBUS_OFFSET_ILIMUPDATE 0x00U
8183#define VBUS_OFFSET_ILIM 0x01U
@@ -302,6 +304,17 @@ int npm13xx_charger_sample_fetch(const struct device *dev, enum sensor_channel c
302304 struct npm13xx_charger_data * data = dev -> data ;
303305 struct adc_results_t results ;
304306 int ret ;
307+ k_timepoint_t conv_done ;
308+
309+ /* Trigger current+voltage, NTC and die temp measurements (four in total) */
310+ ret = mfd_npm13xx_reg_write_burst (config -> mfd , ADC_BASE , ADC_OFFSET_TASK_VBAT ,
311+ (uint8_t []){1U , 1U , 1U }, 3U );
312+ if (ret != 0 ) {
313+ return ret ;
314+ }
315+
316+ /* Set timepoint for conversion and read status registers in the meantime */
317+ conv_done = sys_timepoint_calc (K_USEC (ADC_CONV_TIME_US * 4 ));
305318
306319 /* Read charge status and error reason */
307320 ret = mfd_npm13xx_reg_read (config -> mfd , CHGR_BASE , CHGR_OFFSET_CHG_STAT , & data -> status );
@@ -314,6 +327,14 @@ int npm13xx_charger_sample_fetch(const struct device *dev, enum sensor_channel c
314327 return ret ;
315328 }
316329
330+ /* Read vbus status */
331+ ret = mfd_npm13xx_reg_read (config -> mfd , VBUS_BASE , VBUS_OFFSET_STATUS , & data -> vbus_stat );
332+ if (ret != 0 ) {
333+ return ret ;
334+ }
335+
336+ k_sleep (sys_timepoint_timeout (conv_done ));
337+
317338 /* Read adc results */
318339 ret = mfd_npm13xx_reg_read_burst (config -> mfd , ADC_BASE , ADC_OFFSET_RESULTS , & results ,
319340 sizeof (results ));
@@ -327,21 +348,6 @@ int npm13xx_charger_sample_fetch(const struct device *dev, enum sensor_channel c
327348 data -> current = adc_get_res (results .msb_ibat , results .lsb_b , ADC_LSB_IBAT_SHIFT );
328349 data -> ibat_stat = results .ibat_stat ;
329350
330- /* Trigger ntc and die temperature measurements */
331- ret = mfd_npm13xx_reg_write2 (config -> mfd , ADC_BASE , ADC_OFFSET_TASK_TEMP , 1U , 1U );
332- if (ret != 0 ) {
333- return ret ;
334- }
335-
336- /* Trigger current and voltage measurement */
337- ret = mfd_npm13xx_reg_write (config -> mfd , ADC_BASE , ADC_OFFSET_TASK_VBAT , 1U );
338- if (ret != 0 ) {
339- return ret ;
340- }
341-
342- /* Read vbus status */
343- ret = mfd_npm13xx_reg_read (config -> mfd , VBUS_BASE , VBUS_OFFSET_STATUS , & data -> vbus_stat );
344-
345351 return ret ;
346352}
347353
@@ -354,9 +360,10 @@ static int set_ntc_thresholds(const struct npm13xx_charger_config *const config)
354360 /* Ref: Datasheet Figure 14: Equation for battery temperature */
355361 uint16_t code = (1024 * res ) / (res + config -> thermistor_ohms );
356362
357- int ret = mfd_npm13xx_reg_write2 (
363+ int ret = mfd_npm13xx_reg_write_burst (
358364 config -> mfd , CHGR_BASE , CHGR_OFFSET_NTC_TEMPS + (idx * 2U ),
359- code >> NTCTEMP_MSB_SHIFT , code & NTCTEMP_LSB_MASK );
365+ (uint8_t []){code >> NTCTEMP_MSB_SHIFT , code & NTCTEMP_LSB_MASK },
366+ 2U );
360367
361368 if (ret != 0 ) {
362369 return ret ;
@@ -377,9 +384,10 @@ static int set_dietemp_thresholds(const struct npm13xx_charger_config *const con
377384 DIETEMP_FACTOR_DIV ;
378385 uint16_t code = DIV_ROUND_CLOSEST (numerator , DIETEMP_FACTOR_MUL );
379386
380- int ret = mfd_npm13xx_reg_write2 (
387+ int ret = mfd_npm13xx_reg_write_burst (
381388 config -> mfd , CHGR_BASE , CHGR_OFFSET_DIE_TEMPS + (idx * 2U ),
382- code >> DIETEMP_MSB_SHIFT , code & DIETEMP_LSB_MASK );
389+ (uint8_t []){code >> DIETEMP_MSB_SHIFT , code & DIETEMP_LSB_MASK },
390+ 2U );
383391
384392 if (ret != 0 ) {
385393 return ret ;
@@ -582,16 +590,16 @@ int npm13xx_charger_init(const struct device *dev)
582590 ret = mfd_npm13xx_reg_write (config -> mfd , CHGR_BASE , CHGR_OFFSET_ISET , idx );
583591 } else {
584592 /* Set charge current MSB and LSB and discharge limit for nPM1300 */
585- ret = mfd_npm13xx_reg_write2 (config -> mfd , CHGR_BASE , CHGR_OFFSET_ISET , idx / 2U ,
586- idx & 1U );
593+ ret = mfd_npm13xx_reg_write_burst (config -> mfd , CHGR_BASE , CHGR_OFFSET_ISET ,
594+ ( uint8_t []){ idx / 2U , idx & 1U }, 2U );
587595 if (ret != 0 ) {
588596 return ret ;
589597 }
590598
591- ret = mfd_npm13xx_reg_write2 (
599+ ret = mfd_npm13xx_reg_write_burst (
592600 config -> mfd , CHGR_BASE , CHGR_OFFSET_ISET_DISCHG ,
593- npm1300_discharge_limits [config -> dischg_limit_idx ] / 2U ,
594- npm1300_discharge_limits [config -> dischg_limit_idx ] & 1U );
601+ ( uint8_t []){ npm1300_discharge_limits [config -> dischg_limit_idx ] / 2U ,
602+ npm1300_discharge_limits [config -> dischg_limit_idx ] & 1U }, 2U );
595603 }
596604 if (ret != 0 ) {
597605 return ret ;
@@ -628,18 +636,6 @@ int npm13xx_charger_init(const struct device *dev)
628636 return ret ;
629637 }
630638
631- /* Trigger current and voltage measurement */
632- ret = mfd_npm13xx_reg_write (config -> mfd , ADC_BASE , ADC_OFFSET_TASK_VBAT , 1U );
633- if (ret != 0 ) {
634- return ret ;
635- }
636-
637- /* Trigger ntc and die temperature measurements */
638- ret = mfd_npm13xx_reg_write2 (config -> mfd , ADC_BASE , ADC_OFFSET_TASK_TEMP , 1U , 1U );
639- if (ret != 0 ) {
640- return ret ;
641- }
642-
643639 /* Enable automatic temperature measurements during charging */
644640 ret = mfd_npm13xx_reg_write (config -> mfd , ADC_BASE , ADC_OFFSET_TASK_AUTO , 1U );
645641 if (ret != 0 ) {
0 commit comments