@@ -219,6 +219,7 @@ struct uarte_nrfx_data {
219219
220220#define  UARTE_FLAG_LOW_POWER_TX  BIT(0)
221221#define  UARTE_FLAG_LOW_POWER_RX  BIT(1)
222+ #define  UARTE_FLAG_LOW_POWER  (UARTE_FLAG_LOW_POWER_TX | UARTE_FLAG_LOW_POWER_RX)
222223#define  UARTE_FLAG_TRIG_RXTO  BIT(2)
223224#define  UARTE_FLAG_POLL_OUT  BIT(3)
224225
@@ -617,11 +618,13 @@ static void uarte_periph_enable(const struct device *dev)
617618	}
618619}
619620
620- static  void  uarte_enable (const  struct  device  * dev , uint32_t  act_mask ,  uint32_t   sec_mask )
621+ static  void  uarte_enable_locked (const  struct  device  * dev , uint32_t  act_mask )
621622{
622623	struct  uarte_nrfx_data  * data  =  dev -> data ;
624+ 	bool  already_active  =  (data -> flags  &  UARTE_FLAG_LOW_POWER ) !=  0 ;
623625
624- 	if  (atomic_or (& data -> flags , act_mask ) &  sec_mask ) {
626+ 	data -> flags  |= act_mask ;
627+ 	if  (already_active ) {
625628		/* Second direction already enabled so UARTE is enabled. */ 
626629		return ;
627630	}
@@ -657,7 +660,7 @@ static void tx_start(const struct device *dev, const uint8_t *buf, size_t len)
657660	nrf_uarte_event_clear (uarte , NRF_UARTE_EVENT_TXSTOPPED );
658661
659662	if  (LOW_POWER_ENABLED (config )) {
660- 		uarte_enable (dev , UARTE_FLAG_LOW_POWER_TX ,  UARTE_FLAG_LOW_POWER_RX );
663+ 		uarte_enable_locked (dev , UARTE_FLAG_LOW_POWER_TX );
661664	}
662665
663666	nrf_uarte_task_trigger (uarte , NRF_UARTE_TASK_STARTTX );
@@ -673,14 +676,13 @@ static void tx_start(const struct device *dev, const uint8_t *buf, size_t len)
673676 * here. 
674677 * @param dev Device. 
675678 * @param dis_mask Mask of direction (RX or TX) which now longer uses the UARTE instance. 
676-  * @param sec_mask Mask of second direction which is used to check if it uses the UARTE. 
677679 */ 
678- static  void  uarte_disable_locked (const  struct  device  * dev , uint32_t  dis_mask ,  uint32_t   sec_mask )
680+ static  void  uarte_disable_locked (const  struct  device  * dev , uint32_t  dis_mask )
679681{
680682	struct  uarte_nrfx_data  * data  =  dev -> data ;
681683
682684	data -> flags  &= ~dis_mask ;
683- 	if  (data -> flags  &  sec_mask ) {
685+ 	if  (data -> flags  &  UARTE_FLAG_LOW_POWER ) {
684686		return ;
685687	}
686688
@@ -1056,7 +1058,7 @@ static int uarte_nrfx_rx_enable(const struct device *dev, uint8_t *buf,
10561058	} else  if  (LOW_POWER_ENABLED (cfg )) {
10571059		unsigned int   key  =  irq_lock ();
10581060
1059- 		uarte_enable (dev , UARTE_FLAG_LOW_POWER_RX ,  UARTE_FLAG_LOW_POWER_TX );
1061+ 		uarte_enable_locked (dev , UARTE_FLAG_LOW_POWER_RX );
10601062		irq_unlock (key );
10611063	}
10621064
@@ -1531,7 +1533,7 @@ static void rxto_isr(const struct device *dev)
15311533	} else  if  (LOW_POWER_ENABLED (config )) {
15321534		uint32_t  key  =  irq_lock ();
15331535
1534- 		uarte_disable_locked (dev , UARTE_FLAG_LOW_POWER_RX ,  UARTE_FLAG_LOW_POWER_TX );
1536+ 		uarte_disable_locked (dev , UARTE_FLAG_LOW_POWER_RX );
15351537		irq_unlock (key );
15361538	}
15371539
@@ -1558,7 +1560,7 @@ static void txstopped_isr(const struct device *dev)
15581560		}
15591561	} else  if  (LOW_POWER_ENABLED (config )) {
15601562		nrf_uarte_int_disable (uarte , NRF_UARTE_INT_TXSTOPPED_MASK );
1561- 		uarte_disable_locked (dev , UARTE_FLAG_LOW_POWER_TX ,  UARTE_FLAG_LOW_POWER_RX );
1563+ 		uarte_disable_locked (dev , UARTE_FLAG_LOW_POWER_TX );
15621564	}
15631565
15641566	irq_unlock (key );
0 commit comments