uart_sam0: don't consume CONFIG_UART_ASYNC_API directly.

There are situations in which the async API for uart can be provided
by another driver (case in point, uart_rtt), and thus there is no valid
DMA controller for the uart_sam0 driver to talk with.

By separating the configuration, there's no need to exclude samd20-based
boards (that have no DMA peripheral) from the uart_async_api tests.

Signed-off-by: Diego Elio Pettenò <flameeyes@meta.com>
Co-authored-by: Gerson Fernando Budke <nandojve@gmail.com>
This commit is contained in:
Diego Elio Pettenò 2023-08-19 10:37:32 +01:00 committed by Carles Cufí
parent 3b3528cd90
commit 4cada3ecaf
3 changed files with 19 additions and 33 deletions

View file

@ -9,8 +9,12 @@ config UART_SAM0
depends on DT_HAS_ATMEL_SAM0_UART_ENABLED
select SERIAL_HAS_DRIVER
select SERIAL_SUPPORT_INTERRUPT
# the ASYNC implementation requires a DMA controller
select SERIAL_SUPPORT_ASYNC if DT_HAS_ATMEL_SAM0_DMAC_ENABLED
select DMA if UART_ASYNC_API
help
This option enables the SERCOMx USART driver for Atmel SAM0 MCUs.
config UART_SAM0_ASYNC
bool "Async UART support for Atmel SAM0 series."
depends on DMA_SAM0
depends on UART_SAM0
depends on UART_ASYNC_API

View file

@ -43,10 +43,10 @@ struct uart_sam0_dev_cfg {
uint32_t pm_apbcmask;
uint16_t gclk_clkctrl_id;
#endif
#if CONFIG_UART_INTERRUPT_DRIVEN || CONFIG_UART_ASYNC_API
#if CONFIG_UART_INTERRUPT_DRIVEN || CONFIG_UART_SAM0_ASYNC
void (*irq_config_func)(const struct device *dev);
#endif
#if CONFIG_UART_ASYNC_API
#if CONFIG_UART_SAM0_ASYNC
const struct device *dma_dev;
uint8_t tx_dma_request;
uint8_t tx_dma_channel;
@ -64,7 +64,7 @@ struct uart_sam0_dev_data {
void *cb_data;
uint8_t txc_cache;
#endif
#if CONFIG_UART_ASYNC_API
#if CONFIG_UART_SAM0_ASYNC
const struct device *dev;
const struct uart_sam0_dev_cfg *cfg;
@ -126,7 +126,7 @@ static int uart_sam0_set_baudrate(SercomUsart *const usart, uint32_t baudrate,
}
#if CONFIG_UART_ASYNC_API
#if CONFIG_UART_SAM0_ASYNC
static void uart_sam0_dma_tx_done(const struct device *dma_dev, void *arg,
uint32_t id, int error_code)
@ -565,11 +565,11 @@ static int uart_sam0_init(const struct device *dev)
}
dev_data->config_cache.baudrate = cfg->baudrate;
#if CONFIG_UART_INTERRUPT_DRIVEN || CONFIG_UART_ASYNC_API
#if CONFIG_UART_INTERRUPT_DRIVEN || CONFIG_UART_SAM0_ASYNC
cfg->irq_config_func(dev);
#endif
#ifdef CONFIG_UART_ASYNC_API
#ifdef CONFIG_UART_SAM0_ASYNC
dev_data->dev = dev;
dev_data->cfg = cfg;
if (!device_is_ready(cfg->dma_dev)) {
@ -705,7 +705,7 @@ static int uart_sam0_err_check(const struct device *dev)
return err;
}
#if CONFIG_UART_INTERRUPT_DRIVEN || CONFIG_UART_ASYNC_API
#if CONFIG_UART_INTERRUPT_DRIVEN || CONFIG_UART_SAM0_ASYNC
static void uart_sam0_isr(const struct device *dev)
{
@ -717,7 +717,7 @@ static void uart_sam0_isr(const struct device *dev)
}
#endif
#if CONFIG_UART_ASYNC_API
#if CONFIG_UART_SAM0_ASYNC
const struct uart_sam0_dev_cfg *const cfg = dev->config;
SercomUsart * const regs = cfg->regs;
@ -936,14 +936,14 @@ static void uart_sam0_irq_callback_set(const struct device *dev,
dev_data->cb = cb;
dev_data->cb_data = cb_data;
#if defined(CONFIG_UART_EXCLUSIVE_API_CALLBACKS)
#if defined(CONFIG_UART_SAM0_ASYNC) && defined(CONFIG_UART_EXCLUSIVE_API_CALLBACKS)
dev_data->async_cb = NULL;
dev_data->async_cb_data = NULL;
#endif
}
#endif
#ifdef CONFIG_UART_ASYNC_API
#ifdef CONFIG_UART_SAM0_ASYNC
static int uart_sam0_callback_set(const struct device *dev,
uart_callback_t callback,
@ -1205,7 +1205,7 @@ static const struct uart_driver_api uart_sam0_driver_api = {
.irq_update = uart_sam0_irq_update,
.irq_callback_set = uart_sam0_irq_callback_set,
#endif
#if CONFIG_UART_ASYNC_API
#if CONFIG_UART_SAM0_ASYNC
.callback_set = uart_sam0_callback_set,
.tx = uart_sam0_tx,
.tx_abort = uart_sam0_tx_abort,
@ -1215,7 +1215,7 @@ static const struct uart_driver_api uart_sam0_driver_api = {
#endif
};
#if CONFIG_UART_INTERRUPT_DRIVEN || CONFIG_UART_ASYNC_API
#if CONFIG_UART_INTERRUPT_DRIVEN || CONFIG_UART_SAM0_ASYNC
#define SAM0_UART_IRQ_CONNECT(n, m) \
do { \
@ -1253,7 +1253,7 @@ static void uart_sam0_irq_config_##n(const struct device *dev) \
#define UART_SAM0_IRQ_HANDLER(n)
#endif
#if CONFIG_UART_ASYNC_API
#if CONFIG_UART_SAM0_ASYNC
#define UART_SAM0_DMA_CHANNELS(n) \
.dma_dev = DEVICE_DT_GET(ATMEL_SAM0_DT_INST_DMA_CTLR(n, tx)), \
.tx_dma_request = ATMEL_SAM0_DT_INST_DMA_TRIGSRC(n, tx), \

View file

@ -1,26 +1,8 @@
common:
platform_exclude:
- seeeduino_xiao
- serpente
- arduino_nano_33_iot
- atsamr21_xpro
- adafruit_itsybitsy_m4_express
- atsame54_xpro
- atsamc21n_xpro
- adafruit_trinket_m0
- arduino_nano_33_iot
- arduino_zero
- atsamd21_xpro
- adafruit_feather_m0_basic_proto
- adafruit_feather_m0_lora
- arduino_mkrzero
- atsaml21_xpro
- atsamr34_xpro
- stamp_c3
- wio_terminal
- xiao_esp32c3
- atsamd20_xpro
- ev11l78a
tags:
- drivers
- uart