drivers: uart_qmsi: Get clock frequency from DTS

The uart_qmsi driver used system clock frequency
as a base for baudrate calculation. This commit corrects
that by obtaining the needed value from DTS.

Signed-off-by: Piotr Zięcik <piotr.ziecik@nordicsemi.no>
This commit is contained in:
Piotr Zięcik 2019-04-11 14:28:52 +02:00 committed by Carles Cufí
commit dc44cb00d1
3 changed files with 28 additions and 14 deletions

View file

@ -20,10 +20,10 @@
#define IIR_IID_NO_INTERRUPT_PENDING 0x01 #define IIR_IID_NO_INTERRUPT_PENDING 0x01
#define DIVISOR_LOW(baudrate) \ #define DIVISOR_LOW(clock, baudrate) \
((CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC / (16 * baudrate)) & 0xFF) ((clock / (16 * baudrate)) & 0xFF)
#define DIVISOR_HIGH(baudrate) \ #define DIVISOR_HIGH(clock, baudrate) \
(((CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC / (16 * baudrate)) & 0xFF00) >> 8) (((clock / (16 * baudrate)) & 0xFF00) >> 8)
/* Convenient macro to get the controller instance. */ /* Convenient macro to get the controller instance. */
#define GET_CONTROLLER_INSTANCE(dev) \ #define GET_CONTROLLER_INSTANCE(dev) \
@ -33,6 +33,7 @@
struct uart_qmsi_config_info { struct uart_qmsi_config_info {
qm_uart_t instance; qm_uart_t instance;
clk_periph_t clock_gate; clk_periph_t clock_gate;
u32_t clock_frequency;
u32_t baud_divisor; u32_t baud_divisor;
bool hw_fc; bool hw_fc;
@ -140,9 +141,12 @@ static void irq_config_func_0(struct device *dev);
static const struct uart_qmsi_config_info config_info_0 = { static const struct uart_qmsi_config_info config_info_0 = {
.instance = QM_UART_0, .instance = QM_UART_0,
.clock_gate = CLK_PERIPH_UARTA_REGISTER | CLK_PERIPH_CLK, .clock_gate = CLK_PERIPH_UARTA_REGISTER | CLK_PERIPH_CLK,
.clock_frequency = DT_UART_QMSI_0_CLOCK_FREQUENCY,
.baud_divisor = QM_UART_CFG_BAUD_DL_PACK( .baud_divisor = QM_UART_CFG_BAUD_DL_PACK(
DIVISOR_HIGH(DT_UART_QMSI_0_BAUDRATE), DIVISOR_HIGH(DT_UART_QMSI_0_CLOCK_FREQUENCY,
DIVISOR_LOW(DT_UART_QMSI_0_BAUDRATE), DT_UART_QMSI_0_BAUDRATE),
DIVISOR_LOW(DT_UART_QMSI_0_CLOCK_FREQUENCY,
DT_UART_QMSI_0_BAUDRATE),
0), 0),
#ifdef CONFIG_UART_QMSI_0_HW_FC #ifdef CONFIG_UART_QMSI_0_HW_FC
.hw_fc = true, .hw_fc = true,
@ -168,9 +172,12 @@ static void irq_config_func_1(struct device *dev);
static const struct uart_qmsi_config_info config_info_1 = { static const struct uart_qmsi_config_info config_info_1 = {
.instance = QM_UART_1, .instance = QM_UART_1,
.clock_gate = CLK_PERIPH_UARTB_REGISTER | CLK_PERIPH_CLK, .clock_gate = CLK_PERIPH_UARTB_REGISTER | CLK_PERIPH_CLK,
.clock_frequency = DT_UART_QMSI_1_CLOCK_FREQUENCY,
.baud_divisor = QM_UART_CFG_BAUD_DL_PACK( .baud_divisor = QM_UART_CFG_BAUD_DL_PACK(
DIVISOR_HIGH(DT_UART_QMSI_1_BAUDRATE), DIVISOR_HIGH(DT_UART_QMSI_1_CLOCK_FREQUENCY,
DIVISOR_LOW(DT_UART_QMSI_1_BAUDRATE), DT_UART_QMSI_1_BAUDRATE),
DIVISOR_LOW(DT_UART_QMSI_1_CLOCK_FREQUENCY,
DT_UART_QMSI_1_BAUDRATE),
0), 0),
#ifdef CONFIG_UART_QMSI_1_HW_FC #ifdef CONFIG_UART_QMSI_1_HW_FC
.hw_fc = true, .hw_fc = true,
@ -405,13 +412,16 @@ static void irq_config_func_1(struct device *dev)
static int uart_qmsi_line_ctrl_set(struct device *dev, u32_t ctrl, u32_t val) static int uart_qmsi_line_ctrl_set(struct device *dev, u32_t ctrl, u32_t val)
{ {
qm_uart_t instance = GET_CONTROLLER_INSTANCE(dev); qm_uart_t instance = GET_CONTROLLER_INSTANCE(dev);
const struct uart_qmsi_config_info *config = dev->config->config_info;
qm_uart_config_t cfg; qm_uart_config_t cfg;
switch (ctrl) { switch (ctrl) {
case LINE_CTRL_BAUD_RATE: case LINE_CTRL_BAUD_RATE:
cfg.line_control = QM_UART[instance]->lcr; cfg.line_control = QM_UART[instance]->lcr;
cfg.baud_divisor = QM_UART_CFG_BAUD_DL_PACK(DIVISOR_HIGH(val), cfg.baud_divisor = QM_UART_CFG_BAUD_DL_PACK(
DIVISOR_LOW(val), 0); DIVISOR_HIGH(config->clock_frequency, val),
DIVISOR_LOW(config->clock_frequency, val),
0);
if (cfg.baud_divisor == 0) { if (cfg.baud_divisor == 0) {
return -EINVAL; return -EINVAL;
} }

View file

@ -2,12 +2,14 @@
/* SoC level DTS fixup file */ /* SoC level DTS fixup file */
#define DT_UART_QMSI_0_BAUDRATE DT_INTEL_QMSI_UART_B0002000_CURRENT_SPEED #define DT_UART_QMSI_0_CLOCK_FREQUENCY DT_INTEL_QMSI_UART_B0002000_CLOCKS_CLOCK_FREQUENCY
#define DT_UART_QMSI_0_BAUDRATE DT_INTEL_QMSI_UART_B0002000_CURRENT_SPEED
#define DT_UART_QMSI_0_NAME DT_INTEL_QMSI_UART_B0002000_LABEL #define DT_UART_QMSI_0_NAME DT_INTEL_QMSI_UART_B0002000_LABEL
#define DT_UART_QMSI_0_IRQ DT_INTEL_QMSI_UART_B0002000_IRQ_0 #define DT_UART_QMSI_0_IRQ DT_INTEL_QMSI_UART_B0002000_IRQ_0
#define DT_UART_QMSI_0_IRQ_PRI DT_INTEL_QMSI_UART_B0002000_IRQ_0_PRIORITY #define DT_UART_QMSI_0_IRQ_PRI DT_INTEL_QMSI_UART_B0002000_IRQ_0_PRIORITY
#define DT_UART_QMSI_1_BAUDRATE DT_INTEL_QMSI_UART_B0002400_CURRENT_SPEED #define DT_UART_QMSI_1_CLOCK_FREQUENCY DT_INTEL_QMSI_UART_B0002400_CLOCKS_CLOCK_FREQUENCY
#define DT_UART_QMSI_1_BAUDRATE DT_INTEL_QMSI_UART_B0002400_CURRENT_SPEED
#define DT_UART_QMSI_1_NAME DT_INTEL_QMSI_UART_B0002400_LABEL #define DT_UART_QMSI_1_NAME DT_INTEL_QMSI_UART_B0002400_LABEL
#define DT_UART_QMSI_1_IRQ DT_INTEL_QMSI_UART_B0002400_IRQ_0 #define DT_UART_QMSI_1_IRQ DT_INTEL_QMSI_UART_B0002400_IRQ_0
#define DT_UART_QMSI_1_IRQ_PRI DT_INTEL_QMSI_UART_B0002400_IRQ_0_PRIORITY #define DT_UART_QMSI_1_IRQ_PRI DT_INTEL_QMSI_UART_B0002400_IRQ_0_PRIORITY

View file

@ -2,13 +2,15 @@
/* SoC level DTS fixup file */ /* SoC level DTS fixup file */
#define DT_UART_QMSI_0_BAUDRATE DT_INTEL_QMSI_UART_B0002000_CURRENT_SPEED #define DT_UART_QMSI_0_CLOCK_FREQUENCY DT_INTEL_QMSI_UART_B0002000_CLOCKS_CLOCK_FREQUENCY
#define DT_UART_QMSI_0_BAUDRATE DT_INTEL_QMSI_UART_B0002000_CURRENT_SPEED
#define DT_UART_QMSI_0_NAME DT_INTEL_QMSI_UART_B0002000_LABEL #define DT_UART_QMSI_0_NAME DT_INTEL_QMSI_UART_B0002000_LABEL
#define DT_UART_QMSI_0_IRQ DT_INTEL_QMSI_UART_B0002000_IRQ_0 #define DT_UART_QMSI_0_IRQ DT_INTEL_QMSI_UART_B0002000_IRQ_0
#define DT_UART_QMSI_0_IRQ_PRI DT_INTEL_QMSI_UART_B0002000_IRQ_0_PRIORITY #define DT_UART_QMSI_0_IRQ_PRI DT_INTEL_QMSI_UART_B0002000_IRQ_0_PRIORITY
#define DT_UART_QMSI_0_IRQ_FLAGS DT_INTEL_QMSI_UART_B0002000_IRQ_0_SENSE #define DT_UART_QMSI_0_IRQ_FLAGS DT_INTEL_QMSI_UART_B0002000_IRQ_0_SENSE
#define DT_UART_QMSI_1_BAUDRATE DT_INTEL_QMSI_UART_B0002400_CURRENT_SPEED #define DT_UART_QMSI_1_CLOCK_FREQUENCY DT_INTEL_QMSI_UART_B0002400_CLOCKS_CLOCK_FREQUENCY
#define DT_UART_QMSI_1_BAUDRATE DT_INTEL_QMSI_UART_B0002400_CURRENT_SPEED
#define DT_UART_QMSI_1_NAME DT_INTEL_QMSI_UART_B0002400_LABEL #define DT_UART_QMSI_1_NAME DT_INTEL_QMSI_UART_B0002400_LABEL
#define DT_UART_QMSI_1_IRQ DT_INTEL_QMSI_UART_B0002400_IRQ_0 #define DT_UART_QMSI_1_IRQ DT_INTEL_QMSI_UART_B0002400_IRQ_0
#define DT_UART_QMSI_1_IRQ_PRI DT_INTEL_QMSI_UART_B0002400_IRQ_0_PRIORITY #define DT_UART_QMSI_1_IRQ_PRI DT_INTEL_QMSI_UART_B0002400_IRQ_0_PRIORITY