From bd55003f704a58bc2a7c8e36d64146281db07290 Mon Sep 17 00:00:00 2001 From: Huifeng Zhang Date: Wed, 20 Apr 2022 12:20:21 +0800 Subject: [PATCH] driver: uart_pl011: refine creating device instance code Old code only create one pl011 device instance though there are two or more pl011 device defined in devicetree. This patch can fix this issue. Signed-off-by: Huifeng Zhang --- drivers/serial/uart_pl011.c | 164 ++++++++++-------------------------- 1 file changed, 43 insertions(+), 121 deletions(-) diff --git a/drivers/serial/uart_pl011.c b/drivers/serial/uart_pl011.c index 1d807245b69..2f9f4e7c11e 100644 --- a/drivers/serial/uart_pl011.c +++ b/drivers/serial/uart_pl011.c @@ -459,132 +459,54 @@ void pl011_isr(const struct device *dev) } #endif /* CONFIG_UART_INTERRUPT_DRIVEN */ - -#ifdef CONFIG_UART_PL011_PORT0 - #ifdef CONFIG_UART_INTERRUPT_DRIVEN -static void pl011_irq_config_func_0(const struct device *dev); -#endif +#define PL011_IRQ_CONFIG_FUNC_BODY(n, prop, i) \ + { \ + IRQ_CONNECT(DT_IRQ_BY_IDX(n, i, irq), \ + DT_IRQ_BY_IDX(n, i, priority), \ + pl011_isr, \ + DEVICE_DT_GET(n), \ + 0); \ + irq_enable(DT_IRQ_BY_IDX(n, i, irq)); \ + } -static struct pl011_config pl011_cfg_port_0 = { - .uart = (volatile struct pl011_regs *)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 = pl011_irq_config_func_0, -#endif -}; - -static struct pl011_data pl011_data_port_0 = { - .baud_rate = DT_INST_PROP(0, current_speed), -}; - -DEVICE_DT_INST_DEFINE(0, - &pl011_init, - NULL, - &pl011_data_port_0, - &pl011_cfg_port_0, PRE_KERNEL_1, - CONFIG_SERIAL_INIT_PRIORITY, - &pl011_driver_api); - -#ifdef CONFIG_UART_INTERRUPT_DRIVEN -static void pl011_irq_config_func_0(const struct device *dev) -{ -#if DT_NUM_IRQS(DT_INST(0, arm_pl011)) == 1 - IRQ_CONNECT(DT_INST_IRQN(0), - DT_INST_IRQ(0, priority), - pl011_isr, - DEVICE_DT_INST_GET(0), - 0); - irq_enable(DT_INST_IRQN(0)); +#define PL011_CONFIG_PORT(n) \ + static void pl011_irq_config_func_##n(const struct device *dev) \ + { \ + DT_INST_FOREACH_PROP_ELEM(n, interrupt_names, \ + PL011_IRQ_CONFIG_FUNC_BODY) \ + }; \ + \ + static struct pl011_config pl011_cfg_port_##n = { \ + .uart = (volatile struct pl011_regs *)DT_INST_REG_ADDR(n), \ + .sys_clk_freq = DT_INST_PROP_BY_PHANDLE(n, clocks, clock_frequency), \ + .irq_config_func = pl011_irq_config_func_##n, \ + }; #else - IRQ_CONNECT(DT_INST_IRQ_BY_NAME(0, tx, irq), - DT_INST_IRQ_BY_NAME(0, tx, priority), - pl011_isr, - DEVICE_DT_INST_GET(0), - 0); - irq_enable(DT_INST_IRQ_BY_NAME(0, tx, irq)); +#define PL011_CONFIG_PORT(n) \ + static struct pl011_config pl011_cfg_port_##n = { \ + .uart = (volatile struct pl011_regs *)DT_INST_REG_ADDR(n), \ + .sys_clk_freq = DT_INST_PROP_BY_PHANDLE(n, clocks, clock_frequency), \ + }; +#endif /* CONFIG_UART_INTERRUPT_DRIVEN */ - IRQ_CONNECT(DT_INST_IRQ_BY_NAME(0, rx, irq), - DT_INST_IRQ_BY_NAME(0, rx, priority), - pl011_isr, - DEVICE_DT_INST_GET(0), - 0); - irq_enable(DT_INST_IRQ_BY_NAME(0, rx, irq)); +#define PL011_INIT(n) \ + \ + PL011_CONFIG_PORT(n) \ + \ + static struct pl011_data pl011_data_port_##n = { \ + .baud_rate = DT_INST_PROP(n, current_speed), \ + }; \ + \ + DEVICE_DT_INST_DEFINE(n, &pl011_init, \ + NULL, \ + &pl011_data_port_##n, \ + &pl011_cfg_port_##n, \ + PRE_KERNEL_1, \ + CONFIG_SERIAL_INIT_PRIORITY, \ + &pl011_driver_api); - IRQ_CONNECT(DT_INST_IRQ_BY_NAME(0, rxtim, irq), - DT_INST_IRQ_BY_NAME(0, rxtim, priority), - pl011_isr, - DEVICE_DT_INST_GET(0), - 0); - irq_enable(DT_INST_IRQ_BY_NAME(0, rxtim, irq)); -#endif -} -#endif - -#endif /* CONFIG_UART_PL011_PORT0 */ - -#ifdef CONFIG_UART_PL011_PORT1 - -#ifdef CONFIG_UART_INTERRUPT_DRIVEN -static void pl011_irq_config_func_1(const struct device *dev); -#endif - -static struct pl011_config pl011_cfg_port_1 = { - .uart = (volatile struct pl011_regs *)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 = pl011_irq_config_func_1, -#endif -}; - -static struct pl011_data pl011_data_port_1 = { - .baud_rate = DT_INST_PROP(1, current_speed), -}; - -DEVICE_DT_INST_DEFINE(1, - &pl011_init, - NULL, - &pl011_data_port_1, - &pl011_cfg_port_1, PRE_KERNEL_1, - CONFIG_SERIAL_INIT_PRIORITY, - &pl011_driver_api); - -#ifdef CONFIG_UART_INTERRUPT_DRIVEN -static void pl011_irq_config_func_1(const struct device *dev) -{ -#if DT_NUM_IRQS(DT_INST(1, arm_pl011)) == 1 - IRQ_CONNECT(DT_INST_IRQN(1), - DT_INST_IRQ(1, priority), - pl011_isr, - DEVICE_DT_INST_GET(1), - 0); - irq_enable(DT_INST_IRQN(1)); -#else - IRQ_CONNECT(DT_INST_IRQ_BY_NAME(1, tx, irq), - DT_INST_IRQ_BY_NAME(1, tx, priority), - pl011_isr, - DEVICE_DT_INST_GET(1), - 0); - irq_enable(DT_INST_IRQ_BY_NAME(1, tx, irq)); - - IRQ_CONNECT(DT_INST_IRQ_BY_NAME(1, rx, irq), - DT_INST_IRQ_BY_NAME(1, rx, priority), - pl011_isr, - DEVICE_DT_INST_GET(1), - 0); - irq_enable(DT_INST_IRQ_BY_NAME(1, rx, irq)); - - IRQ_CONNECT(DT_INST_IRQ_BY_NAME(1, rxtim, irq), - DT_INST_IRQ_BY_NAME(1, rxtim, priority), - pl011_isr, - DEVICE_DT_INST_GET(1), - 0); - irq_enable(DT_INST_IRQ_BY_NAME(1, rxtim, irq)); -#endif -} -#endif - -#endif /* CONFIG_UART_PL011_PORT1 */ +DT_INST_FOREACH_STATUS_OKAY(PL011_INIT) #ifdef CONFIG_UART_PL011_SBSA