@@ -231,8 +231,10 @@ static int uart_npcx_fifo_fill(const struct device *dev, const uint8_t *tx_data,
231
231
}
232
232
#ifdef CONFIG_PM
233
233
uart_npcx_pm_policy_state_lock_get (data , UART_PM_POLICY_STATE_TX_FLAG );
234
+ #if !defined(CONFIG_UART_NPCX_FIFO_EX )
234
235
/* Enable NXMIP interrupt in case ec enters deep sleep early */
235
236
inst -> UFTCTL |= BIT (NPCX_UFTCTL_NXMIP_EN );
237
+ #endif /* CONFIG_UART_NPCX_FIFO_EX */
236
238
#endif /* CONFIG_PM */
237
239
k_spin_unlock (& data -> lock , key );
238
240
@@ -258,32 +260,49 @@ static void uart_npcx_irq_tx_enable(const struct device *dev)
258
260
{
259
261
const struct uart_npcx_config * const config = dev -> config ;
260
262
struct uart_reg * const inst = config -> inst ;
263
+ struct uart_npcx_data * data = dev -> data ;
264
+ k_spinlock_key_t key = k_spin_lock (& data -> lock );
261
265
262
266
#if defined(CONFIG_UART_NPCX_FIFO_EX )
263
267
inst -> UICTRL |= BIT (NPCX_UICTRL_ETI );
264
268
#else
265
- struct uart_npcx_data * data = dev -> data ;
266
- k_spinlock_key_t key = k_spin_lock (& data -> lock );
267
-
268
269
inst -> UFTCTL |= BIT (NPCX_UFTCTL_TEMPTY_EN );
269
- k_spin_unlock (& data -> lock , key );
270
270
#endif
271
+
272
+ k_spin_unlock (& data -> lock , key );
271
273
}
272
274
273
275
static void uart_npcx_irq_tx_disable (const struct device * dev )
274
276
{
275
277
const struct uart_npcx_config * const config = dev -> config ;
276
278
struct uart_reg * const inst = config -> inst ;
279
+ struct uart_npcx_data * data = dev -> data ;
280
+ k_spinlock_key_t key ;
277
281
278
282
#if defined(CONFIG_UART_NPCX_FIFO_EX )
279
- inst -> UICTRL &= ~(BIT (NPCX_UICTRL_ETI ));
283
+ #if defined(CONFIG_PM )
284
+ /*
285
+ * Since TBE is 1 does not mean that the Tx FIFO is empty, we need to check
286
+ * the UTXFLV register to make sure that the Tx FIFO is empty.
287
+ */
288
+ if (IS_BIT_SET (inst -> UICTRL , NPCX_UICTRL_ETI ) &&
289
+ IS_BIT_SET (inst -> UICTRL , NPCX_UICTRL_TBE ) &&
290
+ (inst -> UTXFLV == 0 )) {
291
+ /* Wait for transmitting is completed */
292
+ while (IS_BIT_SET (inst -> USTAT , NPCX_USTAT_XMIP )) {
293
+ ;
294
+ }
295
+ uart_npcx_pm_policy_state_lock_put (data , UART_PM_POLICY_STATE_TX_FLAG );
296
+ }
297
+ #endif /* CONFIG_PM */
298
+ key = k_spin_lock (& data -> lock );
299
+ inst -> UICTRL &= ~BIT (NPCX_UICTRL_ETI );
300
+ k_spin_unlock (& data -> lock , key );
280
301
#else
281
- struct uart_npcx_data * data = dev -> data ;
282
- k_spinlock_key_t key = k_spin_lock (& data -> lock );
283
-
284
- inst -> UFTCTL &= ~(BIT (NPCX_UFTCTL_TEMPTY_EN ));
302
+ key = k_spin_lock (& data -> lock );
303
+ inst -> UFTCTL &= ~BIT (NPCX_UFTCTL_TEMPTY_EN );
285
304
k_spin_unlock (& data -> lock , key );
286
- #endif
305
+ #endif /* CONFIG_UART_NPCX_FIFO_EX */
287
306
}
288
307
289
308
static bool uart_npcx_irq_tx_is_enabled (const struct device * dev )
@@ -310,7 +329,7 @@ static int uart_npcx_irq_tx_complete(const struct device *dev)
310
329
311
330
/* Tx FIFO is empty or last byte is sending */
312
331
#if defined(CONFIG_UART_NPCX_FIFO_EX )
313
- return inst -> UTXFLV == 0 ;
332
+ return ( inst -> UTXFLV == 0 ) && ! IS_BIT_SET ( inst -> USTAT , NPCX_USTAT_XMIP ) ;
314
333
#else
315
334
return IS_BIT_SET (inst -> UFTSTS , NPCX_UFTSTS_NXMIP );
316
335
#endif
@@ -334,9 +353,9 @@ static void uart_npcx_irq_rx_disable(const struct device *dev)
334
353
struct uart_reg * const inst = config -> inst ;
335
354
336
355
#if defined(CONFIG_UART_NPCX_FIFO_EX )
337
- inst -> UICTRL &= ~( BIT (NPCX_UICTRL_ERI ) );
356
+ inst -> UICTRL &= ~BIT (NPCX_UICTRL_ERI );
338
357
#else
339
- inst -> UFRCTL &= ~( BIT (NPCX_UFRCTL_RNEMPTY_EN ) );
358
+ inst -> UFRCTL &= ~BIT (NPCX_UFRCTL_RNEMPTY_EN );
340
359
#endif
341
360
}
342
361
@@ -370,7 +389,7 @@ static void uart_npcx_irq_err_disable(const struct device *dev)
370
389
const struct uart_npcx_config * const config = dev -> config ;
371
390
struct uart_reg * const inst = config -> inst ;
372
391
373
- inst -> UICTRL &= ~( BIT (NPCX_UICTRL_EEI ) );
392
+ inst -> UICTRL &= ~BIT (NPCX_UICTRL_EEI );
374
393
}
375
394
376
395
static int uart_npcx_irq_is_pending (const struct device * dev )
@@ -743,7 +762,7 @@ static int uart_npcx_async_rx_disable(const struct device *dev)
743
762
LOG_DBG ("Async RX Disable" );
744
763
745
764
key = irq_lock ();
746
- inst -> UFRCTL &= ~( BIT (NPCX_UFRCTL_RNEMPTY_EN ) );
765
+ inst -> UFRCTL &= ~BIT (NPCX_UFRCTL_RNEMPTY_EN );
747
766
748
767
k_work_cancel_delayable (& rx_dma_params -> timeout_work );
749
768
@@ -858,10 +877,6 @@ static void uart_npcx_async_dma_rx_complete(const struct device *dev)
858
877
static void uart_npcx_isr (const struct device * dev )
859
878
{
860
879
struct uart_npcx_data * data = dev -> data ;
861
- #if defined(CONFIG_PM ) || defined(CONFIG_UART_ASYNC_API )
862
- const struct uart_npcx_config * const config = dev -> config ;
863
- struct uart_reg * const inst = config -> inst ;
864
- #endif
865
880
866
881
/*
867
882
* Set pm constraint to prevent the system enter suspend state within
@@ -882,8 +897,11 @@ static void uart_npcx_isr(const struct device *dev)
882
897
}
883
898
#endif
884
899
900
+ #if !defined(CONFIG_UART_NPCX_FIFO_EX )
885
901
#ifdef CONFIG_UART_ASYNC_API
886
902
if (data -> async .user_callback ) {
903
+ const struct uart_npcx_config * const config = dev -> config ;
904
+ struct uart_reg * const inst = config -> inst ;
887
905
struct mdma_reg * const mdma_reg_base = config -> mdma_reg_base ;
888
906
889
907
/*
@@ -935,10 +953,12 @@ static void uart_npcx_isr(const struct device *dev)
935
953
}
936
954
}
937
955
}
938
- #endif
956
+ #endif /* CONFIG_UART_ASYNC_API */
939
957
940
- #if !defined(CONFIG_UART_NPCX_FIFO_EX )
941
958
#if defined(CONFIG_PM ) || defined(CONFIG_UART_ASYNC_API )
959
+ const struct uart_npcx_config * const config = dev -> config ;
960
+ struct uart_reg * const inst = config -> inst ;
961
+
942
962
if (IS_BIT_SET (inst -> UFTCTL , NPCX_UFTCTL_NXMIP_EN ) &&
943
963
IS_BIT_SET (inst -> UFTSTS , NPCX_UFTSTS_NXMIP )) {
944
964
k_spinlock_key_t key = k_spin_lock (& data -> lock );
@@ -957,10 +977,10 @@ static void uart_npcx_isr(const struct device *dev)
957
977
}
958
978
#endif
959
979
}
960
- #endif
961
- #endif
980
+ #endif /* CONFIG_PM || CONFIG_UART_ASYNC_API */
981
+ #endif /* !CONFIG_UART_NPCX_FIFO_EX */
962
982
}
963
- #endif
983
+ #endif /* CONFIG_UART_INTERRUPT_DRIVEN || CONFIG_UART_ASYNC_API */
964
984
965
985
/* UART api functions */
966
986
static int uart_npcx_err_check (const struct device * dev )
0 commit comments