From 57f2741e4f928466adaf44a04dfff194d4bb1067 Mon Sep 17 00:00:00 2001 From: Dmitriy Korovkin Date: Mon, 26 Oct 2015 15:56:02 -0400 Subject: [PATCH] init: Implement fine-grained initialization policy Put initialization priorities as device driver Kconfig parameter. Initialization priority value for each platform is defined in the platform Kconfig file. Drivers and platform code use SYS_DEFINE_DEVICE to add and initialization function. Change-Id: I2f4f3c7370dac02408a1b50a0a1bade8b427a282 Signed-off-by: Dmitriy Korovkin Signed-off-by: Anas Nashif --- arch/arc/platforms/generic_arc/Kconfig | 10 ++++ arch/arc/platforms/generic_arc/system.c | 3 +- arch/arc/platforms/quark_se-arc/Kconfig | 20 ++++++- .../platforms/quark_se-arc/platform_config.c | 5 +- arch/arc/platforms/quark_se-arc/system.c | 3 +- arch/arm/platforms/fsl_frdm_k64f/Kconfig | 9 +++ .../platforms/fsl_frdm_k64f/platform_config.c | 15 +++-- arch/arm/platforms/fsl_frdm_k64f/system.c | 3 +- arch/arm/platforms/ti_lm3s6965/Kconfig | 12 ++++ .../platforms/ti_lm3s6965/platform_config.c | 9 ++- arch/arm/platforms/ti_lm3s6965/system.c | 3 +- arch/x86/core/cache.c | 2 +- arch/x86/platforms/galileo/Kconfig | 55 +++++++++++++++++++ arch/x86/platforms/galileo/galileo.c | 9 +-- arch/x86/platforms/galileo/galileo_config.c | 12 ++-- arch/x86/platforms/galileo/galileo_pinmux.c | 3 +- arch/x86/platforms/ia32/Kconfig | 12 ++++ arch/x86/platforms/ia32/ia32.c | 12 ++-- arch/x86/platforms/ia32/ia32_config.c | 12 ++-- arch/x86/platforms/ia32_pci/Kconfig | 9 +++ arch/x86/platforms/ia32_pci/ia32_pci.c | 9 ++- arch/x86/platforms/ia32_pci/ia32_pci_config.c | 12 ++-- arch/x86/platforms/quark_d2000/Kconfig | 9 +++ .../quark_d2000/quark_d2000_config.c | 6 +- arch/x86/platforms/quark_d2000/system.c | 5 +- arch/x86/platforms/quark_se-x86/Kconfig | 20 ++++++- arch/x86/platforms/quark_se-x86/pinmux.c | 2 +- .../platforms/quark_se-x86/quark_se_config.c | 9 ++- arch/x86/platforms/quark_se-x86/system.c | 7 ++- drivers/adc/Kconfig | 9 +++ drivers/adc/adc_dw.c | 3 +- drivers/adc/adc_ti_adc108s102.c | 3 +- drivers/aio/aio_dw_comparator.c | 3 +- drivers/bluetooth/uart.c | 3 +- .../clock_control/quark_se_clock_control.c | 9 ++- drivers/console/Kconfig | 19 +++++++ drivers/console/ram_console.c | 2 +- drivers/console/uart_console.c | 8 ++- drivers/ethernet/eth_dw.c | 3 +- drivers/gpio/Kconfig | 26 +++++++++ drivers/gpio/gpio_dw.c | 8 ++- drivers/gpio/gpio_mmio.c | 6 +- drivers/gpio/gpio_pcal9535a.c | 12 ++-- drivers/gpio/gpio_sch.c | 6 +- drivers/grove/Kconfig | 9 +++ drivers/grove/lcd_rgb.c | 3 +- drivers/i2c/Kconfig | 7 +++ drivers/i2c/i2c_dw.c | 5 +- drivers/i2c/i2c_quark_se_ss.c | 6 +- drivers/ipi/ipi_quark_se.h | 3 +- drivers/pinmux/Kconfig | 10 ++++ drivers/pwm/Kconfig | 7 +++ drivers/pwm/pwm_pca9685.c | 3 +- drivers/rtc/rtc_dw.c | 2 +- drivers/shared_irq/Kconfig | 8 +++ drivers/shared_irq/shared_irq.c | 6 +- drivers/spi/Kconfig | 6 ++ drivers/spi/dw_spi.c | 6 +- drivers/spi/intel_spi.c | 8 ++- drivers/timer/sys_clock_init.c | 3 +- drivers/watchdog/wdt_dw.c | 2 +- include/init.h | 21 ------- kernel/Kconfig | 13 +++++ kernel/nanokernel/kernel_event_logger.c | 3 +- misc/debug/mem_safe_check_boundaries.c | 3 +- .../nanokernel/test/test_ipi/src/test_ipi.c | 11 +++- 66 files changed, 447 insertions(+), 115 deletions(-) diff --git a/arch/arc/platforms/generic_arc/Kconfig b/arch/arc/platforms/generic_arc/Kconfig index efe5c8f2e9e..6721944cb35 100644 --- a/arch/arc/platforms/generic_arc/Kconfig +++ b/arch/arc/platforms/generic_arc/Kconfig @@ -37,4 +37,14 @@ config RAM_SIZE default 80 endmenu + +config KERNEL_INIT_PRIORITY_DEFAULT + default 40 + +config KERNEL_INIT_PRIORITY_DEVICE + default 50 + +config UART_CONSOLE_PRIORITY + default 60 + endif diff --git a/arch/arc/platforms/generic_arc/system.c b/arch/arc/platforms/generic_arc/system.c index dc73119b83c..21f0c41e856 100644 --- a/arch/arc/platforms/generic_arc/system.c +++ b/arch/arc/platforms/generic_arc/system.c @@ -52,4 +52,5 @@ static int generic_arc_init(struct device *arg) return 0; } DECLARE_DEVICE_INIT_CONFIG(generic_arc_0, "", generic_arc_init, NULL); -pre_kernel_core_init(generic_arc_0, NULL); +SYS_DEFINE_DEVICE(generic_arc_0, NULL, PRIMARY, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); diff --git a/arch/arc/platforms/quark_se-arc/Kconfig b/arch/arc/platforms/quark_se-arc/Kconfig index 864c26f9707..9aa6176719c 100644 --- a/arch/arc/platforms/quark_se-arc/Kconfig +++ b/arch/arc/platforms/quark_se-arc/Kconfig @@ -93,4 +93,22 @@ config I2C_QUARK_SE_SS_1_DEFAULT_CFG endif -endif +config KERNEL_INIT_PRIORITY_DEFAULT + default 40 + +config KERNEL_INIT_PRIORITY_DEVICE + default 50 + +config IPI_CONSOLE_PRIORITY + default 60 + +config UART_CONSOLE_PRIORITY + default 60 + +config GPIO_DW_INIT_PRIORITY + default 60 + +config I2C_INIT_PRIORITY + default 60 + +endif #PLATFORM_QUARK_SE_ARC diff --git a/arch/arc/platforms/quark_se-arc/platform_config.c b/arch/arc/platforms/quark_se-arc/platform_config.c index 8e5038c67c1..99ff883e009 100644 --- a/arch/arc/platforms/quark_se-arc/platform_config.c +++ b/arch/arc/platforms/quark_se-arc/platform_config.c @@ -38,7 +38,8 @@ static struct quark_se_ipi_controller_config_info ipi_controller_config = { }; DECLARE_DEVICE_INIT_CONFIG(quark_se_ipi, "", quark_se_ipi_controller_initialize, &ipi_controller_config); -pre_kernel_late_init(quark_se_ipi, NULL); +SYS_DEFINE_DEVICE(quark_se_ipi, NULL, SECONDARY, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); #if CONFIG_IPI_CONSOLE_SENDER #include @@ -51,7 +52,7 @@ struct ipi_console_sender_config_info quark_se_ipi_sender_config = { DECLARE_DEVICE_INIT_CONFIG(ipi_console, "ipi_console", ipi_console_sender_init, &quark_se_ipi_sender_config); -nano_early_init(ipi_console, NULL); +SYS_DEFINE_DEVICE(ipi_console, NULL, SECONDARY, CONFIG_IPI_CONSOLE_PRIORITY); #endif /* CONFIG_IPI_CONSOLE_SENDER */ #endif /* CONFIG_IPI_QUARK_SE */ diff --git a/arch/arc/platforms/quark_se-arc/system.c b/arch/arc/platforms/quark_se-arc/system.c index 98f186df1aa..f87b2d83e61 100644 --- a/arch/arc/platforms/quark_se-arc/system.c +++ b/arch/arc/platforms/quark_se-arc/system.c @@ -50,4 +50,5 @@ static int quark_se_arc_init(struct device *arg) return 0; } DECLARE_DEVICE_INIT_CONFIG(quark_se_arc_0, "", quark_se_arc_init, NULL); -pre_kernel_early_init(quark_se_arc_0, NULL); +SYS_DEFINE_DEVICE(quark_se_arc_0, NULL, PRIMARY, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); diff --git a/arch/arm/platforms/fsl_frdm_k64f/Kconfig b/arch/arm/platforms/fsl_frdm_k64f/Kconfig index 1010152edb8..6f3bb49c87a 100644 --- a/arch/arm/platforms/fsl_frdm_k64f/Kconfig +++ b/arch/arm/platforms/fsl_frdm_k64f/Kconfig @@ -45,4 +45,13 @@ config WDOG_INIT upon reset. Therefore, this requires that the watchdog be configured during reset handling. +config KERNEL_INIT_PRIORITY_DEFAULT + default 40 + +config KERNEL_INIT_PRIORITY_DEVICE + default 50 + +config UART_CONSOLE_PRIORITY + default 60 + endif diff --git a/arch/arm/platforms/fsl_frdm_k64f/platform_config.c b/arch/arm/platforms/fsl_frdm_k64f/platform_config.c index bfe042d6801..1deda476524 100644 --- a/arch/arm/platforms/fsl_frdm_k64f/platform_config.c +++ b/arch/arm/platforms/fsl_frdm_k64f/platform_config.c @@ -175,7 +175,8 @@ DECLARE_DEVICE_INIT_CONFIG(k20_uart0, &uart_platform_init, &k20_uart_dev_cfg[0]); -pre_kernel_late_init(k20_uart0, &k20_uart_dev_data[0]); +SYS_DEFINE_DEVICE(k20_uart0, &k20_uart_dev_data[0], SECONDARY, + CONFIG_KERNEL_INIT_PRIORITY_DEVICE); /* UART 1 */ @@ -184,7 +185,8 @@ DECLARE_DEVICE_INIT_CONFIG(k20_uart1, &uart_platform_init, &k20_uart_dev_cfg[1]); -pre_kernel_late_init(k20_uart1, &k20_uart_dev_data[1]); +SYS_DEFINE_DEVICE(k20_uart1, &k20_uart_dev_data[1], SECONDARY, + CONFIG_KERNEL_INIT_PRIORITY_DEVICE); /* UART 2 */ @@ -193,7 +195,8 @@ DECLARE_DEVICE_INIT_CONFIG(k20_uart2, &uart_platform_init, &k20_uart_dev_cfg[2]); -pre_kernel_late_init(k20_uart2, &k20_uart_dev_data[2]); +SYS_DEFINE_DEVICE(k20_uart2, &k20_uart_dev_data[2], SECONDARY, + CONFIG_KERNEL_INIT_PRIORITY_DEVICE); /* UART 3 */ @@ -202,7 +205,8 @@ DECLARE_DEVICE_INIT_CONFIG(k20_uart3, &uart_platform_init, &k20_uart_dev_cfg[3]); -pre_kernel_late_init(k20_uart3, &k20_uart_dev_data[3]); +SYS_DEFINE_DEVICE(k20_uart3, &k20_uart_dev_data[3], SECONDARY, + CONFIG_KERNEL_INIT_PRIORITY_DEVICE); /* UART 4 */ @@ -211,7 +215,8 @@ DECLARE_DEVICE_INIT_CONFIG(k20_uart4, &uart_platform_init, &k20_uart_dev_cfg[4]); -pre_kernel_late_init(k20_uart4, &k20_uart_dev_data[4]); +SYS_DEFINE_DEVICE(k20_uart4, &k20_uart_dev_data[4], SECONDARY, + CONFIG_KERNEL_INIT_PRIORITY_DEVICE); /**< UART Devices */ diff --git a/arch/arm/platforms/fsl_frdm_k64f/system.c b/arch/arm/platforms/fsl_frdm_k64f/system.c index 390c94d6f2e..612ada967cf 100644 --- a/arch/arm/platforms/fsl_frdm_k64f/system.c +++ b/arch/arm/platforms/fsl_frdm_k64f/system.c @@ -321,4 +321,5 @@ static int fsl_frdm_k64f_init(struct device *arg) } DECLARE_DEVICE_INIT_CONFIG(fsl_frdm_0, "", fsl_frdm_k64f_init, NULL); -pre_kernel_core_init(fsl_frdm_0, NULL); +SYS_DEFINE_DEVICE(fsl_frdm_0, NULL, PRIMARY, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); diff --git a/arch/arm/platforms/ti_lm3s6965/Kconfig b/arch/arm/platforms/ti_lm3s6965/Kconfig index ef06b6866a7..5b647b0bbb7 100644 --- a/arch/arm/platforms/ti_lm3s6965/Kconfig +++ b/arch/arm/platforms/ti_lm3s6965/Kconfig @@ -43,4 +43,16 @@ config SYS_CLOCK_HW_CYCLES_PER_SEC int default 12000000 +config KERNEL_INIT_PRIORITY_DEFAULT + default 40 + +config KERNEL_INIT_PRIORITY_DEVICE + default 50 + +config UART_CONSOLE_PRIORITY + default 60 + +config IPI_CONSOLE_PRIORITY + default 60 + endif diff --git a/arch/arm/platforms/ti_lm3s6965/platform_config.c b/arch/arm/platforms/ti_lm3s6965/platform_config.c index 895809007e4..0937b706bf7 100644 --- a/arch/arm/platforms/ti_lm3s6965/platform_config.c +++ b/arch/arm/platforms/ti_lm3s6965/platform_config.c @@ -177,7 +177,8 @@ DECLARE_DEVICE_INIT_CONFIG(stellaris_uart0, &uart_platform_init, &stellaris_uart_dev_cfg[0]); -pre_kernel_late_init(stellaris_uart0, NULL); +SYS_DEFINE_DEVICE(stellaris_uart0, NULL, SECONDARY, + CONFIG_KERNEL_INIT_PRIORITY_DEVICE); /* UART 1 */ @@ -186,7 +187,8 @@ DECLARE_DEVICE_INIT_CONFIG(stellaris_uart1, &uart_platform_init, &stellaris_uart_dev_cfg[1]); -pre_kernel_late_init(stellaris_uart1, NULL); +SYS_DEFINE_DEVICE(stellaris_uart1, NULL, SECONDARY, + CONFIG_KERNEL_INIT_PRIORITY_DEVICE); /* UART 2 */ @@ -195,7 +197,8 @@ DECLARE_DEVICE_INIT_CONFIG(stellaris_uart2, &uart_platform_init, &stellaris_uart_dev_cfg[2]); -pre_kernel_late_init(stellaris_uart2, NULL); +SYS_DEFINE_DEVICE(stellaris_uart2, NULL, SECONDARY, + CONFIG_KERNEL_INIT_PRIORITY_DEVICE); /**< UART Devices */ diff --git a/arch/arm/platforms/ti_lm3s6965/system.c b/arch/arm/platforms/ti_lm3s6965/system.c index a86d6d03437..afbf09f86ba 100644 --- a/arch/arm/platforms/ti_lm3s6965/system.c +++ b/arch/arm/platforms/ti_lm3s6965/system.c @@ -57,4 +57,5 @@ static int ti_lm3s6965_init(struct device *arg) } DECLARE_DEVICE_INIT_CONFIG(ti_lm3_0, "", ti_lm3s6965_init, NULL); -pre_kernel_core_init(ti_lm3_0, NULL); +SYS_DEFINE_DEVICE(ti_lm3_0, NULL, PRIMARY, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); diff --git a/arch/x86/core/cache.c b/arch/x86/core/cache.c index 94d67410d9d..35f959c1c5d 100644 --- a/arch/x86/core/cache.c +++ b/arch/x86/core/cache.c @@ -108,6 +108,6 @@ static int init_cache(struct device *unused) } DECLARE_DEVICE_INIT_CONFIG(cache, "", init_cache, NULL); -pre_kernel_early_init(cache, NULL); +SYS_DEFINE_DEVICE(cache, NULL, PRIMARY, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); #endif /* CONFIG_CLFLUSH_DETECT || CONFIG_CACHE_LINE_SIZE_DETECT */ diff --git a/arch/x86/platforms/galileo/Kconfig b/arch/x86/platforms/galileo/Kconfig index e995681bcb3..289390ae059 100644 --- a/arch/x86/platforms/galileo/Kconfig +++ b/arch/x86/platforms/galileo/Kconfig @@ -333,4 +333,59 @@ config ETH_DW_0_IRQ config ETH_DW_0_IRQ_SHARED_NAME default SHARED_IRQ_0_NAME if SHARED_IRQ endif + + +config KERNEL_INIT_PRIORITY_DEFAULT + default 40 + +config SHARED_IRQ_INIT_PRIORITY + default 50 + +# Any device driver should be initialized after +# shared IRQ driver, as it may use it +config KERNEL_INIT_PRIORITY_DEVICE + default 60 + +config GPIO_MMIO_INIT_PRIORITY + default 60 + +config GPIO_SCH_INIT_PRIORITY + default 60 + +config GPIO_DW_INIT_PRIORITY + default 60 + +# SPI uses GPIO pin, so it needs to be initialized after +# GPIO driver +config SPI_INTEL_INIT_PRIORITY + default 70 + +# TI ADC108S102 uses SPI bus, thus +# initialized after SPI driver +config ADC_TI_ADC108S102_INIT_PRIORITY + default 80 + +config I2C_INIT_PRIORITY + default 60 + +# PCAL9535A uses I2C, thus initialized after it +config GPIO_PCAL9535A_INIT_PRIORITY + default 70 + +# PCA9685 uses I2C, thus initialized after it +config PWM_PCA9685_INIT_PRIORITY + default 70 + +# Grove RGB LCD uses I2C, thus initialized after it +config GROVE_LCD_RGB_INIT_PRIORITY + default 70 + +# Pin multiplexer uses PCAL9535A, needs to be initialized after it +config PINMUX_INIT_PRIORITY + default 80 + +# Console driver has to be initialized after UART, that it uses +config UART_CONSOLE_PRIORITY + default 70 + endif # PLATFORM_GALILEO diff --git a/arch/x86/platforms/galileo/galileo.c b/arch/x86/platforms/galileo/galileo.c index 51c55a817cf..e1d221d0b99 100644 --- a/arch/x86/platforms/galileo/galileo.c +++ b/arch/x86/platforms/galileo/galileo.c @@ -71,24 +71,25 @@ static int pci_legacy_bridge_irq_config(struct device *unused) } DECLARE_DEVICE_INIT_CONFIG(pci_legacy_bridge_0, "", pci_legacy_bridge_irq_config, NULL); -pre_kernel_late_init(pci_legacy_bridge_0, NULL); +SYS_DEFINE_DEVICE(pci_legacy_bridge_0, NULL, SECONDARY, + CONFIG_KERNEL_INIT_PRIORITY_DEVICE); #endif /* CONFIG_PCI_LEGACY_BRIDGE */ #ifdef CONFIG_IOAPIC DECLARE_DEVICE_INIT_CONFIG(ioapic_0, "", _ioapic_init, NULL); -pre_kernel_core_init(ioapic_0, NULL); +SYS_DEFINE_DEVICE(ioapic_0, NULL, PRIMARY, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); #endif /* CONFIG_IOAPIC */ #ifdef CONFIG_LOAPIC DECLARE_DEVICE_INIT_CONFIG(loapic_0, "", _loapic_init, NULL); -pre_kernel_core_init(loapic_0, NULL); +SYS_DEFINE_DEVICE(loapic_0, NULL, PRIMARY, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); #endif /* CONFIG_LOAPIC */ #if defined(CONFIG_PIC_DISABLE) DECLARE_DEVICE_INIT_CONFIG(pic_0, "", _i8259_init, NULL); -pre_kernel_core_init(pic_0, NULL); +SYS_DEFINE_DEVICE(pic_0, NULL, PRIMARY, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); #endif /* CONFIG_PIC_DISABLE */ diff --git a/arch/x86/platforms/galileo/galileo_config.c b/arch/x86/platforms/galileo/galileo_config.c index b9b2cad5ef5..842133698fb 100644 --- a/arch/x86/platforms/galileo/galileo_config.c +++ b/arch/x86/platforms/galileo/galileo_config.c @@ -120,9 +120,11 @@ DECLARE_DEVICE_INIT_CONFIG(ns16550_uart0, #if (defined(CONFIG_EARLY_CONSOLE) && \ defined(CONFIG_UART_CONSOLE) && \ (CONFIG_UART_CONSOLE_INDEX == 0)) -pre_kernel_core_init(ns16550_uart0, &ns16550_uart_dev_data[0]); +SYS_DEFINE_DEVICE(ns16550_uart0, &ns16550_uart_dev_data[0], PRIMARY, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); #else -pre_kernel_early_init(ns16550_uart0, &ns16550_uart_dev_data[0]); +SYS_DEFINE_DEVICE(ns16550_uart0, &ns16550_uart_dev_data[0], SECONDARY, + CONFIG_KERNEL_INIT_PRIORITY_DEVICE); #endif /* CONFIG_EARLY_CONSOLE */ @@ -135,9 +137,11 @@ DECLARE_DEVICE_INIT_CONFIG(ns16550_uart1, #if (defined(CONFIG_EARLY_CONSOLE) && \ defined(CONFIG_UART_CONSOLE) && \ (CONFIG_UART_CONSOLE_INDEX == 1)) -pre_kernel_core_init(ns16550_uart1, &ns16550_uart_dev_data[1]); +SYS_DEFINE_DEVICE(ns16550_uart1, &ns16550_uart_dev_data[1], PRIMARY, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); #else -pre_kernel_early_init(ns16550_uart1, &ns16550_uart_dev_data[1]); +SYS_DEFINE_DEVICE(ns16550_uart1, &ns16550_uart_dev_data[1], SECONDARY, + CONFIG_KERNEL_INIT_PRIORITY_DEVICE); #endif /* CONFIG_EARLY_CONSOLE */ diff --git a/arch/x86/platforms/galileo/galileo_pinmux.c b/arch/x86/platforms/galileo/galileo_pinmux.c index eb155359623..b8dbf97d4d3 100644 --- a/arch/x86/platforms/galileo/galileo_pinmux.c +++ b/arch/x86/platforms/galileo/galileo_pinmux.c @@ -758,4 +758,5 @@ struct galileo_data galileo_pinmux_driver = { * 1 - PCA9535 and PCAL9685 * 2 - pinmux */ -nano_early_init(pmux, &galileo_pinmux_driver); +SYS_DEFINE_DEVICE(pmux, &galileo_pinmux_driver, SECONDARY, + CONFIG_PINMUX_INIT_PRIORITY); diff --git a/arch/x86/platforms/ia32/Kconfig b/arch/x86/platforms/ia32/Kconfig index 566837b4ac9..4b04109c13b 100644 --- a/arch/x86/platforms/ia32/Kconfig +++ b/arch/x86/platforms/ia32/Kconfig @@ -42,4 +42,16 @@ config SYS_CLOCK_HW_CYCLES_PER_SEC default 150000000 if LOAPIC_TIMER default 25000000 if HPET_TIMER +config KERNEL_INIT_PRIORITY_DEFAULT + default 40 + +config KERNEL_INIT_PRIORITY_DEVICE + default 50 + +config UART_CONSOLE_PRIORITY + default 60 + +config IPI_CONSOLE_PRIORITY + default 60 + endif diff --git a/arch/x86/platforms/ia32/ia32.c b/arch/x86/platforms/ia32/ia32.c index 2ece4b73ae6..25093cdd800 100644 --- a/arch/x86/platforms/ia32/ia32.c +++ b/arch/x86/platforms/ia32/ia32.c @@ -52,22 +52,26 @@ static int ia32_init(struct device *arg) #ifdef CONFIG_IOAPIC DECLARE_DEVICE_INIT_CONFIG(ioapic_0, "", _ioapic_init, NULL); -pre_kernel_core_init(ioapic_0, NULL); +SYS_DEFINE_DEVICE(ioapic_0, NULL, PRIMARY, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); #endif /* CONFIG_IOAPIC */ #ifdef CONFIG_LOAPIC DECLARE_DEVICE_INIT_CONFIG(loapic_0, "", _loapic_init, NULL); -pre_kernel_core_init(loapic_0, NULL); +SYS_DEFINE_DEVICE(loapic_0, NULL, PRIMARY, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); #endif /* CONFIG_LOAPIC */ #if defined(CONFIG_PIC_DISABLE) DECLARE_DEVICE_INIT_CONFIG(pic_0, "", _i8259_init, NULL); -pre_kernel_core_init(pic_0, NULL); +SYS_DEFINE_DEVICE(pic_0, NULL, PRIMARY, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); #endif /* CONFIG_PIC_DISABLE */ DECLARE_DEVICE_INIT_CONFIG(ia32_0, "", ia32_init, NULL); -pre_kernel_early_init(ia32_0, NULL); +SYS_DEFINE_DEVICE(ia32_0, NULL, SECONDARY, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); diff --git a/arch/x86/platforms/ia32/ia32_config.c b/arch/x86/platforms/ia32/ia32_config.c index 34b3fafc1c4..a62f670587b 100644 --- a/arch/x86/platforms/ia32/ia32_config.c +++ b/arch/x86/platforms/ia32/ia32_config.c @@ -102,9 +102,11 @@ DECLARE_DEVICE_INIT_CONFIG(ns16550_uart0, #if (defined(CONFIG_EARLY_CONSOLE) && \ defined(CONFIG_UART_CONSOLE) && \ (CONFIG_UART_CONSOLE_INDEX == 0)) -pre_kernel_core_init(ns16550_uart0, &ns16550_uart_dev_data[0]); +SYS_DEFINE_DEVICE(ns16550_uart0, &ns16550_uart_dev_data[0], PRIMARY, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); #else -pre_kernel_early_init(ns16550_uart0, &ns16550_uart_dev_data[0]); +SYS_DEFINE_DEVICE(ns16550_uart0, &ns16550_uart_dev_data[0], SECONDARY, + CONFIG_KERNEL_INIT_PRIORITY_DEVICE); #endif /* CONFIG_EARLY_CONSOLE */ @@ -117,9 +119,11 @@ DECLARE_DEVICE_INIT_CONFIG(ns16550_uart1, #if (defined(CONFIG_EARLY_CONSOLE) && \ defined(CONFIG_UART_CONSOLE) && \ (CONFIG_UART_CONSOLE_INDEX == 1)) -pre_kernel_core_init(ns16550_uart1, &ns16550_uart_dev_data[1]); +SYS_DEFINE_DEVICE(ns16550_uart1, &ns16550_uart_dev_data[1], PRIMARY, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); #else -pre_kernel_early_init(ns16550_uart1, &ns16550_uart_dev_data[1]); +SYS_DEFINE_DEVICE(ns16550_uart1, &ns16550_uart_dev_data[1], SECONDARY, + CONFIG_KERNEL_INIT_PRIORITY_DEVICE); #endif /* CONFIG_EARLY_CONSOLE */ diff --git a/arch/x86/platforms/ia32_pci/Kconfig b/arch/x86/platforms/ia32_pci/Kconfig index 4291106e0a0..6d94a238ccc 100644 --- a/arch/x86/platforms/ia32_pci/Kconfig +++ b/arch/x86/platforms/ia32_pci/Kconfig @@ -45,4 +45,13 @@ config SYS_CLOCK_HW_CYCLES_PER_SEC config UART_CONSOLE_INDEX default 1 +config KERNEL_INIT_PRIORITY_DEFAULT + default 40 + +config KERNEL_INIT_PRIORITY_DEVICE + default 50 + +config UART_CONSOLE_PRIORITY + default 60 + endif diff --git a/arch/x86/platforms/ia32_pci/ia32_pci.c b/arch/x86/platforms/ia32_pci/ia32_pci.c index 79ef7c20e46..ab932541b80 100644 --- a/arch/x86/platforms/ia32_pci/ia32_pci.c +++ b/arch/x86/platforms/ia32_pci/ia32_pci.c @@ -43,19 +43,22 @@ #ifdef CONFIG_IOAPIC DECLARE_DEVICE_INIT_CONFIG(ioapic_0, "", _ioapic_init, NULL); -pre_kernel_core_init(ioapic_0, NULL); +SYS_DEFINE_DEVICE(ioapic_0, NULL, PRIMARY, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); #endif /* CONFIG_IOAPIC */ #ifdef CONFIG_LOAPIC DECLARE_DEVICE_INIT_CONFIG(loapic_0, "", _loapic_init, NULL); -pre_kernel_core_init(loapic_0, NULL); +SYS_DEFINE_DEVICE(loapic_0, NULL, PRIMARY, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); #endif /* CONFIG_LOAPIC */ #if defined(CONFIG_PIC_DISABLE) DECLARE_DEVICE_INIT_CONFIG(pic_0, "", _i8259_init, NULL); -pre_kernel_core_init(pic_0, NULL); +SYS_DEFINE_DEVICE(pic_0, NULL, PRIMARY, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); #endif /* CONFIG_PIC_DISABLE */ diff --git a/arch/x86/platforms/ia32_pci/ia32_pci_config.c b/arch/x86/platforms/ia32_pci/ia32_pci_config.c index 7aa6018f06e..03e9b73bbc7 100644 --- a/arch/x86/platforms/ia32_pci/ia32_pci_config.c +++ b/arch/x86/platforms/ia32_pci/ia32_pci_config.c @@ -115,9 +115,11 @@ DECLARE_DEVICE_INIT_CONFIG(ns16550_uart0, #if (defined(CONFIG_EARLY_CONSOLE) && \ defined(CONFIG_UART_CONSOLE) && \ (CONFIG_UART_CONSOLE_INDEX == 0)) -pre_kernel_early_init(ns16550_uart0, &ns16550_uart_dev_data[0]); +SYS_DEFINE_DEVICE(ns16550_uart0, &ns16550_uart_dev_data[0], PRIMARY, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); #else -pre_kernel_late_init(ns16550_uart0, &ns16550_uart_dev_data[0]); +SYS_DEFINE_DEVICE(ns16550_uart0, &ns16550_uart_dev_data[0], SECONDARY, + CONFIG_KERNEL_INIT_PRIORITY_DEVICE); #endif /* CONFIG_EARLY_CONSOLE */ @@ -130,9 +132,11 @@ DECLARE_DEVICE_INIT_CONFIG(ns16550_uart1, #if (defined(CONFIG_EARLY_CONSOLE) && \ defined(CONFIG_UART_CONSOLE) && \ (CONFIG_UART_CONSOLE_INDEX == 1)) -pre_kernel_early_init(ns16550_uart1, &ns16550_uart_dev_data[1]); +SYS_DEFINE_DEVICE(ns16550_uart1, &ns16550_uart_dev_data[1], PRIMARY, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); #else -pre_kernel_late_init(ns16550_uart1, &ns16550_uart_dev_data[1]); +SYS_DEFINE_DEVICE(ns16550_uart1, &ns16550_uart_dev_data[1], SECONDARY, + CONFIG_KERNEL_INIT_PRIORITY_DEVICE); #endif /* CONFIG_EARLY_CONSOLE */ diff --git a/arch/x86/platforms/quark_d2000/Kconfig b/arch/x86/platforms/quark_d2000/Kconfig index f54ea063d07..25c1cdfa126 100644 --- a/arch/x86/platforms/quark_d2000/Kconfig +++ b/arch/x86/platforms/quark_d2000/Kconfig @@ -50,4 +50,13 @@ config LOAPIC_TIMER_IRQ_PRIORITY config PHYS_RAM_ADDR default 0x00280000 +config KERNEL_INIT_PRIORITY_DEFAULT + default 40 + +config KERNEL_INIT_PRIORITY_DEVICE + default 50 + +config UART_CONSOLE_PRIORITY + default 60 + endif diff --git a/arch/x86/platforms/quark_d2000/quark_d2000_config.c b/arch/x86/platforms/quark_d2000/quark_d2000_config.c index 3af51170da5..ff12464e297 100644 --- a/arch/x86/platforms/quark_d2000/quark_d2000_config.c +++ b/arch/x86/platforms/quark_d2000/quark_d2000_config.c @@ -97,7 +97,8 @@ DECLARE_DEVICE_INIT_CONFIG(ns16550_uart0, &uart_platform_init, &ns16550_uart_dev_cfg[0]); -pre_kernel_early_init(ns16550_uart0, &ns16550_uart_dev_data[0]); +SYS_DEFINE_DEVICE(ns16550_uart0, &ns16550_uart_dev_data[0], + SECONDARY, CONFIG_KERNEL_INIT_PRIORITY_DEVICE); /* UART 1 */ @@ -106,7 +107,8 @@ DECLARE_DEVICE_INIT_CONFIG(ns16550_uart1, &uart_platform_init, &ns16550_uart_dev_cfg[1]); -pre_kernel_early_init(ns16550_uart1, &ns16550_uart_dev_data[1]); +SYS_DEFINE_DEVICE(ns16550_uart1, &ns16550_uart_dev_data[1], + SECONDARY, CONFIG_KERNEL_INIT_PRIORITY_DEVICE); struct device * const uart_devs[] = { diff --git a/arch/x86/platforms/quark_d2000/system.c b/arch/x86/platforms/quark_d2000/system.c index 7b4d41d58c2..4243665414a 100644 --- a/arch/x86/platforms/quark_d2000/system.c +++ b/arch/x86/platforms/quark_d2000/system.c @@ -51,9 +51,10 @@ static int quark_d2000_init(struct device *arg) return 0; } DECLARE_DEVICE_INIT_CONFIG(quark_d2000_0, "", quark_d2000_init, NULL); -pre_kernel_core_init(quark_d2000_0, NULL); +SYS_DEFINE_DEVICE(quark_d2000_0, NULL, PRIMARY, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); #ifdef CONFIG_MVIC DECLARE_DEVICE_INIT_CONFIG(mvic_0, "", _mvic_init, NULL); -pre_kernel_core_init(mvic_0, NULL); +SYS_DEFINE_DEVICE(mvic_0, NULL, PRIMARY, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); #endif /* CONFIG_IOAPIC */ diff --git a/arch/x86/platforms/quark_se-x86/Kconfig b/arch/x86/platforms/quark_se-x86/Kconfig index 5378abb8a77..5928e227e2e 100644 --- a/arch/x86/platforms/quark_se-x86/Kconfig +++ b/arch/x86/platforms/quark_se-x86/Kconfig @@ -169,4 +169,22 @@ config SPI_DW_PORT_1_IRQ default 3 endif -endif +config KERNEL_INIT_PRIORITY_DEFAULT + default 40 + +config KERNEL_INIT_PRIORITY_DEVICE + default 50 + +config UART_CONSOLE_PRIORITY + default 60 + +config IPI_CONSOLE_PRIORITY + default 60 + +config GPIO_DW_INIT_PRIORITY + default 60 + +config I2C_INIT_PRIORITY + default 60 + +endif #PLATFORM_QUARK_SE_X86 diff --git a/arch/x86/platforms/quark_se-x86/pinmux.c b/arch/x86/platforms/quark_se-x86/pinmux.c index f6f49a2bca2..0f542c41ce2 100644 --- a/arch/x86/platforms/quark_se-x86/pinmux.c +++ b/arch/x86/platforms/quark_se-x86/pinmux.c @@ -178,4 +178,4 @@ DECLARE_DEVICE_INIT_CONFIG(pmux, /* config name */ &pinmux_initialize, /* init function */ &board_pmux); /* config options*/ -pre_kernel_late_init(pmux, NULL); +SYS_DEFINE_DEVICE(pmux, NULL, SECONDARY, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); diff --git a/arch/x86/platforms/quark_se-x86/quark_se_config.c b/arch/x86/platforms/quark_se-x86/quark_se_config.c index a18ad01bdb9..47556249ef2 100644 --- a/arch/x86/platforms/quark_se-x86/quark_se_config.c +++ b/arch/x86/platforms/quark_se-x86/quark_se_config.c @@ -87,7 +87,8 @@ DECLARE_DEVICE_INIT_CONFIG(ns16550_uart1, static struct uart_ns16550_dev_data_t ns16550_uart1_dev_data; -pre_kernel_early_init(ns16550_uart1, &ns16550_uart1_dev_data); +SYS_DEFINE_DEVICE(ns16550_uart1, &ns16550_uart1_dev_data, + PRIMARY, CONFIG_KERNEL_INIT_PRIORITY_DEVICE); /** @@ -119,7 +120,8 @@ static struct quark_se_ipi_controller_config_info ipi_controller_config = { }; DECLARE_DEVICE_INIT_CONFIG(quark_se_ipi, "", quark_se_ipi_controller_initialize, &ipi_controller_config); -pre_kernel_early_init(quark_se_ipi, NULL); +SYS_DEFINE_DEVICE(quark_se_ipi, NULL, PRIMARY, + CONFIG_KERNEL_INIT_PRIORITY_DEVICE); #if defined(CONFIG_IPI_CONSOLE_RECEIVER) && defined(CONFIG_PRINTK) #include @@ -146,7 +148,8 @@ struct ipi_console_receiver_runtime_data quark_se_ipi_receiver_driver_data; DECLARE_DEVICE_INIT_CONFIG(ipi_console0, "ipi_console0", ipi_console_receiver_init, &quark_se_ipi_receiver_config); -nano_early_init(ipi_console0, &quark_se_ipi_receiver_driver_data); +SYS_DEFINE_DEVICE(ipi_console0, &quark_se_ipi_receiver_driver_data, + SECONDARY, CONFIG_IPI_CONSOLE_PRIORITY); #endif /* CONFIG_PRINTK && CONFIG_IPI_CONSOLE_RECEIVER */ #endif /* CONFIG_IPI_QUARK_SE */ diff --git a/arch/x86/platforms/quark_se-x86/system.c b/arch/x86/platforms/quark_se-x86/system.c index 55b42884e51..f445d7ec9d0 100644 --- a/arch/x86/platforms/quark_se-x86/system.c +++ b/arch/x86/platforms/quark_se-x86/system.c @@ -89,19 +89,20 @@ static int arc_init(struct device *arg) } DECLARE_DEVICE_INIT_CONFIG(quark_se_ss_0, "", arc_init, NULL); -pre_kernel_late_init(quark_se_ss_0, NULL); +SYS_DEFINE_DEVICE(quark_se_ss_0, NULL, SECONDARY, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); #endif /*CONFIG_ARC_INIT*/ #ifdef CONFIG_IOAPIC DECLARE_DEVICE_INIT_CONFIG(ioapic_0, "", _ioapic_init, NULL); -pre_kernel_early_init(ioapic_0, NULL); +SYS_DEFINE_DEVICE(ioapic_0, NULL, PRIMARY, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); #endif /* CONFIG_IOAPIC */ #ifdef CONFIG_LOAPIC DECLARE_DEVICE_INIT_CONFIG(loapic_0, "", _loapic_init, NULL); -pre_kernel_early_init(loapic_0, NULL); +SYS_DEFINE_DEVICE(loapic_0, NULL, PRIMARY, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); #endif /* CONFIG_LOAPIC */ diff --git a/drivers/adc/Kconfig b/drivers/adc/Kconfig index 4c9d00f4795..dab95cb7ad9 100644 --- a/drivers/adc/Kconfig +++ b/drivers/adc/Kconfig @@ -42,6 +42,15 @@ config ADC_TI_ADC108S102 help Enable support for TI's ADC chip adc108s102 driver. +config ADC_TI_ADC108S102_INIT_PRIORITY + int + depends on ADC_TI_ADC108S102 + prompt "Init priority" + help + Device driver initialization priority. + Device is connected to SPI bus, it has to + be initialized after SPI driver. + config ADC_TI_ADC108S102_0 bool "First instance of TI's adc108s102 chip" depends on ADC_TI_ADC108S102 diff --git a/drivers/adc/adc_dw.c b/drivers/adc/adc_dw.c index bc28e16dc3c..580344a0f8f 100644 --- a/drivers/adc/adc_dw.c +++ b/drivers/adc/adc_dw.c @@ -318,7 +318,8 @@ DECLARE_DEVICE_INIT_CONFIG(adc_dw_0, /* config name*/ &adc_dw_init, /* init function*/ &adc_config_dev_0); /* config options*/ -pre_kernel_late_init(adc_dw_0, &adc_info_dev_0); +SYS_DEFINE_DEVICE(adc_dw_0, &adc_info_dev_0, SECONDARY, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); struct device *adc_dw_isr_0_device = SYS_GET_DEVICE(adc_dw_0); IRQ_CONNECT_STATIC(adc_dw_0, diff --git a/drivers/adc/adc_ti_adc108s102.c b/drivers/adc/adc_ti_adc108s102.c index fa4cdd0c2b6..f2dd01c9eeb 100644 --- a/drivers/adc/adc_ti_adc108s102.c +++ b/drivers/adc/adc_ti_adc108s102.c @@ -289,6 +289,7 @@ struct ti_adc108s102_config adc108s102_0_config = { DECLARE_DEVICE_INIT_CONFIG(adc108s102_0, CONFIG_ADC_TI_ADC108S102_0_DRV_NAME, ti_adc108s102_init, &adc108s102_0_config); -nano_early_init(adc108s102_0, &adc108s102_0_data); +SYS_DEFINE_DEVICE(adc108s102_0, &adc108s102_0_data, SECONDARY, + CONFIG_ADC_TI_ADC108S102_INIT_PRIORITY); #endif /* CONFIG_ADC_TI_ADC108S102_0 */ diff --git a/drivers/aio/aio_dw_comparator.c b/drivers/aio/aio_dw_comparator.c index 55a43465493..d73049f2e9b 100644 --- a/drivers/aio/aio_dw_comparator.c +++ b/drivers/aio/aio_dw_comparator.c @@ -217,7 +217,8 @@ struct dw_aio_cmp_dev_data_t dw_aio_cmp_dev_data = { .num_cmp = AIO_DW_CMP_COUNT, }; -micro_early_init(dw_aio_cmp, &dw_aio_cmp_dev_data); +SYS_DEFINE_DEVICE(dw_aio_cmp, &dw_aio_cmp_dev_data, SECONDARY, + CONFIG_KERNEL_INIT_PRIORITY_DEVICE); struct device *dw_aio_cmp_device = SYS_GET_DEVICE(dw_aio_cmp); diff --git a/drivers/bluetooth/uart.c b/drivers/bluetooth/uart.c index faeb588c758..eb015e74523 100644 --- a/drivers/bluetooth/uart.c +++ b/drivers/bluetooth/uart.c @@ -273,4 +273,5 @@ static int _bt_uart_init(struct device *unused) } DECLARE_DEVICE_INIT_CONFIG(bt_uart, "", _bt_uart_init, NULL); -nano_late_init(bt_uart, NULL); +SYS_DEFINE_DEVICE(bt_uart, NULL, NANOKERNEL, + CONFIG_KERNEL_INIT_PRIORITY_DEVICE); diff --git a/drivers/clock_control/quark_se_clock_control.c b/drivers/clock_control/quark_se_clock_control.c index 552feed19b7..d36133b38ad 100644 --- a/drivers/clock_control/quark_se_clock_control.c +++ b/drivers/clock_control/quark_se_clock_control.c @@ -106,7 +106,8 @@ DECLARE_DEVICE_INIT_CONFIG(clock_quark_se_peripheral, &quark_se_clock_control_init, &clock_quark_se_peripheral_config); -pre_kernel_early_init(clock_quark_se_peripheral, NULL); +SYS_DEFINE_DEVICE(clock_quark_se_peripheral, NULL, PRIMARY, + CONFIG_KERNEL_INIT_PRIORITY_DEVICE); #endif /* CONFIG_CLOCK_CONTROL_QUARK_SE_PERIPHERAL */ #ifdef CONFIG_CLOCK_CONTROL_QUARK_SE_EXTERNAL @@ -120,7 +121,8 @@ DECLARE_DEVICE_INIT_CONFIG(clock_quark_se_external, &quark_se_clock_control_init, &clock_quark_se_external_config); -pre_kernel_early_init(clock_quark_se_external, NULL); +SYS_DEFINE_DEVICE(clock_quark_se_external, NULL, PRIMARY, + CONFIG_KERNEL_INIT_PRIORITY_DEVICE); #endif /* CONFIG_CLOCK_CONTROL_QUARK_SE_EXTERNAL */ #ifdef CONFIG_CLOCK_CONTROL_QUARK_SE_SENSOR @@ -134,5 +136,6 @@ DECLARE_DEVICE_INIT_CONFIG(clock_quark_se_sensor, &quark_se_clock_control_init, &clock_quark_se_sensor_config); -pre_kernel_early_init(clock_quark_se_sensor, NULL); +SYS_DEFINE_DEVICE(clock_quark_se_sensor, NULL, PRIMARY, + CONFIG_KERNEL_INIT_PRIORITY_DEVICE); #endif /* CONFIG_CLOCK_CONTROL_QUARK_SE_SENSOR */ diff --git a/drivers/console/Kconfig b/drivers/console/Kconfig index e3464b9bbbd..0186f65c12b 100644 --- a/drivers/console/Kconfig +++ b/drivers/console/Kconfig @@ -67,6 +67,15 @@ config UART_CONSOLE_BAUDRATE Default is 115200, which should be usable for most RS232 and USB adapters. +config UART_CONSOLE_PRIORITY + int + prompt "Init priority" + depends on UART_CONSOLE + help + Device driver initialization priority. + Console has to be initialized after the UART driver + it uses. + config RAM_CONSOLE bool prompt "Use RAM console" @@ -101,6 +110,16 @@ config IPI_CONSOLE_RECEIVER help Enable the receiving side of IPI console +config IPI_CONSOLE_PRIORITY + int + prompt "IPI console init priority" + default 60 + depends on IPI_CONSOLE_SENDER || IPI_CONSOLE_RECEIVER + help + Device driver initialization priority. + Console has to be initialized after the IPI subsystem + it uses. + config UART_PIPE bool prompt "Enable pipe UART driver" diff --git a/drivers/console/ram_console.c b/drivers/console/ram_console.c index 7f96af2c49a..73e43c568b2 100644 --- a/drivers/console/ram_console.c +++ b/drivers/console/ram_console.c @@ -46,5 +46,5 @@ static int ram_console_init(struct device *d) } DECLARE_DEVICE_INIT_CONFIG(ram_console, "", ram_console_init, NULL); -pre_kernel_early_init(ram_console, NULL); +SYS_DEFINE_DEVICE(ram_console, NULL, PRIMARY, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); diff --git a/drivers/console/uart_console.c b/drivers/console/uart_console.c index 91c5325a7d2..208930e1156 100644 --- a/drivers/console/uart_console.c +++ b/drivers/console/uart_console.c @@ -239,4 +239,10 @@ static int uart_console_init(struct device *arg) return DEV_OK; } DECLARE_DEVICE_INIT_CONFIG(uart_console, "", uart_console_init, NULL); -pre_kernel_late_init(uart_console, NULL); + +/* UART consloe initializes after the UART device itself */ +#if defined(CONFIG_EARLY_CONSOLE) +SYS_DEFINE_DEVICE(uart_console, NULL, PRIMARY, CONFIG_UART_CONSOLE_PRIORITY); +#else +SYS_DEFINE_DEVICE(uart_console, NULL, SECONDARY, CONFIG_UART_CONSOLE_PRIORITY); +#endif diff --git a/drivers/ethernet/eth_dw.c b/drivers/ethernet/eth_dw.c index 30929903ab0..68afa4d4106 100644 --- a/drivers/ethernet/eth_dw.c +++ b/drivers/ethernet/eth_dw.c @@ -305,7 +305,8 @@ static struct eth_runtime eth_0_runtime; DECLARE_DEVICE_INIT_CONFIG(eth_dw_0, CONFIG_ETH_DW_0_NAME, eth_initialize, ð_config_0); -nano_late_init(eth_dw_0, ð_0_runtime); +SYS_DEFINE_DEVICE(eth_dw_0, ð_0_runtime, NANOKERNEL, + CONFIG_KERNEL_INIT_PRIORITY_DEVICE); static int eth_net_tx(struct net_buf *buf) { diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index 60fe71dc4ec..eead17d015a 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig @@ -73,6 +73,12 @@ config GPIO_DW_CLASS depends on GPIO_DW && PCI default 0x0C +config GPIO_DW_INIT_PRIORITY + int + prompt "Init priority" + help + Device driver initialization priority. + config GPIO_DW_0 bool "Designware GPIO block 0" depends on GPIO_DW @@ -295,6 +301,12 @@ config GPIO_PCAL9535A_DEBUG help Enable debugging for PCAL9535A driver. +config GPIO_PCAL9535A_INIT_PRIORITY + int + prompt "Init priority" + help + Device driver initialization priority. + config GPIO_PCAL9535A_0 bool "PCAL9535A GPIO chip #0" depends on GPIO_PCAL9535A @@ -419,6 +431,13 @@ config GPIO_MMIO help Enable driver for MMIO-based GPIOs. +config GPIO_MMIO_INIT_PRIORITY + int + depends on GPIO_MMIO + prompt "Init priority" + help + Device driver initialization priority. + config GPIO_MMIO_0 bool "MMIO-based GPIO Port #0" depends on GPIO_MMIO @@ -554,6 +573,13 @@ config GPIO_SCH help Enable the SCH GPIO driver found on Intel platforms +config GPIO_SCH_INIT_PRIORITY + int + depends on GPIO_SCH + prompt "Init priority" + help + Device driver initialization priority. + config GPIO_SCH_LEGACY_IO_PORTS_ACCESS bool "SCH registers accessed through legacy I/O ports" depends on GPIO_SCH diff --git a/drivers/gpio/gpio_dw.c b/drivers/gpio/gpio_dw.c index 4a7986a6ec5..de252fade29 100644 --- a/drivers/gpio/gpio_dw.c +++ b/drivers/gpio/gpio_dw.c @@ -358,7 +358,8 @@ struct gpio_dw_runtime gpio_0_runtime; DECLARE_DEVICE_INIT_CONFIG(gpio_0, CONFIG_GPIO_DW_0_NAME, gpio_dw_initialize, &gpio_config_0); -pre_kernel_late_init(gpio_0, &gpio_0_runtime); +SYS_DEFINE_DEVICE(gpio_0, &gpio_0_runtime, SECONDARY, + CONFIG_GPIO_DW_INIT_PRIORITY); #ifdef CONFIG_GPIO_DW_0_IRQ_DIRECT struct device *gpio_dw_isr_0 = SYS_GET_DEVICE(gpio_0); @@ -416,8 +417,9 @@ struct gpio_dw_config gpio_dw_config_1 = { struct gpio_dw_runtime gpio_1_runtime; DECLARE_DEVICE_INIT_CONFIG(gpio_1, CONFIG_GPIO_DW_1_NAME, - gpio_dw_initialize, &gpio_dw_config_1); -pre_kernel_late_init(gpio_1, &gpio_1_runtime); + gpio_dw_initialize, &gpio_config_1); +SYS_DEFINE_DEVICE(gpio_1, &gpio_1_runtime, SECONDARY, + CONFIG_GPIO_DW_INIT_PRIORITY); #ifdef CONFIG_GPIO_DW_1_IRQ_DIRECT struct device *gpio_dw_isr_1 = SYS_GET_DEVICE(gpio_1); diff --git a/drivers/gpio/gpio_mmio.c b/drivers/gpio/gpio_mmio.c index 412157fbbb9..bb39d51e057 100644 --- a/drivers/gpio/gpio_mmio.c +++ b/drivers/gpio/gpio_mmio.c @@ -342,7 +342,8 @@ DECLARE_DEVICE_INIT_CONFIG(gpio_mmio_0, CONFIG_GPIO_MMIO_0_DEV_NAME, gpio_mmio_init, &gpio_mmio_0_cfg); -pre_kernel_late_init(gpio_mmio_0, (void *)0); +SYS_DEFINE_DEVICE(gpio_mmio_0, (void *)0, SECONDARY, + CONFIG_GPIO_MMIO_INIT_PRIORITY); #endif /* CONFIG_GPIO_MMIO_0 */ @@ -374,6 +375,7 @@ DECLARE_DEVICE_INIT_CONFIG(gpio_mmio_1, CONFIG_GPIO_MMIO_1_DEV_NAME, gpio_mmio_init, &gpio_mmio_1_cfg); -pre_kernel_late_init(gpio_mmio_1, (void *)0); +SYS_DEFINE_DEVICE(gpio_mmio_1, (void *)0, SECONDARY, + CONFIG_GPIO_MMIO_INIT_PRIORITY); #endif /* CONFIG_GPIO_MMIO_1 */ diff --git a/drivers/gpio/gpio_pcal9535a.c b/drivers/gpio/gpio_pcal9535a.c index 2579c686e64..2a23da7e553 100644 --- a/drivers/gpio/gpio_pcal9535a.c +++ b/drivers/gpio/gpio_pcal9535a.c @@ -625,7 +625,8 @@ DECLARE_DEVICE_INIT_CONFIG(gpio_pcal9535a_0, gpio_pcal9535a_init, &gpio_pcal9535a_0_cfg); /* This has to init after I2C master */ -nano_early_init(gpio_pcal9535a_0, &gpio_pcal9535a_0_drvdata); +SYS_DEFINE_DEVICE(gpio_pcal9535a_0, &gpio_pcal9535a_0_drvdata, SECONDARY, + CONFIG_GPIO_PCAL9535A_INIT_PRIORITY); #endif /* CONFIG_GPIO_PCAL9535A_0 */ @@ -653,7 +654,8 @@ DECLARE_DEVICE_INIT_CONFIG(gpio_pcal9535a_1, gpio_pcal9535a_init, &gpio_pcal9535a_1_cfg); /* This has to init after I2C master */ -nano_early_init(gpio_pcal9535a_1, &gpio_pcal9535a_1_drvdata); +SYS_DEFINE_DEVICE(gpio_pcal9535a_1, &gpio_pcal9535a_1_drvdata, SECONDARY, + CONFIG_GPIO_PCAL9535A_INIT_PRIORITY); #endif /* CONFIG_GPIO_PCAL9535A_1 */ @@ -681,7 +683,8 @@ DECLARE_DEVICE_INIT_CONFIG(gpio_pcal9535a_2, gpio_pcal9535a_init, &gpio_pcal9535a_2_cfg); /* This has to init after I2C master */ -nano_early_init(gpio_pcal9535a_2, &gpio_pcal9535a_2_drvdata); +SYS_DEFINE_DEVICE(gpio_pcal9535a_2, &gpio_pcal9535a_2_drvdata, SECONDARY, + CONFIG_GPIO_PCAL9535A_INIT_PRIORITY); #endif /* CONFIG_GPIO_PCAL9535A_2 */ @@ -709,6 +712,7 @@ DECLARE_DEVICE_INIT_CONFIG(gpio_pcal9535a_3, gpio_pcal9535a_init, &gpio_pcal9535a_3_cfg); /* This has to init after I2C master */ -nano_early_init(gpio_pcal9535a_3, &gpio_pcal9535a_3_drvdata); +SYS_DEFINE_DEVICE(gpio_pcal9535a_3, &gpio_pcal9535a_3_drvdata, SECONDARY, + CONFIG_GPIO_PCAL9535A_INIT_PRIORITY); #endif /* CONFIG_GPIO_PCAL9535A_3 */ diff --git a/drivers/gpio/gpio_sch.c b/drivers/gpio/gpio_sch.c index b24e90c6e56..58a65c0d0fd 100644 --- a/drivers/gpio/gpio_sch.c +++ b/drivers/gpio/gpio_sch.c @@ -361,7 +361,8 @@ struct gpio_sch_data gpio_data_0; DECLARE_DEVICE_INIT_CONFIG(gpio_0, CONFIG_GPIO_SCH_0_DEV_NAME, gpio_sch_init, &gpio_sch_0_config); -pre_kernel_late_init(gpio_0, &gpio_data_0); +SYS_DEFINE_DEVICE(gpio_0, &gpio_data_0, SECONDARY, + CONFIG_GPIO_SCH_INIT_PRIORITY); #endif /* CONFIG_GPIO_SCH_0 */ #if CONFIG_GPIO_SCH_1 @@ -375,6 +376,7 @@ struct gpio_sch_data gpio_data_1; DECLARE_DEVICE_INIT_CONFIG(gpio_1, CONFIG_GPIO_SCH_1_DEV_NAME, gpio_sch_init, &gpio_sch_1_config); -pre_kernel_late_init(gpio_1, &gpio_data_1); +SYS_DEFINE_DEVICE(gpio_1, &gpio_data_1, SECONDARY, + CONFIG_GPIO_SCH_INIT_PRIORITY); #endif /* CONFIG_GPIO_SCH_1 */ diff --git a/drivers/grove/Kconfig b/drivers/grove/Kconfig index 3cf96f4b650..d27f44dfd1f 100644 --- a/drivers/grove/Kconfig +++ b/drivers/grove/Kconfig @@ -38,3 +38,12 @@ config GROVE_LCD_RGB help Setting this value will enable driver support for the Groove-LCD RGB Backlight. + +config GROVE_LCD_RGB_INIT_PRIORITY + int + prompt "Init priority" + depends on GROVE_LCD_RGB + help + Device driver initialization priority. + As the device is connected to I2C bus, its driver has + to be initialized after the I2C one. diff --git a/drivers/grove/lcd_rgb.c b/drivers/grove/lcd_rgb.c index e6a0d3355a4..6e88c22f55b 100644 --- a/drivers/grove/lcd_rgb.c +++ b/drivers/grove/lcd_rgb.c @@ -358,4 +358,5 @@ DECLARE_DEVICE_INIT_CONFIG(grove_lcd, glcd_initialize, &grove_lcd_config); -app_early_init(grove_lcd, &grove_lcd_driver); +SYS_DEFINE_DEVICE(grove_lcd, &grove_lcd_driver, SECONDARY, + CONFIG_GROVE_LCD_RGB_INIT_PRIORITY); diff --git a/drivers/i2c/Kconfig b/drivers/i2c/Kconfig index 12f27970633..64ab95b15a4 100644 --- a/drivers/i2c/Kconfig +++ b/drivers/i2c/Kconfig @@ -26,6 +26,13 @@ menuconfig I2C help Enable I2C Driver Configuration +config I2C_INIT_PRIORITY + int + depends on I2C + prompt "Init priority" + help + I2C device driver initialization priority. + config I2C_DW bool "Design Ware I2C support" depends on I2C diff --git a/drivers/i2c/i2c_dw.c b/drivers/i2c/i2c_dw.c index 277d8972e94..c01e009d427 100644 --- a/drivers/i2c/i2c_dw.c +++ b/drivers/i2c/i2c_dw.c @@ -837,7 +837,7 @@ DECLARE_DEVICE_INIT_CONFIG(i2c_0, &i2c_dw_initialize, &i2c_config_dw_0); -pre_kernel_late_init(i2c_0, &i2c_0_runtime); +SYS_DEFINE_DEVICE(i2c_0, &i2c_0_runtime, SECONDARY, CONFIG_I2C_INIT_PRIORITY); struct device *i2c_dw_isr_0_device = SYS_GET_DEVICE(i2c_0); #ifdef CONFIG_I2C_DW_0_IRQ_DIRECT @@ -889,7 +889,8 @@ DECLARE_DEVICE_INIT_CONFIG(i2c_1, &i2c_dw_initialize, &i2c_config_dw_1); -pre_kernel_late_init(i2c_1, &i2c_1_runtime); +SYS_DEFINE_DEVICE(i2c_1, &i2c_1_runtime, SECONDARY, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); struct device *i2c_dw_isr_1_device = SYS_GET_DEVICE(i2c_1); IRQ_CONNECT_STATIC(i2c_dw_1, diff --git a/drivers/i2c/i2c_quark_se_ss.c b/drivers/i2c/i2c_quark_se_ss.c index 2fc521b4f29..b8156960e86 100644 --- a/drivers/i2c/i2c_quark_se_ss.c +++ b/drivers/i2c/i2c_quark_se_ss.c @@ -751,7 +751,8 @@ DECLARE_DEVICE_INIT_CONFIG(i2c_ss_0, &i2c_qse_ss_initialize, &i2c_config_ss_0); -pre_kernel_late_init(i2c_ss_0, &i2c_ss_0_runtime); +SYS_DEFINE_DEVICE(i2c_ss_0, &i2c_ss_0_runtime, + SECONDARY, CONFIG_I2C_INIT_PRIORITY); #endif /* CONFIG_I2C_QUARK_SE_SS_0 */ @@ -785,6 +786,7 @@ DECLARE_DEVICE_INIT_CONFIG(i2c_ss_1, &i2c_qse_ss_initialize, &i2c_config_ss_1); -pre_kernel_late_init(i2c_ss_1, &i2c_qse_ss_1_runtime); +SYS_DEFINE_DEVICE(i2c_ss_1, &i2c_qse_ss_1_runtime, + SECONDARY, CONFIG_I2C_INIT_PRIORITY); #endif /* CONFIG_I2C_QUARK_SE_SS_1 */ diff --git a/drivers/ipi/ipi_quark_se.h b/drivers/ipi/ipi_quark_se.h index 73a3785e977..664d5e39c22 100644 --- a/drivers/ipi/ipi_quark_se.h +++ b/drivers/ipi/ipi_quark_se.h @@ -135,7 +135,8 @@ int quark_se_ipi_controller_initialize(struct device *d); DECLARE_DEVICE_INIT_CONFIG(name, _STRINGIFY(name), \ quark_se_ipi_initialize, \ &quark_se_ipi_config_##name); \ - pre_kernel_late_init(name, &quark_se_ipi_runtime_##name); + SYS_DEFINE_DEVICE(name, &quark_se_ipi_runtime_##name, SECONDARY, \ + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); #endif /* __INCquark_se_mailboxh */ diff --git a/drivers/pinmux/Kconfig b/drivers/pinmux/Kconfig index 2f8f4fc6957..f5f31cb19de 100644 --- a/drivers/pinmux/Kconfig +++ b/drivers/pinmux/Kconfig @@ -45,6 +45,16 @@ config PINMUX_DEV prototyping on new hardware. WARNING: When using these options, it is possible to permanently damage the hardware. +config PINMUX_INIT_PRIORITY + int + prompt "Init priority" + default 60 + depends on PINMUX + help + Device driver initialization priority. + The device needs to be initialized after all the devices it + uses. + config PINMUX_GALILEO_EXP0_NAME string "Name of the GPIO expander 0" depends on PINMUX && PLATFORM_GALILEO diff --git a/drivers/pwm/Kconfig b/drivers/pwm/Kconfig index a32da3e4067..86868091b45 100644 --- a/drivers/pwm/Kconfig +++ b/drivers/pwm/Kconfig @@ -29,6 +29,13 @@ config PWM_PCA9685 help Enable driver for PCA9685 I2C-based PWM chip. +config PWM_PCA9685_INIT_PRIORITY + int + depends on PWM_PCA9685 + prompt "Init priority" + help + Device driver initialization priority. + config PWM_PCA9685_0 bool "PCA9685 PWM chip #0" depends on PWM_PCA9685 diff --git a/drivers/pwm/pwm_pca9685.c b/drivers/pwm/pwm_pca9685.c index d49d291979b..6204a38868c 100644 --- a/drivers/pwm/pwm_pca9685.c +++ b/drivers/pwm/pwm_pca9685.c @@ -235,6 +235,7 @@ DECLARE_DEVICE_INIT_CONFIG(pwm_pca9685_0, pwm_pca9685_init, &pwm_pca9685_0_cfg); /* This has to init after I2C master */ -nano_early_init(pwm_pca9685_0, &pwm_pca9685_0_drvdata); +SYS_DEFINE_DEVICE(pwm_pca9685_0, &pwm_pca9685_0_drvdata, SECONDARY, + CONFIG_PWM_PCA9685_INIT_PRIORITY); #endif /* CONFIG_PWM_PCA9685_0 */ diff --git a/drivers/rtc/rtc_dw.c b/drivers/rtc/rtc_dw.c index f5278b82409..bc2394a50fd 100644 --- a/drivers/rtc/rtc_dw.c +++ b/drivers/rtc/rtc_dw.c @@ -152,5 +152,5 @@ struct rtc_dw_dev_config rtc_dev = { #ifdef CONFIG_RTC_DW DECLARE_DEVICE_INIT_CONFIG(rtc, RTC_DRV_NAME, &rtc_dw_init, &rtc_dev); -nano_early_init(rtc, NULL); +SYS_DEFINE_DEVICE(rtc, NULL, SECONDARY, CONFIG_KERNEL_INIT_PRIORITY_DEVICE); #endif diff --git a/drivers/shared_irq/Kconfig b/drivers/shared_irq/Kconfig index d75fbdf16ae..a7bd938f049 100644 --- a/drivers/shared_irq/Kconfig +++ b/drivers/shared_irq/Kconfig @@ -34,6 +34,14 @@ config SHARED_IRQ_NUM_CLIENTS instance of the shared interrupt driver. To conserve RAM set this value to the lowest practical value. +config SHARED_IRQ_INIT_PRIORITY + int + depends on SHARED_IRQ + prompt "Shared IRQ init priority" + help + Shared IRQ are initialized on SECONDARY init level. They + have to be initialized before any device that uses them. + config SHARED_IRQ_0 bool "Shared interrupt instance 0" depends on SHARED_IRQ diff --git a/drivers/shared_irq/shared_irq.c b/drivers/shared_irq/shared_irq.c index 288edf83542..3e84bd83a9f 100644 --- a/drivers/shared_irq/shared_irq.c +++ b/drivers/shared_irq/shared_irq.c @@ -142,7 +142,8 @@ struct shared_irq_runtime shared_irq_0_runtime; DECLARE_DEVICE_INIT_CONFIG(shared_irq_0, CONFIG_SHARED_IRQ_0_NAME, shared_irq_initialize, &shared_irq_config_0); -pre_kernel_early_init(shared_irq_0, &shared_irq_0_runtime); +SYS_DEFINE_DEVICE(shared_irq_0, &shared_irq_0_runtime, SECONDARY, + CONFIG_SHARED_IRQ_INIT_PRIORITY); IRQ_CONNECT_STATIC(shared_irq_0, CONFIG_SHARED_IRQ_0_IRQ, CONFIG_SHARED_IRQ_0_PRI, shared_irq_isr_0, 0, @@ -175,7 +176,8 @@ struct shared_irq_runtime shared_irq_1_runtime; DECLARE_DEVICE_INIT_CONFIG(shared_irq_1, CONFIG_SHARED_IRQ_1_NAME, shared_irq_initialize, &shared_irq_config_1); -pre_kernel_early_init(shared_irq_1, &shared_irq_1_runtime); +SYS_DEFINE_DEVICE(shared_irq_1, &shared_irq_1_runtime, SECONDARY, + CONFIG_SHARED_IRQ_INIT_PRIORITY); IRQ_CONNECT_STATIC(shared_irq_1, CONFIG_SHARED_IRQ_1_IRQ, CONFIG_SHARED_IRQ_1_PRI, shared_irq_isr_1, 0, diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig index 837abd90878..495fff7b2e4 100644 --- a/drivers/spi/Kconfig +++ b/drivers/spi/Kconfig @@ -91,6 +91,12 @@ config SPI_INTEL_CS_GPIO depends on SPI_INTEL && GPIO default n +config SPI_INTEL_INIT_PRIORITY + int + prompt "Init priority" + help + Device driver initialization priority. + config SPI_INTEL_PORT_0 bool prompt "Intel SPI port 0" diff --git a/drivers/spi/dw_spi.c b/drivers/spi/dw_spi.c index 81fd894b1a3..bb1228c4255 100644 --- a/drivers/spi/dw_spi.c +++ b/drivers/spi/dw_spi.c @@ -459,7 +459,8 @@ struct spi_dw_config spi_dw_config_0 = { DECLARE_DEVICE_INIT_CONFIG(spi_dw_port_0, CONFIG_SPI_DW_PORT_0_DRV_NAME, spi_dw_init, &spi_dw_config_0); -pre_kernel_late_init(spi_dw_port_0, &spi_dw_data_port_0); +SYS_DEFINE_DEVICE(spi_dw_port_0, &spi_dw_data_port_0, SECONDARY, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); struct device *spi_dw_isr_port_0 = SYS_GET_DEVICE(spi_dw_port_0); IRQ_CONNECT_STATIC(spi_dw_irq_port_0, CONFIG_SPI_DW_PORT_0_IRQ, @@ -494,7 +495,8 @@ struct spi_dw_config spi_dw_config_1 = { DECLARE_DEVICE_INIT_CONFIG(spi_dw_port_1, CONFIG_SPI_DW_PORT_1_DRV_NAME, spi_dw_init, &spi_dw_config_1); -pre_kernel_late_init(spi_dw_port_1, &spi_dw_data_port_1); +SYS_DEFINE_DEVICE(spi_dw_port_1, &spi_dw_data_port_1, SECONDARY, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); struct device *spi_dw_isr_port_1 = SYS_GET_DEVICE(spi_dw_port_1); IRQ_CONNECT_STATIC(spi_dw_irq_port_1, CONFIG_SPI_DW_PORT_1_IRQ, diff --git a/drivers/spi/intel_spi.c b/drivers/spi/intel_spi.c index 18cd66cb64b..1ae699a3848 100644 --- a/drivers/spi/intel_spi.c +++ b/drivers/spi/intel_spi.c @@ -455,7 +455,9 @@ struct spi_intel_config spi_intel_config_0 = { DECLARE_DEVICE_INIT_CONFIG(spi_intel_port_0, CONFIG_SPI_INTEL_PORT_0_DRV_NAME, spi_intel_init, &spi_intel_config_0); -nano_late_init(spi_intel_port_0, &spi_intel_data_port_0); +/* SPI may use GPIO pin for CS, thus it needs to be initialized after GPIO */ +SYS_DEFINE_DEVICE(spi_intel_port_0, &spi_intel_data_port_0, SECONDARY, + CONFIG_SPI_INTEL_INIT_PRIORITY); struct device *spi_intel_isr_port_0 = SYS_GET_DEVICE(spi_intel_port_0); IRQ_CONNECT_STATIC(spi_intel_irq_port_0, CONFIG_SPI_INTEL_PORT_0_IRQ, @@ -497,7 +499,9 @@ struct spi_intel_config spi_intel_config_1 = { DECLARE_DEVICE_INIT_CONFIG(spi_intel_port_1, CONFIG_SPI_INTEL_PORT_1_DRV_NAME, spi_intel_init, &spi_intel_config_1); -nano_late_init(spi_intel_port_1, &spi_intel_data_port_1); +/* SPI may use GPIO pin for CS, thus it needs to be initialized after GPIO */ +SYS_DEFINE_DEVICE(spi_intel_port_1, &spi_intel_data_port_1, SECONDARY, + CONFIG_SPI_INTEL_INIT_PRIORITY); struct device *spi_intel_isr_port_1 = SYS_GET_DEVICE(spi_intel_port_1); IRQ_CONNECT_STATIC(spi_intel_irq_port_1, CONFIG_SPI_INTEL_PORT_1_IRQ, diff --git a/drivers/timer/sys_clock_init.c b/drivers/timer/sys_clock_init.c index fc857a91815..b5cdad278fe 100644 --- a/drivers/timer/sys_clock_init.c +++ b/drivers/timer/sys_clock_init.c @@ -35,4 +35,5 @@ DECLARE_DEVICE_INIT_CONFIG(sys_clock, "sys_clock", _sys_clock_driver_init, NULL); -nano_late_init(sys_clock, NULL); +SYS_DEFINE_DEVICE(sys_clock, NULL, NANOKERNEL, + CONFIG_KERNEL_INIT_PRIORITY_DEVICE); diff --git a/drivers/watchdog/wdt_dw.c b/drivers/watchdog/wdt_dw.c index a9f191529e4..4077dfe224c 100644 --- a/drivers/watchdog/wdt_dw.c +++ b/drivers/watchdog/wdt_dw.c @@ -122,4 +122,4 @@ struct wdt_dw_dev_config wdt_dev = { DECLARE_DEVICE_INIT_CONFIG(wdt, WDT_DRV_NAME, &wdt_dw_init, &wdt_dev); -micro_early_init(wdt, NULL); +SYS_DEFINE_DEVICE(wdt, NULL, SECONDARY, CONFIG_KERNEL_INIT_PRIORITY_DEVICE); diff --git a/include/init.h b/include/init.h index 88aa510d236..86373e38ab4 100644 --- a/include/init.h +++ b/include/init.h @@ -103,25 +103,4 @@ #define SYS_GET_DEVICE(name) (&(_PASTE(__initconfig_, name))) -/* The following legacy APIs are provided for backwards compatibility */ - -#define pre_kernel_core_init(cfg, data) \ - SYS_DEFINE_DEVICE(cfg, data, PRIMARY, 0) -#define pre_kernel_early_init(cfg, data) \ - SYS_DEFINE_DEVICE(cfg, data, SECONDARY, 0) -#define pre_kernel_late_init(cfg, data) \ - SYS_DEFINE_DEVICE(cfg, data, SECONDARY, 50) -#define nano_early_init(cfg, data) \ - SYS_DEFINE_DEVICE(cfg, data, NANOKERNEL, 0) -#define nano_late_init(cfg, data) \ - SYS_DEFINE_DEVICE(cfg, data, NANOKERNEL, 50) -#define micro_early_init(cfg, data) \ - SYS_DEFINE_DEVICE(cfg, data, MICROKERNEL, 0) -#define micro_late_init(cfg, data) \ - SYS_DEFINE_DEVICE(cfg, data, MICROKERNEL, 50) -#define app_early_init(cfg, data) \ - SYS_DEFINE_DEVICE(cfg, data, APPLICATION, 0) -#define app_late_init(cfg, data) \ - SYS_DEFINE_DEVICE(cfg, data, APPLICATION, 50) - #endif /* _INIT_H_ */ diff --git a/kernel/Kconfig b/kernel/Kconfig index 2d9608f8d75..fb7f88d571a 100644 --- a/kernel/Kconfig +++ b/kernel/Kconfig @@ -111,6 +111,19 @@ config KERNEL_EVENT_LOGGER_BUFFER_SIZE help Buffer size in 32-bit words. +config KERNEL_INIT_PRIORITY_DEFAULT + int + prompt "Default init priority" + help + Defaut minimal init priority for each init level. + +config KERNEL_INIT_PRIORITY_DEVICE + int + prompt "Default init priority for device drivers" + help + Device driver, that depends on common components, such as + interrupt controller, but does not depend on other devices, + uses this init priority. menu "Kernel event logging points" depends on KERNEL_EVENT_LOGGER diff --git a/kernel/nanokernel/kernel_event_logger.c b/kernel/nanokernel/kernel_event_logger.c index 051ab7d94f2..05a44bfc47a 100644 --- a/kernel/nanokernel/kernel_event_logger.c +++ b/kernel/nanokernel/kernel_event_logger.c @@ -55,7 +55,8 @@ static int _sys_k_event_logger_init(struct device *arg) } DECLARE_DEVICE_INIT_CONFIG(kernel_event_logger_0, "", _sys_k_event_logger_init, NULL); -nano_early_init(kernel_event_logger_0, NULL); +SYS_DEFINE_DEVICE(kernel_event_logger_0, NULL, NANOKERNEL, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); void sys_k_event_logger_put_timed(uint16_t event_id) diff --git a/misc/debug/mem_safe_check_boundaries.c b/misc/debug/mem_safe_check_boundaries.c index 246265f77c3..64b36741fde 100644 --- a/misc/debug/mem_safe_check_boundaries.c +++ b/misc/debug/mem_safe_check_boundaries.c @@ -279,4 +279,5 @@ static int init(struct device *unused) } DECLARE_DEVICE_INIT_CONFIG(mem_safe, "", init, NULL); -pre_kernel_early_init(mem_safe, NULL); +SYS_DEFINE_DEVICE(mem_safe, NULL, PRIMARY, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); diff --git a/samples/nanokernel/test/test_ipi/src/test_ipi.c b/samples/nanokernel/test/test_ipi/src/test_ipi.c index 08faa235184..2de924fd80f 100644 --- a/samples/nanokernel/test/test_ipi/src/test_ipi.c +++ b/samples/nanokernel/test/test_ipi/src/test_ipi.c @@ -36,6 +36,8 @@ #define DEST IPI_CONSOLE_STDOUT #endif +#define INIT_PRIO_IPI_SEND 50 + /* Set up the dummy IPI driver */ struct ipi_dummy_config_info ipi_dummy0_config_info = { .sw_irq = 0 @@ -43,7 +45,8 @@ struct ipi_dummy_config_info ipi_dummy0_config_info = { struct ipi_dummy_driver_data ipi_dummy0_driver_data; DECLARE_DEVICE_INIT_CONFIG(ipi_dummy0, "ipi_dummy0", ipi_dummy_init, &ipi_dummy0_config_info); -pre_kernel_late_init(ipi_dummy0, &ipi_dummy0_driver_data); +SYS_DEFINE_DEVICE(ipi_dummy0, &ipi_dummy0_driver_data, SECONDARY, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); /* Sending side of the console IPI driver, will forward anything sent * to printf() since we selected IPI_CONSOLE_STDOUT */ @@ -53,7 +56,8 @@ struct ipi_console_sender_config_info sender_config = { }; DECLARE_DEVICE_INIT_CONFIG(ipi_console_send0, "ipi_send0", ipi_console_sender_init, &sender_config); -nano_late_init(ipi_console_send0, NULL); +SYS_DEFINE_DEVICE(ipi_console_send0, NULL, NANOKERNEL, + INIT_PRIO_IPI_SEND); /* Receiving side of the console IPI driver. These numbers are * more or less arbitrary */ @@ -77,7 +81,8 @@ struct ipi_console_receiver_config_info receiver_config = { struct ipi_console_receiver_runtime_data receiver_data; DECLARE_DEVICE_INIT_CONFIG(ipi_console_recv0, "ipi_recv0", ipi_console_receiver_init, &receiver_config); -nano_early_init(ipi_console_recv0, &receiver_data); +SYS_DEFINE_DEVICE(ipi_console_recv0, &receiver_data, NANOKERNEL, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); static const char thestr[] = "everything is awesome\n";