From 8e26bfcca205e67d391ef6693c86a18e28fd0f79 Mon Sep 17 00:00:00 2001 From: Gerard Marull-Paretas Date: Tue, 25 Jan 2022 19:32:16 +0100 Subject: [PATCH] drivers: serial: cmsdk_apb: drop usage of uart_device_config Create a driver specific configuration structure, containing the required fields only. Since the config struct can now store a pointer to the UART structure, casts from (uint8_t *) to (struct uart_cmsdk_apb*) are no longer needed. UART_STRUCT has also been dropped in favor of using the config pointer directly now that it is possible. Signed-off-by: Gerard Marull-Paretas --- drivers/serial/uart_cmsdk_apb.c | 103 ++++++++++++++++++-------------- 1 file changed, 58 insertions(+), 45 deletions(-) diff --git a/drivers/serial/uart_cmsdk_apb.c b/drivers/serial/uart_cmsdk_apb.c index 8c7c43ca34e..d15fb8784bc 100644 --- a/drivers/serial/uart_cmsdk_apb.c +++ b/drivers/serial/uart_cmsdk_apb.c @@ -60,6 +60,14 @@ struct uart_cmsdk_apb { #define UART_TX_OV_IN (1 << 2) #define UART_RX_OV_IN (1 << 3) +struct uart_cmsdk_apb_config { + volatile struct uart_cmsdk_apb *uart; + uint32_t sys_clk_freq; +#ifdef CONFIG_UART_INTERRUPT_DRIVEN + uart_irq_config_func_t irq_config_func; +#endif +}; + /* Device data structure */ struct uart_cmsdk_apb_dev_data { uint32_t baud_rate; /* Baud rate */ @@ -75,10 +83,6 @@ struct uart_cmsdk_apb_dev_data { const struct arm_clock_control_t uart_cc_dss; }; -#define UART_STRUCT(dev) \ - ((volatile struct uart_cmsdk_apb *) \ - ((const struct uart_device_config * const)(dev)->config)->base) - static const struct uart_driver_api uart_cmsdk_apb_driver_api; #ifdef CONFIG_UART_INTERRUPT_DRIVEN static void uart_cmsdk_apb_isr(const struct device *dev); @@ -93,8 +97,7 @@ static void uart_cmsdk_apb_isr(const struct device *dev); */ static void baudrate_set(const struct device *dev) { - volatile struct uart_cmsdk_apb *uart = UART_STRUCT(dev); - const struct uart_device_config * const dev_cfg = dev->config; + const struct uart_cmsdk_apb_config * const dev_cfg = dev->config; struct uart_cmsdk_apb_dev_data *const dev_data = dev->data; /* * If baudrate and/or sys_clk_freq are 0 the configuration remains @@ -103,7 +106,7 @@ static void baudrate_set(const struct device *dev) */ if ((dev_data->baud_rate != 0U) && (dev_cfg->sys_clk_freq != 0U)) { /* calculate baud rate divisor */ - uart->bauddiv = (dev_cfg->sys_clk_freq / dev_data->baud_rate); + dev_cfg->uart->bauddiv = (dev_cfg->sys_clk_freq / dev_data->baud_rate); } } @@ -119,10 +122,7 @@ static void baudrate_set(const struct device *dev) */ static int uart_cmsdk_apb_init(const struct device *dev) { - volatile struct uart_cmsdk_apb *uart = UART_STRUCT(dev); -#ifdef CONFIG_UART_INTERRUPT_DRIVEN - const struct uart_device_config * const dev_cfg = dev->config; -#endif + const struct uart_cmsdk_apb_config * const dev_cfg = dev->config; #ifdef CONFIG_CLOCK_CONTROL /* Enable clock for subsystem */ @@ -142,7 +142,7 @@ static int uart_cmsdk_apb_init(const struct device *dev) baudrate_set(dev); /* Enable receiver and transmitter */ - uart->ctrl = UART_RX_EN | UART_TX_EN; + dev_cfg->uart->ctrl = UART_RX_EN | UART_TX_EN; #ifdef CONFIG_UART_INTERRUPT_DRIVEN dev_cfg->irq_config_func(dev); @@ -162,15 +162,15 @@ static int uart_cmsdk_apb_init(const struct device *dev) static int uart_cmsdk_apb_poll_in(const struct device *dev, unsigned char *c) { - volatile struct uart_cmsdk_apb *uart = UART_STRUCT(dev); + const struct uart_cmsdk_apb_config *dev_cfg = dev->config; /* If the receiver is not ready returns -1 */ - if (!(uart->state & UART_RX_BF)) { + if (!(dev_cfg->uart->state & UART_RX_BF)) { return -1; } /* got a character */ - *c = (unsigned char)uart->data; + *c = (unsigned char)dev_cfg->uart->data; return 0; } @@ -187,15 +187,15 @@ static int uart_cmsdk_apb_poll_in(const struct device *dev, unsigned char *c) static void uart_cmsdk_apb_poll_out(const struct device *dev, unsigned char c) { - volatile struct uart_cmsdk_apb *uart = UART_STRUCT(dev); + const struct uart_cmsdk_apb_config *dev_cfg = dev->config; /* Wait for transmitter to be ready */ - while (uart->state & UART_TX_BF) { + while (dev_cfg->uart->state & UART_TX_BF) { ; /* Wait */ } /* Send a character */ - uart->data = (uint32_t)c; + dev_cfg->uart->data = (uint32_t)c; } #ifdef CONFIG_UART_INTERRUPT_DRIVEN @@ -211,21 +211,21 @@ static void uart_cmsdk_apb_poll_out(const struct device *dev, static int uart_cmsdk_apb_fifo_fill(const struct device *dev, const uint8_t *tx_data, int len) { - volatile struct uart_cmsdk_apb *uart = UART_STRUCT(dev); + const struct uart_cmsdk_apb_config *dev_cfg = dev->config; /* * No hardware FIFO present. Only 1 byte * to write if TX buffer is empty. */ - if (len && !(uart->state & UART_TX_BF)) { + if (len && !(dev_cfg->uart->state & UART_TX_BF)) { /* * Clear TX int. pending flag before pushing byte to "FIFO". * If TX interrupt is enabled the UART_TX_IN bit will be set * again automatically by the UART hardware machinery once * the "FIFO" becomes empty again. */ - uart->intclear = UART_TX_IN; - uart->data = *tx_data; + dev_cfg->uart->intclear = UART_TX_IN; + dev_cfg->uart->data = *tx_data; return 1; } @@ -244,21 +244,21 @@ static int uart_cmsdk_apb_fifo_fill(const struct device *dev, static int uart_cmsdk_apb_fifo_read(const struct device *dev, uint8_t *rx_data, const int size) { - volatile struct uart_cmsdk_apb *uart = UART_STRUCT(dev); + const struct uart_cmsdk_apb_config *dev_cfg = dev->config; /* * No hardware FIFO present. Only 1 byte * to read if RX buffer is full. */ - if (size && uart->state & UART_RX_BF) { + if (size && dev_cfg->uart->state & UART_RX_BF) { /* * Clear RX int. pending flag before popping byte from "FIFO". * If RX interrupt is enabled the UART_RX_IN bit will be set * again automatically by the UART hardware machinery once * the "FIFO" becomes full again. */ - uart->intclear = UART_RX_IN; - *rx_data = (unsigned char)uart->data; + dev_cfg->uart->intclear = UART_RX_IN; + *rx_data = (unsigned char)dev_cfg->uart->data; return 1; } @@ -272,9 +272,10 @@ static int uart_cmsdk_apb_fifo_read(const struct device *dev, */ static void uart_cmsdk_apb_irq_tx_enable(const struct device *dev) { + const struct uart_cmsdk_apb_config *dev_cfg = dev->config; unsigned int key; - UART_STRUCT(dev)->ctrl |= UART_TX_IN_EN; + dev_cfg->uart->ctrl |= UART_TX_IN_EN; /* The expectation is that TX is a level interrupt, active for as * long as TX buffer is empty. But in CMSDK UART it's an edge * interrupt, firing on a state change of TX buffer from full to @@ -295,9 +296,11 @@ static void uart_cmsdk_apb_irq_tx_enable(const struct device *dev) */ static void uart_cmsdk_apb_irq_tx_disable(const struct device *dev) { - UART_STRUCT(dev)->ctrl &= ~UART_TX_IN_EN; + const struct uart_cmsdk_apb_config *dev_cfg = dev->config; + + dev_cfg->uart->ctrl &= ~UART_TX_IN_EN; /* Clear any pending TX interrupt after disabling it */ - UART_STRUCT(dev)->intclear = UART_TX_IN; + dev_cfg->uart->intclear = UART_TX_IN; } /** @@ -309,7 +312,9 @@ static void uart_cmsdk_apb_irq_tx_disable(const struct device *dev) */ static int uart_cmsdk_apb_irq_tx_ready(const struct device *dev) { - return !(UART_STRUCT(dev)->state & UART_TX_BF); + const struct uart_cmsdk_apb_config *dev_cfg = dev->config; + + return !(dev_cfg->uart->state & UART_TX_BF); } /** @@ -319,7 +324,9 @@ static int uart_cmsdk_apb_irq_tx_ready(const struct device *dev) */ static void uart_cmsdk_apb_irq_rx_enable(const struct device *dev) { - UART_STRUCT(dev)->ctrl |= UART_RX_IN_EN; + const struct uart_cmsdk_apb_config *dev_cfg = dev->config; + + dev_cfg->uart->ctrl |= UART_RX_IN_EN; } /** @@ -329,9 +336,11 @@ static void uart_cmsdk_apb_irq_rx_enable(const struct device *dev) */ static void uart_cmsdk_apb_irq_rx_disable(const struct device *dev) { - UART_STRUCT(dev)->ctrl &= ~UART_RX_IN_EN; + const struct uart_cmsdk_apb_config *dev_cfg = dev->config; + + dev_cfg->uart->ctrl &= ~UART_RX_IN_EN; /* Clear any pending RX interrupt after disabling it */ - UART_STRUCT(dev)->intclear = UART_RX_IN; + dev_cfg->uart->intclear = UART_RX_IN; } /** @@ -355,7 +364,9 @@ static int uart_cmsdk_apb_irq_tx_complete(const struct device *dev) */ static int uart_cmsdk_apb_irq_rx_ready(const struct device *dev) { - return UART_STRUCT(dev)->state & UART_RX_BF; + const struct uart_cmsdk_apb_config *dev_cfg = dev->config; + + return dev_cfg->uart->state & UART_RX_BF; } /** @@ -387,7 +398,9 @@ static void uart_cmsdk_apb_irq_err_disable(const struct device *dev) */ static int uart_cmsdk_apb_irq_is_pending(const struct device *dev) { - return (UART_STRUCT(dev)->intstatus & (UART_RX_IN | UART_TX_IN)); + const struct uart_cmsdk_apb_config *dev_cfg = dev->config; + + return (dev_cfg->uart->intstatus & (UART_RX_IN | UART_TX_IN)); } /** @@ -465,8 +478,8 @@ static const struct uart_driver_api uart_cmsdk_apb_driver_api = { static void uart_cmsdk_apb_irq_config_func_0(const struct device *dev); #endif -static const struct uart_device_config uart_cmsdk_apb_dev_cfg_0 = { - .base = (uint8_t *)DT_INST_REG_ADDR(0), +static const struct uart_cmsdk_apb_config uart_cmsdk_apb_dev_cfg_0 = { + .uart = (volatile struct uart_cmsdk_apb *)DT_INST_REG_ADDR(0), .sys_clk_freq = DT_INST_PROP_BY_PHANDLE(0, clocks, clock_frequency), #ifdef CONFIG_UART_INTERRUPT_DRIVEN .irq_config_func = uart_cmsdk_apb_irq_config_func_0, @@ -530,8 +543,8 @@ static void uart_cmsdk_apb_irq_config_func_0(const struct device *dev) static void uart_cmsdk_apb_irq_config_func_1(const struct device *dev); #endif -static const struct uart_device_config uart_cmsdk_apb_dev_cfg_1 = { - .base = (uint8_t *)DT_INST_REG_ADDR(1), +static const struct uart_cmsdk_apb_config uart_cmsdk_apb_dev_cfg_1 = { + .uart = (volatile struct uart_cmsdk_apb *)DT_INST_REG_ADDR(1), .sys_clk_freq = DT_INST_PROP_BY_PHANDLE(1, clocks, clock_frequency), #ifdef CONFIG_UART_INTERRUPT_DRIVEN .irq_config_func = uart_cmsdk_apb_irq_config_func_1, @@ -595,8 +608,8 @@ static void uart_cmsdk_apb_irq_config_func_1(const struct device *dev) static void uart_cmsdk_apb_irq_config_func_2(const struct device *dev); #endif -static const struct uart_device_config uart_cmsdk_apb_dev_cfg_2 = { - .base = (uint8_t *)DT_INST_REG_ADDR(2), +static const struct uart_cmsdk_apb_config uart_cmsdk_apb_dev_cfg_2 = { + .uart = (volatile struct uart_cmsdk_apb *)DT_INST_REG_ADDR(2), .sys_clk_freq = DT_INST_PROP_BY_PHANDLE(2, clocks, clock_frequency), #ifdef CONFIG_UART_INTERRUPT_DRIVEN .irq_config_func = uart_cmsdk_apb_irq_config_func_2, @@ -660,8 +673,8 @@ static void uart_cmsdk_apb_irq_config_func_2(const struct device *dev) static void uart_cmsdk_apb_irq_config_func_3(const struct device *dev); #endif -static const struct uart_device_config uart_cmsdk_apb_dev_cfg_3 = { - .base = (uint8_t *)DT_INST_REG_ADDR(3), +static const struct uart_cmsdk_apb_config uart_cmsdk_apb_dev_cfg_3 = { + .uart = (volatile struct uart_cmsdk_apb *)DT_INST_REG_ADDR(3), .sys_clk_freq = DT_INST_PROP_BY_PHANDLE(3, clocks, clock_frequency), #ifdef CONFIG_UART_INTERRUPT_DRIVEN .irq_config_func = uart_cmsdk_apb_irq_config_func_3, @@ -725,8 +738,8 @@ static void uart_cmsdk_apb_irq_config_func_3(const struct device *dev) static void uart_cmsdk_apb_irq_config_func_4(const struct device *dev); #endif -static const struct uart_device_config uart_cmsdk_apb_dev_cfg_4 = { - .base = (uint8_t *)DT_INST_REG_ADDR(4), +static const struct uart_cmsdk_apb_config uart_cmsdk_apb_dev_cfg_4 = { + .uart = (volatile struct uart_cmsdk_apb *)DT_INST_REG_ADDR(4), .sys_clk_freq = DT_INST_PROP_BY_PHANDLE(4, clocks, clock_frequency), #ifdef CONFIG_UART_INTERRUPT_DRIVEN .irq_config_func = uart_cmsdk_apb_irq_config_func_4,