Skip to content

Commit 6c6e8e5

Browse files
ttmutfabiobaltieri
authored andcommitted
drivers: serial: uart_max32: Refactor IRQ flag clearing
api_irq_update was clearing TX interrupt flags before the TX interrupt could be served, breaking synchronization in time-sensitive applications. Changes: 1. Remove unnecessary MXC_UART_ClearFlags() calls in api_fifo_read() and api_irq_update to avoid premature flag clearing; ISR handler already clears them after returning from the callback. 2. Replace raw flag checks in irq_is_pending() with more complete api_irq_rx_ready() and api_irq_tx_ready(). Signed-off-by: Tahsin Mutlugun <[email protected]>
1 parent a8d0a77 commit 6c6e8e5

File tree

1 file changed

+1
-8
lines changed

1 file changed

+1
-8
lines changed

drivers/serial/uart_max32.c

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -367,9 +367,6 @@ static int api_fifo_read(const struct device *dev, uint8_t *rx_data, const int s
367367
const struct max32_uart_config *cfg = dev->config;
368368

369369
num_rx = MXC_UART_ReadRXFIFO(cfg->regs, (unsigned char *)rx_data, size);
370-
if (num_rx == 0) {
371-
MXC_UART_ClearFlags(cfg->regs, ADI_MAX32_UART_INT_RX);
372-
}
373370

374371
return num_rx;
375372
}
@@ -438,9 +435,7 @@ static void api_irq_err_disable(const struct device *dev)
438435

439436
static int api_irq_is_pending(const struct device *dev)
440437
{
441-
struct max32_uart_data *const data = dev->data;
442-
443-
return (data->flags & (ADI_MAX32_UART_INT_RX | ADI_MAX32_UART_INT_TX));
438+
return api_irq_rx_ready(dev) || api_irq_tx_ready(dev);
444439
}
445440

446441
static int api_irq_update(const struct device *dev)
@@ -451,8 +446,6 @@ static int api_irq_update(const struct device *dev)
451446
data->flags = MXC_UART_GetFlags(cfg->regs);
452447
data->status = MXC_UART_GetStatus(cfg->regs);
453448

454-
MXC_UART_ClearFlags(cfg->regs, data->flags);
455-
456449
return 1;
457450
}
458451

0 commit comments

Comments
 (0)