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 <gerard.marull@nordicsemi.no>
This commit is contained in:
Gerard Marull-Paretas 2022-01-25 19:32:16 +01:00 committed by Anas Nashif
commit 8e26bfcca2

View file

@ -60,6 +60,14 @@ struct uart_cmsdk_apb {
#define UART_TX_OV_IN (1 << 2) #define UART_TX_OV_IN (1 << 2)
#define UART_RX_OV_IN (1 << 3) #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 */ /* Device data structure */
struct uart_cmsdk_apb_dev_data { struct uart_cmsdk_apb_dev_data {
uint32_t baud_rate; /* Baud rate */ 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; 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; static const struct uart_driver_api uart_cmsdk_apb_driver_api;
#ifdef CONFIG_UART_INTERRUPT_DRIVEN #ifdef CONFIG_UART_INTERRUPT_DRIVEN
static void uart_cmsdk_apb_isr(const struct device *dev); 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) static void baudrate_set(const struct device *dev)
{ {
volatile struct uart_cmsdk_apb *uart = UART_STRUCT(dev); const struct uart_cmsdk_apb_config * const dev_cfg = dev->config;
const struct uart_device_config * const dev_cfg = dev->config;
struct uart_cmsdk_apb_dev_data *const dev_data = dev->data; struct uart_cmsdk_apb_dev_data *const dev_data = dev->data;
/* /*
* If baudrate and/or sys_clk_freq are 0 the configuration remains * 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)) { if ((dev_data->baud_rate != 0U) && (dev_cfg->sys_clk_freq != 0U)) {
/* calculate baud rate divisor */ /* 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) static int uart_cmsdk_apb_init(const struct device *dev)
{ {
volatile struct uart_cmsdk_apb *uart = UART_STRUCT(dev); const struct uart_cmsdk_apb_config * const dev_cfg = dev->config;
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
const struct uart_device_config * const dev_cfg = dev->config;
#endif
#ifdef CONFIG_CLOCK_CONTROL #ifdef CONFIG_CLOCK_CONTROL
/* Enable clock for subsystem */ /* Enable clock for subsystem */
@ -142,7 +142,7 @@ static int uart_cmsdk_apb_init(const struct device *dev)
baudrate_set(dev); baudrate_set(dev);
/* Enable receiver and transmitter */ /* 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 #ifdef CONFIG_UART_INTERRUPT_DRIVEN
dev_cfg->irq_config_func(dev); 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) 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 the receiver is not ready returns -1 */
if (!(uart->state & UART_RX_BF)) { if (!(dev_cfg->uart->state & UART_RX_BF)) {
return -1; return -1;
} }
/* got a character */ /* got a character */
*c = (unsigned char)uart->data; *c = (unsigned char)dev_cfg->uart->data;
return 0; 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, static void uart_cmsdk_apb_poll_out(const struct device *dev,
unsigned char c) 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 */ /* Wait for transmitter to be ready */
while (uart->state & UART_TX_BF) { while (dev_cfg->uart->state & UART_TX_BF) {
; /* Wait */ ; /* Wait */
} }
/* Send a character */ /* Send a character */
uart->data = (uint32_t)c; dev_cfg->uart->data = (uint32_t)c;
} }
#ifdef CONFIG_UART_INTERRUPT_DRIVEN #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, static int uart_cmsdk_apb_fifo_fill(const struct device *dev,
const uint8_t *tx_data, int len) 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 * No hardware FIFO present. Only 1 byte
* to write if TX buffer is empty. * 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". * Clear TX int. pending flag before pushing byte to "FIFO".
* If TX interrupt is enabled the UART_TX_IN bit will be set * If TX interrupt is enabled the UART_TX_IN bit will be set
* again automatically by the UART hardware machinery once * again automatically by the UART hardware machinery once
* the "FIFO" becomes empty again. * the "FIFO" becomes empty again.
*/ */
uart->intclear = UART_TX_IN; dev_cfg->uart->intclear = UART_TX_IN;
uart->data = *tx_data; dev_cfg->uart->data = *tx_data;
return 1; 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, static int uart_cmsdk_apb_fifo_read(const struct device *dev,
uint8_t *rx_data, const int size) 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 * No hardware FIFO present. Only 1 byte
* to read if RX buffer is full. * 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". * Clear RX int. pending flag before popping byte from "FIFO".
* If RX interrupt is enabled the UART_RX_IN bit will be set * If RX interrupt is enabled the UART_RX_IN bit will be set
* again automatically by the UART hardware machinery once * again automatically by the UART hardware machinery once
* the "FIFO" becomes full again. * the "FIFO" becomes full again.
*/ */
uart->intclear = UART_RX_IN; dev_cfg->uart->intclear = UART_RX_IN;
*rx_data = (unsigned char)uart->data; *rx_data = (unsigned char)dev_cfg->uart->data;
return 1; 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) 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; 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 /* 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 * 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 * 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) 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 */ /* 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) 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) 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) 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 */ /* 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) 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) 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); static void uart_cmsdk_apb_irq_config_func_0(const struct device *dev);
#endif #endif
static const struct uart_device_config uart_cmsdk_apb_dev_cfg_0 = { static const struct uart_cmsdk_apb_config uart_cmsdk_apb_dev_cfg_0 = {
.base = (uint8_t *)DT_INST_REG_ADDR(0), .uart = (volatile struct uart_cmsdk_apb *)DT_INST_REG_ADDR(0),
.sys_clk_freq = DT_INST_PROP_BY_PHANDLE(0, clocks, clock_frequency), .sys_clk_freq = DT_INST_PROP_BY_PHANDLE(0, clocks, clock_frequency),
#ifdef CONFIG_UART_INTERRUPT_DRIVEN #ifdef CONFIG_UART_INTERRUPT_DRIVEN
.irq_config_func = uart_cmsdk_apb_irq_config_func_0, .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); static void uart_cmsdk_apb_irq_config_func_1(const struct device *dev);
#endif #endif
static const struct uart_device_config uart_cmsdk_apb_dev_cfg_1 = { static const struct uart_cmsdk_apb_config uart_cmsdk_apb_dev_cfg_1 = {
.base = (uint8_t *)DT_INST_REG_ADDR(1), .uart = (volatile struct uart_cmsdk_apb *)DT_INST_REG_ADDR(1),
.sys_clk_freq = DT_INST_PROP_BY_PHANDLE(1, clocks, clock_frequency), .sys_clk_freq = DT_INST_PROP_BY_PHANDLE(1, clocks, clock_frequency),
#ifdef CONFIG_UART_INTERRUPT_DRIVEN #ifdef CONFIG_UART_INTERRUPT_DRIVEN
.irq_config_func = uart_cmsdk_apb_irq_config_func_1, .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); static void uart_cmsdk_apb_irq_config_func_2(const struct device *dev);
#endif #endif
static const struct uart_device_config uart_cmsdk_apb_dev_cfg_2 = { static const struct uart_cmsdk_apb_config uart_cmsdk_apb_dev_cfg_2 = {
.base = (uint8_t *)DT_INST_REG_ADDR(2), .uart = (volatile struct uart_cmsdk_apb *)DT_INST_REG_ADDR(2),
.sys_clk_freq = DT_INST_PROP_BY_PHANDLE(2, clocks, clock_frequency), .sys_clk_freq = DT_INST_PROP_BY_PHANDLE(2, clocks, clock_frequency),
#ifdef CONFIG_UART_INTERRUPT_DRIVEN #ifdef CONFIG_UART_INTERRUPT_DRIVEN
.irq_config_func = uart_cmsdk_apb_irq_config_func_2, .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); static void uart_cmsdk_apb_irq_config_func_3(const struct device *dev);
#endif #endif
static const struct uart_device_config uart_cmsdk_apb_dev_cfg_3 = { static const struct uart_cmsdk_apb_config uart_cmsdk_apb_dev_cfg_3 = {
.base = (uint8_t *)DT_INST_REG_ADDR(3), .uart = (volatile struct uart_cmsdk_apb *)DT_INST_REG_ADDR(3),
.sys_clk_freq = DT_INST_PROP_BY_PHANDLE(3, clocks, clock_frequency), .sys_clk_freq = DT_INST_PROP_BY_PHANDLE(3, clocks, clock_frequency),
#ifdef CONFIG_UART_INTERRUPT_DRIVEN #ifdef CONFIG_UART_INTERRUPT_DRIVEN
.irq_config_func = uart_cmsdk_apb_irq_config_func_3, .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); static void uart_cmsdk_apb_irq_config_func_4(const struct device *dev);
#endif #endif
static const struct uart_device_config uart_cmsdk_apb_dev_cfg_4 = { static const struct uart_cmsdk_apb_config uart_cmsdk_apb_dev_cfg_4 = {
.base = (uint8_t *)DT_INST_REG_ADDR(4), .uart = (volatile struct uart_cmsdk_apb *)DT_INST_REG_ADDR(4),
.sys_clk_freq = DT_INST_PROP_BY_PHANDLE(4, clocks, clock_frequency), .sys_clk_freq = DT_INST_PROP_BY_PHANDLE(4, clocks, clock_frequency),
#ifdef CONFIG_UART_INTERRUPT_DRIVEN #ifdef CONFIG_UART_INTERRUPT_DRIVEN
.irq_config_func = uart_cmsdk_apb_irq_config_func_4, .irq_config_func = uart_cmsdk_apb_irq_config_func_4,