@@ -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