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:
parent
69bbcec74f
commit
dc44cb00d1
3 changed files with 28 additions and 14 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue