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_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,