drivers: serial: async_to_irq: Fix initialization

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 <krzysztof.chruscinski@nordicsemi.no>
This commit is contained in:
Krzysztof Chruściński 2024-04-22 12:26:24 +02:00 committed by Anas Nashif
commit e48053fdb5
3 changed files with 13 additions and 14 deletions

View file

@ -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);
}

View file

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

View file

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