From e48053fdb5e90ead92936a4b7fd6857aa248e033 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Chru=C5=9Bci=C5=84ski?= Date: Mon, 22 Apr 2024 12:26:24 +0200 Subject: [PATCH] drivers: serial: async_to_irq: Fix initialization MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Callback was set in uart_async_to_irq_rx_enable() which is only called when RX is enabled. Callback shall be called in the init function. uart_async_to_irq_init() signature changed to take device as the input argument instead of data and config for the adaptation layer (which can be retrieved from the device). Device is needed when setting a callback during the initialization. Signed-off-by: Krzysztof Chruściński --- drivers/serial/uart_async_to_irq.c | 19 ++++++++++--------- drivers/serial/uart_nrfx_uarte2.c | 2 +- .../zephyr/drivers/serial/uart_async_to_irq.h | 6 ++---- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/drivers/serial/uart_async_to_irq.c b/drivers/serial/uart_async_to_irq.c index f1825eb398e..897ff50fcb5 100644 --- a/drivers/serial/uart_async_to_irq.c +++ b/drivers/serial/uart_async_to_irq.c @@ -336,15 +336,8 @@ void z_uart_async_to_irq_irq_callback_set(const struct device *dev, int uart_async_to_irq_rx_enable(const struct device *dev) { struct uart_async_to_irq_data *data = get_data(dev); - const struct uart_async_to_irq_config *config = get_config(dev); int err; - err = config->api->callback_set(dev, uart_async_to_irq_callback, data); - if (err < 0) { - return err; - } - - err = try_rx_enable(dev, data); if (err == 0) { atomic_or(&data->flags, A2I_RX_ENABLE); @@ -381,13 +374,21 @@ void uart_async_to_irq_trampoline_cb(const struct device *dev) } while (atomic_dec(&data->irq_req) > 1); } -int uart_async_to_irq_init(struct uart_async_to_irq_data *data, - const struct uart_async_to_irq_config *config) +int uart_async_to_irq_init(const struct device *dev) { + struct uart_async_to_irq_data *data = get_data(dev); + const struct uart_async_to_irq_config *config = get_config(dev); + int err; + data->tx.buf = config->tx_buf; data->tx.len = config->tx_len; k_sem_init(&data->rx.sem, 0, 1); + err = config->api->callback_set(dev, uart_async_to_irq_callback, data); + if (err < 0) { + return err; + } + return uart_async_rx_init(&data->rx.async_rx, &config->async_rx); } diff --git a/drivers/serial/uart_nrfx_uarte2.c b/drivers/serial/uart_nrfx_uarte2.c index 86a81e92bdb..594f5a79b55 100644 --- a/drivers/serial/uart_nrfx_uarte2.c +++ b/drivers/serial/uart_nrfx_uarte2.c @@ -857,7 +857,7 @@ static int uarte_nrfx_init(const struct device *dev) if (UARTE_ANY_INTERRUPT_DRIVEN) { if (cfg->a2i_config) { - err = uart_async_to_irq_init(data->a2i_data, cfg->a2i_config); + err = uart_async_to_irq_init(dev); if (err < 0) { return err; } diff --git a/include/zephyr/drivers/serial/uart_async_to_irq.h b/include/zephyr/drivers/serial/uart_async_to_irq.h index d8d2774b174..3b80c9061b5 100644 --- a/include/zephyr/drivers/serial/uart_async_to_irq.h +++ b/include/zephyr/drivers/serial/uart_async_to_irq.h @@ -109,13 +109,11 @@ void uart_async_to_irq_trampoline_cb(const struct device *dev); /** @brief Initialize the adaptation layer. * - * @param data Data associated with the given adaptation layer instance. - * @param config Configuration structure. Must be persistent. + * @param dev UART device. Device must support asynchronous API. * * @retval 0 On successful initialization. */ -int uart_async_to_irq_init(struct uart_async_to_irq_data *data, - const struct uart_async_to_irq_config *config); +int uart_async_to_irq_init(const struct device *dev); /* @brief Enable RX for interrupt driven API. *