diff --git a/arch/arc/core/irq_manage.c b/arch/arc/core/irq_manage.c index fcc313ff734..904515cb6f2 100644 --- a/arch/arc/core/irq_manage.c +++ b/arch/arc/core/irq_manage.c @@ -159,9 +159,11 @@ int irq_connect( unsigned int irq, unsigned int prio, void (*isr)(void *arg), - void *arg + void *arg, + uint32_t flags ) { + ARG_UNUSED(flags); _irq_handler_set(irq, isr, arg); _irq_priority_set(irq, prio); return irq; diff --git a/arch/arm/core/irq_manage.c b/arch/arm/core/irq_manage.c index 6c7bf08b520..97b8f2943c9 100644 --- a/arch/arm/core/irq_manage.c +++ b/arch/arm/core/irq_manage.c @@ -139,8 +139,10 @@ void _irq_spurious(void *unused) int irq_connect(unsigned int irq, unsigned int prio, void (*isr)(void *arg), - void *arg) + void *arg, + uint32_t flags) { + ARG_UNUSED(flags); _irq_handler_set(irq, isr, arg); _irq_priority_set(irq, prio); return irq; diff --git a/arch/arm/platforms/fsl_frdm_k64f/board.h b/arch/arm/platforms/fsl_frdm_k64f/board.h index 6244f3a7bb4..0b0eeea21ef 100644 --- a/arch/arm/platforms/fsl_frdm_k64f/board.h +++ b/arch/arm/platforms/fsl_frdm_k64f/board.h @@ -165,6 +165,8 @@ #define CONFIG_UART_PORT_4_REGS PERIPH_ADDR_BASE_UART4 #define CONFIG_UART_PORT_4_IRQ IRQ_UART4_STATUS +#define UART_IRQ_FLAGS 0 + extern struct device * const uart_devs[]; /* Uart console settings */ diff --git a/arch/arm/platforms/ti_lm3s6965/board.h b/arch/arm/platforms/ti_lm3s6965/board.h index d58fafaca62..6d833aaed84 100644 --- a/arch/arm/platforms/ti_lm3s6965/board.h +++ b/arch/arm/platforms/ti_lm3s6965/board.h @@ -99,6 +99,8 @@ #define CONFIG_UART_PORT_2_REGS PERIPH_ADDR_BASE_UART2 #define CONFIG_UART_PORT_2_IRQ IRQ_UART2 +#define UART_IRQ_FLAGS 0 + extern struct device * const uart_devs[]; /* Uart console configuration */ diff --git a/arch/x86/core/intconnect.c b/arch/x86/core/intconnect.c index 97d87708c6b..679b6bbc908 100644 --- a/arch/x86/core/intconnect.c +++ b/arch/x86/core/intconnect.c @@ -157,6 +157,7 @@ extern void *_DynIntStubsBegin; * @param priority requested priority of interrupt * @param routine the C interrupt handler * @param parameter parameter passed to C routine + * @param flags IRQ flags * * This routine connects an interrupt service routine (ISR) coded in C to * the specified hardware . An interrupt vector will be allocated to @@ -178,6 +179,9 @@ extern void *_DynIntStubsBegin; * will then be invoked with the single . When the ISR returns, a * context switch may occur. * + * On some platforms parameter needs to be specified to indicate if + * the irq is triggered by low or high level or by rising or falling edge. + * * The routine searches for the first available element in the dynamic_stubs * array and uses it for the stub. * @@ -199,7 +203,8 @@ extern void *_DynIntStubsBegin; */ int irq_connect(unsigned int irq, unsigned int priority, - void (*routine)(void *parameter), void *parameter) + void (*routine)(void *parameter), void *parameter, + uint32_t flags) { int vector; int stub_idx; @@ -217,7 +222,7 @@ int irq_connect(unsigned int irq, unsigned int priority, * _interrupt_vectors_allocated[] array for a suitable vector. */ - vector = _SysIntVecAlloc(irq, priority); + vector = _SysIntVecAlloc(irq, priority, flags); #if defined(DEBUG) /* * The return value from _SysIntVecAlloc() will be -1 if an invalid diff --git a/arch/x86/platforms/galileo/board.h b/arch/x86/platforms/galileo/board.h index 615a40a3c39..9c4311ea63f 100644 --- a/arch/x86/platforms/galileo/board.h +++ b/arch/x86/platforms/galileo/board.h @@ -36,17 +36,17 @@ #include #ifdef CONFIG_SERIAL_INTERRUPT_LEVEL #ifdef CONFIG_SERIAL_INTERRUPT_LOW -#define UART_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) +#define UART_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) #else -#define UART_IOAPIC_FLAGS (IOAPIC_LEVEL) +#define UART_IRQ_FLAGS (IOAPIC_LEVEL) #endif #else /* edge triggered interrupt */ #ifdef CONFIG_SERIAL_INTERRUPT_LOW /* generate interrupt on falling edge */ -#define UART_IOAPIC_FLAGS (IOAPIC_LOW) +#define UART_IRQ_FLAGS (IOAPIC_LOW) #else /* generate interrupt on raising edge */ -#define UART_IOAPIC_FLAGS (0) +#define UART_IRQ_FLAGS (0) #endif #endif #endif @@ -94,13 +94,13 @@ extern struct device * const uart_devs[]; #ifdef CONFIG_GPIO_DW_0 #if defined(CONFIG_GPIO_DW_0_FALLING_EDGE) -#define GPIO_DW_0_IRQ_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) +#define GPIO_DW_0_IRQ_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) #elif defined(CONFIG_GPIO_DW_0_RISING_EDGE) -#define GPIO_DW_0_IRQ_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) +#define GPIO_DW_0_IRQ_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) #elif defined(CONFIG_GPIO_DW_0_LEVEL_HIGH) -#define GPIO_DW_0_IRQ_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) +#define GPIO_DW_0_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) #elif defined(CONFIG_GPIO_DW_0_LEVEL_LOW) -#define GPIO_DW_0_IRQ_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) +#define GPIO_DW_0_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) #endif #endif /* GPIO_DW_0 */ @@ -121,29 +121,57 @@ extern struct device * const uart_devs[]; #include #if defined(CONFIG_I2C_DW_IRQ_FALLING_EDGE) -#define I2C_DW_IRQ_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) +#define I2C_DW_IRQ_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) #elif defined(CONFIG_I2C_DW_IRQ_RISING_EDGE) -#define I2C_DW_IRQ_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) +#define I2C_DW_IRQ_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) #elif defined(CONFIG_I2C_DW_IRQ_LEVEL_HIGH) -#define I2C_DW_IRQ_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) +#define I2C_DW_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) #elif defined(CONFIG_I2C_DW_IRQ_LEVEL_LOW) -#define I2C_DW_IRQ_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) +#define I2C_DW_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) #endif #endif /* CONFIG_I2C_DW_0 */ #ifdef CONFIG_SPI_INTEL #if defined(CONFIG_SPI_INTEL_FALLING_EDGE) -#define SPI_INTEL_IRQ_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) +#define SPI_INTEL_IRQ_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) #elif defined(CONFIG_SPI_INTEL_RISING_EDGE) -#define SPI_INTEL_IRQ_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) +#define SPI_INTEL_IRQ_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) #elif defined(CONFIG_SPI_INTEL_LEVEL_HIGH) -#define SPI_INTEL_IRQ_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) +#define SPI_INTEL_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) #elif defined(CONFIG_SPI_INTEL_LEVEL_LOW) -#define SPI_INTEL_IRQ_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) +#define SPI_INTEL_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) #endif #endif /* CONFIG_SPI_INTEL */ +#if defined (CONFIG_SHARED_IRQ) && defined (CONFIG_IOAPIC) + +#if CONFIG_SHARED_IRQ_0 +#if defined(CONFIG_SHARED_IRQ_0_FALLING_EDGE) +#define SHARED_IRQ_0_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) +#elif defined(CONFIG_SHARED_IRQ_0_RISING_EDGE) +#define SHARED_IRQ_0_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) +#elif defined(CONFIG_SHARED_IRQ_0_LEVEL_HIGH) +#define SHARED_IRQ_0_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) +#elif defined(CONFIG_SHARED_IRQ_0_LEVEL_LOW) +#define SHARED_IRQ_0_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) +#endif +#endif /* CONFIG_SHARED_IRQ_0 */ + +#if CONFIG_SHARED_IRQ_1 +#if defined(CONFIG_SHARED_IRQ_1_FALLING_EDGE) +#define SHARED_IRQ_1_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) +#elif defined(CONFIG_SHARED_IRQ_1_RISING_EDGE) +#define SHARED_IRQ_1_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) +#elif defined(CONFIG_SHARED_IRQ_1_LEVEL_HIGH) +#define SHARED_IRQ_1_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) +#elif defined(CONFIG_SHARED_IRQ_1_LEVEL_LOW) +#define SHARED_IRQ_1_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) +#endif +#endif /* CONFIG_SHARED_IRQ_1 */ + +#endif /* CONFIG_SHARED_IRQ && CONFIG_IOAPIC */ + /* * The irq_connect() API connects to a (virtualized) IRQ and the * associated interrupt controller is programmed with the allocated vector. @@ -213,6 +241,4 @@ static inline int pci_irq2pin(int irq) return irq - NUM_STD_IRQS + 1; } -extern void _SysIntVecProgram(unsigned int vector, unsigned int); - #endif /* __INCboardh */ diff --git a/arch/x86/platforms/galileo/galileo.c b/arch/x86/platforms/galileo/galileo.c index 4f4dc022da9..51c55a817cf 100644 --- a/arch/x86/platforms/galileo/galileo.c +++ b/arch/x86/platforms/galileo/galileo.c @@ -38,118 +38,8 @@ #include #include #include -#include -#ifdef CONFIG_I2C_DW_0 -#ifdef CONFIG_I2C_DW_0_IRQ_DIRECT -static int dw_i2c0_irq_set(struct device *unused) -{ - ARG_UNUSED(unused); - _ioapic_irq_set(CONFIG_I2C_DW_0_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_I2C_DW_0_IRQ), - I2C_DW_IRQ_IOAPIC_FLAGS); - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(i2cirq_0, "", dw_i2c0_irq_set, NULL); -pre_kernel_late_init(i2cirq_0, NULL); - -#endif /* CONFIG_I2C_DW_0_IRQ_DIRECT */ -#endif /* CONFIG_I2C_DW_0 */ - -#ifdef CONFIG_GPIO_DW_0 -#ifdef CONFIG_GPIO_DW_0_IRQ_DIRECT -static int gpio_irq_set_0(struct device *unused) -{ - ARG_UNUSED(unused); - _ioapic_irq_set(CONFIG_GPIO_DW_0_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_GPIO_DW_0_IRQ), - GPIO_DW_0_IRQ_IOAPIC_FLAGS); - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(gpioirq_0, "", gpio_irq_set_0, NULL); -pre_kernel_early_init(gpioirq_0, NULL); - -#endif /* CONFIG_GPIO_DW_0_IRQ_DIRECT */ -#endif /* CONFIG_GPIO_DW_0 */ - -#ifdef CONFIG_SPI_INTEL_PORT_0 -static int spi_irq_set_0(struct device *unused) -{ - ARG_UNUSED(unused); - _ioapic_irq_set(CONFIG_SPI_INTEL_PORT_0_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_SPI_INTEL_PORT_0_IRQ), - SPI_INTEL_IRQ_IOAPIC_FLAGS); - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(spiirq_0, "", spi_irq_set_0, NULL); -pre_kernel_early_init(spiirq_0, NULL); - -#endif /* CONFIG_SPI_INTEL_PORT_0 */ - -#ifdef CONFIG_SPI_INTEL_PORT_1 -static int spi_irq_set_1(struct device *unused) -{ - ARG_UNUSED(unused); - _ioapic_irq_set(CONFIG_SPI_INTEL_PORT_1_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_SPI_INTEL_PORT_1_IRQ), - SPI_INTEL_IRQ_IOAPIC_FLAGS); - return 0; - -} - -DECLARE_DEVICE_INIT_CONFIG(spiirq_1, "", spi_irq_set_1, NULL); -pre_kernel_early_init(spiirq_1, NULL); - -#endif /* CONFIG_SPI_INTEL_PORT_1 */ - -#ifdef CONFIG_ETH_DW_0 -#ifdef CONFIG_ETH_DW_0_IRQ_DIRECT -static int eth_irq_set_0(struct device *unused) -{ - ARG_UNUSED(unused); - _ioapic_irq_set(CONFIG_ETH_DW_0_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_ETH_DW_0_IRQ), - ETH_DW_0_IRQ_IOAPIC_FLAGS); - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(ethirq_0, "", eth_irq_set_0, NULL); -pre_kernel_early_init(ethirq_0, NULL); - -#endif /* CONFIG_ETH_DW_0_IRQ_DIRECT */ -#endif /* CONFIG_ETH_DW_0 */ - -#ifdef CONFIG_SHARED_IRQ -#ifdef CONFIG_IOAPIC -#include - -#if defined(CONFIG_SHARED_IRQ_0_FALLING_EDGE) -#define SHARED_IRQ_0_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) -#elif defined(CONFIG_SHARED_IRQ_0_RISING_EDGE) -#define SHARED_IRQ_0_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) -#elif defined(CONFIG_SHARED_IRQ_0_LEVEL_HIGH) -#define SHARED_IRQ_0_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) -#elif defined(CONFIG_SHARED_IRQ_0_LEVEL_LOW) -#define SHARED_IRQ_0_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) -#endif - -#if defined(CONFIG_SHARED_IRQ_1_FALLING_EDGE) -#define SHARED_IRQ_1_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) -#elif defined(CONFIG_SHARED_IRQ_1_RISING_EDGE) -#define SHARED_IRQ_1_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) -#elif defined(CONFIG_SHARED_IRQ_1_LEVEL_HIGH) -#define SHARED_IRQ_1_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) -#elif defined(CONFIG_SHARED_IRQ_1_LEVEL_LOW) -#define SHARED_IRQ_1_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) -#endif - -#endif /* CONFIG_IOAPIC */ -#endif /* CONFIG_SHARED_IRQ */ - #ifdef CONFIG_PCI_LEGACY_BRIDGE /** * @@ -184,58 +74,6 @@ DECLARE_DEVICE_INIT_CONFIG(pci_legacy_bridge_0, "", pci_legacy_bridge_irq_config pre_kernel_late_init(pci_legacy_bridge_0, NULL); #endif /* CONFIG_PCI_LEGACY_BRIDGE */ -#ifdef CONFIG_CONSOLE_HANDLER - -static int console_irq_set(struct device *unused) -{ - ARG_UNUSED(unused); - - _ioapic_irq_set(CONFIG_UART_CONSOLE_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_UART_CONSOLE_IRQ), - UART_IOAPIC_FLAGS); - - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(consoleirq, "", console_irq_set, NULL); -pre_kernel_late_init(consoleirq, NULL); - -#endif /* CONFIG_CONSOLE_HANDLER */ - -#ifdef CONFIG_BLUETOOTH_UART - -static int bluetooth_irq_set(struct device *unused) -{ - ARG_UNUSED(unused); - - _ioapic_irq_set(CONFIG_BLUETOOTH_UART_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_BLUETOOTH_UART_IRQ), - UART_IOAPIC_FLAGS); - - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(btirq, "", bluetooth_irq_set, NULL); -pre_kernel_late_init(btirq, NULL); - -#endif /* CONFIG_BLUETOOTH_UART */ - -#ifdef CONFIG_HPET_TIMER - -static int hpet_irq_set(struct device *unused) -{ - ARG_UNUSED(unused); - _ioapic_irq_set(CONFIG_HPET_TIMER_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_HPET_TIMER_IRQ), - HPET_IOAPIC_FLAGS); - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(hpetirq, "", hpet_irq_set, NULL); -pre_kernel_early_init(hpetirq, NULL); - -#endif /* CONFIG_HPET_TIMER */ - #ifdef CONFIG_IOAPIC DECLARE_DEVICE_INIT_CONFIG(ioapic_0, "", _ioapic_init, NULL); pre_kernel_core_init(ioapic_0, NULL); @@ -254,29 +92,3 @@ DECLARE_DEVICE_INIT_CONFIG(pic_0, "", _i8259_init, NULL); pre_kernel_core_init(pic_0, NULL); #endif /* CONFIG_PIC_DISABLE */ - -#ifdef CONFIG_SHARED_IRQ - -static int shared_irq_config(struct device *unused) -{ - ARG_UNUSED(unused); - -#ifdef SHARED_IRQ_0_IOAPIC_FLAGS - _ioapic_irq_set(CONFIG_SHARED_IRQ_0_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_SHARED_IRQ_0_IRQ), - SHARED_IRQ_0_IOAPIC_FLAGS); -#endif - -#ifdef SHARED_IRQ_1_IOAPIC_FLAGS - _ioapic_irq_set(CONFIG_SHARED_IRQ_1_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_SHARED_IRQ_1_IRQ), - SHARED_IRQ_1_IOAPIC_FLAGS); -#endif - - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(sharedirqcfg, "", shared_irq_config, NULL); -pre_kernel_early_init(sharedirqcfg, NULL); - -#endif /* CONFIG_SHARED_IRQ */ diff --git a/arch/x86/platforms/ia32/board.h b/arch/x86/platforms/ia32/board.h index 65b48f47127..fa1cc1b2e2e 100644 --- a/arch/x86/platforms/ia32/board.h +++ b/arch/x86/platforms/ia32/board.h @@ -36,17 +36,17 @@ #include #ifdef CONFIG_SERIAL_INTERRUPT_LEVEL #ifdef CONFIG_SERIAL_INTERRUPT_LOW -#define UART_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) +#define UART_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) #else -#define UART_IOAPIC_FLAGS (IOAPIC_LEVEL) +#define UART_IRQ_FLAGS (IOAPIC_LEVEL) #endif #else /* edge triggered interrupt */ #ifdef CONFIG_SERIAL_INTERRUPT_LOW /* generate interrupt on falling edge */ -#define UART_IOAPIC_FLAGS (IOAPIC_LOW) +#define UART_IRQ_FLAGS (IOAPIC_LOW) #else /* generate interrupt on raising edge */ -#define UART_IOAPIC_FLAGS (0) +#define UART_IRQ_FLAGS (0) #endif #endif #endif @@ -119,10 +119,4 @@ extern struct device * const uart_devs[]; #endif /* CONFIG_NS16550 */ -#ifndef _ASMLANGUAGE - -extern void _SysIntVecProgram(unsigned int vector, unsigned int); - -#endif /* !_ASMLANGUAGE */ - #endif /* __INCboardh */ diff --git a/arch/x86/platforms/ia32/ia32.c b/arch/x86/platforms/ia32/ia32.c index a0dee312cf3..2ece4b73ae6 100644 --- a/arch/x86/platforms/ia32/ia32.c +++ b/arch/x86/platforms/ia32/ia32.c @@ -50,58 +50,6 @@ static int ia32_init(struct device *arg) return 0; } -#ifdef CONFIG_CONSOLE_HANDLER - -static int console_irq_set(struct device *unused) -{ - ARG_UNUSED(unused); - - _ioapic_irq_set(CONFIG_UART_CONSOLE_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_UART_CONSOLE_IRQ), - UART_IOAPIC_FLAGS); - - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(consoleirq, "", console_irq_set, NULL); -pre_kernel_late_init(consoleirq, NULL); - -#endif /* CONFIG_CONSOLE_HANDLER */ - -#ifdef CONFIG_BLUETOOTH_UART - -static int bluetooth_irq_set(struct device *unused) -{ - ARG_UNUSED(unused); - - _ioapic_irq_set(CONFIG_BLUETOOTH_UART_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_BLUETOOTH_UART_IRQ), - UART_IOAPIC_FLAGS); - - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(btirq, "", bluetooth_irq_set, NULL); -pre_kernel_late_init(btirq, NULL); - -#endif /* CONFIG_BLUETOOTH_UART */ - -#ifdef CONFIG_HPET_TIMER - -static int hpet_irq_set(struct device *unused) -{ - ARG_UNUSED(unused); - _ioapic_irq_set(CONFIG_HPET_TIMER_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_HPET_TIMER_IRQ), - HPET_IOAPIC_FLAGS); - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(hpetirq, "", hpet_irq_set, NULL); -pre_kernel_late_init(hpetirq, NULL); - -#endif /* CONFIG_HPET_TIMER */ - #ifdef CONFIG_IOAPIC DECLARE_DEVICE_INIT_CONFIG(ioapic_0, "", _ioapic_init, NULL); pre_kernel_core_init(ioapic_0, NULL); diff --git a/arch/x86/platforms/ia32_pci/board.h b/arch/x86/platforms/ia32_pci/board.h index 44de6d0fae9..211bcf808db 100644 --- a/arch/x86/platforms/ia32_pci/board.h +++ b/arch/x86/platforms/ia32_pci/board.h @@ -36,17 +36,17 @@ #include #ifdef CONFIG_SERIAL_INTERRUPT_LEVEL #ifdef CONFIG_SERIAL_INTERRUPT_LOW -#define UART_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) +#define UART_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) #else -#define UART_IOAPIC_FLAGS (IOAPIC_LEVEL) +#define UART_IRQ_FLAGS (IOAPIC_LEVEL) #endif #else /* edge triggered interrupt */ #ifdef CONFIG_SERIAL_INTERRUPT_LOW /* generate interrupt on falling edge */ -#define UART_IOAPIC_FLAGS (IOAPIC_LOW) +#define UART_IRQ_FLAGS (IOAPIC_LOW) #else /* generate interrupt on raising edge */ -#define UART_IOAPIC_FLAGS (0) +#define UART_IRQ_FLAGS (0) #endif #endif #endif @@ -90,13 +90,13 @@ extern struct device * const uart_devs[]; #ifdef CONFIG_GPIO_DW_0 #if defined(CONFIG_GPIO_DW_0_FALLING_EDGE) -#define GPIO_DW_0_IRQ_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) +#define GPIO_DW_0_IRQ_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) #elif defined(CONFIG_GPIO_DW_0_RISING_EDGE) -#define GPIO_DW_0_IRQ_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) +#define GPIO_DW_0_IRQ_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) #elif defined(CONFIG_GPIO_DW_0_LEVEL_HIGH) -#define GPIO_DW_0_IRQ_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) +#define GPIO_DW_0_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) #elif defined(CONFIG_GPIO_DW_0_LEVEL_LOW) -#define GPIO_DW_0_IRQ_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) +#define GPIO_DW_0_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) #endif #endif /* GPIO_DW_0 */ @@ -114,29 +114,27 @@ extern struct device * const uart_devs[]; #ifdef CONFIG_I2C_DW -#include - #if defined(CONFIG_I2C_DW_IRQ_FALLING_EDGE) -#define I2C_DW_IRQ_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) +#define I2C_DW_IRQ_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) #elif defined(CONFIG_I2C_DW_IRQ_RISING_EDGE) -#define I2C_DW_IRQ_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) +#define I2C_DW_IRQ_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) #elif defined(CONFIG_I2C_DW_IRQ_LEVEL_HIGH) -#define I2C_DW_IRQ_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) +#define I2C_DW_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) #elif defined(CONFIG_I2C_DW_IRQ_LEVEL_LOW) -#define I2C_DW_IRQ_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) +#define I2C_DW_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) #endif #endif /* CONFIG_I2C_DW_0 */ #ifdef CONFIG_SPI_INTEL #if defined(CONFIG_SPI_INTEL_FALLING_EDGE) -#define SPI_INTEL_IRQ_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) +#define SPI_INTEL_IRQ_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) #elif defined(CONFIG_SPI_INTEL_RISING_EDGE) -#define SPI_INTEL_IRQ_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) +#define SPI_INTEL_IRQ_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) #elif defined(CONFIG_SPI_INTEL_LEVEL_HIGH) -#define SPI_INTEL_IRQ_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) +#define SPI_INTEL_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) #elif defined(CONFIG_SPI_INTEL_LEVEL_LOW) -#define SPI_INTEL_IRQ_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) +#define SPI_INTEL_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) #endif #endif /* CONFIG_SPI_INTEL */ @@ -209,6 +207,4 @@ static inline int pci_irq2pin(int irq) return irq - NUM_STD_IRQS + 1; } -extern void _SysIntVecProgram(unsigned int vector, unsigned int); - #endif /* __INCboardh */ diff --git a/arch/x86/platforms/ia32_pci/ia32_pci.c b/arch/x86/platforms/ia32_pci/ia32_pci.c index dbcc41383a5..79ef7c20e46 100644 --- a/arch/x86/platforms/ia32_pci/ia32_pci.c +++ b/arch/x86/platforms/ia32_pci/ia32_pci.c @@ -41,137 +41,6 @@ #include -#ifdef CONFIG_I2C_DW_0 -#ifdef CONFIG_I2C_DW_0_IRQ_DIRECT -static int dw_i2c0_irq_set(struct device *unused) -{ - ARG_UNUSED(unused); - _ioapic_irq_set(CONFIG_I2C_DW_0_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_I2C_DW_0_IRQ), - I2C_DW_IRQ_IOAPIC_FLAGS); - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(i2cirq_0, "", dw_i2c0_irq_set, NULL); -pre_kernel_late_init(i2cirq_0, NULL); - -#endif /* CONFIG_I2C_DW_0_IRQ_DIRECT */ -#endif /* CONFIG_I2C_DW_0 */ - -#ifdef CONFIG_GPIO_DW_0 -#ifdef CONFIG_GPIO_DW_0_IRQ_DIRECT -static int gpio_irq_set_0(struct device *unused) -{ - ARG_UNUSED(unused); - _ioapic_irq_set(CONFIG_GPIO_DW_0_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_GPIO_DW_0_IRQ), - GPIO_DW_0_IRQ_IOAPIC_FLAGS); - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(gpioirq_0, "", gpio_irq_set_0, NULL); -pre_kernel_early_init(gpioirq_0, NULL); - -#endif /* CONFIG_GPIO_DW_0_IRQ_DIRECT */ -#endif /* CONFIG_GPIO_DW_0 */ - -#ifdef CONFIG_SPI_INTEL_PORT_0 -static int spi_irq_set_0(struct device *unused) -{ - ARG_UNUSED(unused); - _ioapic_irq_set(CONFIG_SPI_INTEL_PORT_0_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_SPI_INTEL_PORT_0_IRQ), - SPI_INTEL_IRQ_IOAPIC_FLAGS); - return DEV_OK; -} - -DECLARE_DEVICE_INIT_CONFIG(spiirq_0, "", spi_irq_set_0, NULL); -pre_kernel_early_init(spiirq_0, NULL); - -#endif /* CONFIG_SPI_INTEL_PORT_0 */ - -#ifdef CONFIG_SPI_INTEL_PORT_1 -static int spi_irq_set_1(struct device *unused) -{ - ARG_UNUSED(unused); - _ioapic_irq_set(CONFIG_SPI_INTEL_PORT_1_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_SPI_INTEL_PORT_1_IRQ), - SPI_INTEL_IRQ_IOAPIC_FLAGS); - return DEV_OK; - -} - -DECLARE_DEVICE_INIT_CONFIG(spiirq_1, "", spi_irq_set_1, NULL); -pre_kernel_early_init(spiirq_1, NULL); - -#endif /* CONFIG_SPI_INTEL_PORT_1 */ - -#ifdef CONFIG_ETH_DW_0 -#ifdef CONFIG_ETH_DW_0_IRQ_DIRECT -static int eth_irq_set_0(struct device *unused) -{ - ARG_UNUSED(unused); - _ioapic_irq_set(CONFIG_ETH_DW_0_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_ETH_DW_0_IRQ), - ETH_DW_0_IRQ_IOAPIC_FLAGS); - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(ethirq_0, "", eth_irq_set_0, NULL); -pre_kernel_early_init(ethirq_0, NULL); - -#endif /* CONFIG_ETH_DW_0_IRQ_DIRECT */ -#endif /* CONFIG_ETH_DW_0 */ - -#ifdef CONFIG_CONSOLE_HANDLER - -static int console_irq_set(struct device *unsued) -{ -#if defined(CONFIG_UART_CONSOLE) - _ioapic_irq_set(CONFIG_UART_CONSOLE_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_UART_CONSOLE_IRQ), - UART_IOAPIC_FLAGS); -#endif - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(consoleirq, "", console_irq_set, NULL); -pre_kernel_late_init(consoleirq, NULL); - -#endif /* CONFIG_CONSOLE_HANDLER */ - -#ifdef CONFIG_BLUETOOTH_UART -static int bluetooth_irq_set(struct device *unused) -{ - ARG_UNUSED(unused); - - _ioapic_irq_set(CONFIG_BLUETOOTH_UART_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_BLUETOOTH_UART_IRQ), - UART_IOAPIC_FLAGS); - - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(btirq, "", bluetooth_irq_set, NULL); -pre_kernel_late_init(btirq, NULL); -#endif /* CONFIG_BLUETOOTH_UART */ - -#ifdef CONFIG_HPET_TIMER - -static int hpet_irq_set(struct device *unused) -{ - ARG_UNUSED(unused); - _ioapic_irq_set(CONFIG_HPET_TIMER_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_HPET_TIMER_IRQ), - HPET_IOAPIC_FLAGS); - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(hpetirq, "", hpet_irq_set, NULL); -pre_kernel_late_init(hpetirq, NULL); - -#endif /* CONFIG_HPET_TIMER */ - #ifdef CONFIG_IOAPIC DECLARE_DEVICE_INIT_CONFIG(ioapic_0, "", _ioapic_init, NULL); pre_kernel_core_init(ioapic_0, NULL); diff --git a/drivers/bluetooth/uart.c b/drivers/bluetooth/uart.c index f761e64c719..b26bfb246d5 100644 --- a/drivers/bluetooth/uart.c +++ b/drivers/bluetooth/uart.c @@ -234,7 +234,8 @@ static int bt_uart_send(enum bt_buf_type buf_type, struct net_buf *buf) } IRQ_CONNECT_STATIC(bluetooth, CONFIG_BLUETOOTH_UART_IRQ, - CONFIG_BLUETOOTH_UART_INT_PRI, bt_uart_isr, 0); + CONFIG_BLUETOOTH_UART_INT_PRI, bt_uart_isr, 0, + UART_IRQ_FLAGS); static void bt_uart_setup(struct device *uart, struct uart_init_info *info) { diff --git a/drivers/console/uart_console.c b/drivers/console/uart_console.c index bc74e8aeffa..91c5325a7d2 100644 --- a/drivers/console/uart_console.c +++ b/drivers/console/uart_console.c @@ -175,7 +175,8 @@ void uart_console_isr(void *unused) } IRQ_CONNECT_STATIC(console, CONFIG_UART_CONSOLE_IRQ, - CONFIG_UART_CONSOLE_INT_PRI, uart_console_isr, 0); + CONFIG_UART_CONSOLE_INT_PRI, uart_console_isr, 0, + UART_IRQ_FLAGS); static void console_input_init(void) { diff --git a/drivers/gpio/gpio_dw.c b/drivers/gpio/gpio_dw.c index 5aa2550411e..0f6e7481ca9 100644 --- a/drivers/gpio/gpio_dw.c +++ b/drivers/gpio/gpio_dw.c @@ -385,7 +385,8 @@ pre_kernel_late_init(gpio_0, &gpio_0_runtime); #ifdef CONFIG_GPIO_DW_0_IRQ_DIRECT IRQ_CONNECT_STATIC(gpio_dw_0, CONFIG_GPIO_DW_0_IRQ, - CONFIG_GPIO_DW_0_PRI, gpio_dw_isr_0, 0); + CONFIG_GPIO_DW_0_PRI, gpio_dw_isr_0, 0, + GPIO_DW_0_IRQ_FLAGS); #endif void gpio_config_0_irq(struct device *port) diff --git a/drivers/i2c/i2c_dw.c b/drivers/i2c/i2c_dw.c index 1f5bda89f61..2ceb9b30b60 100644 --- a/drivers/i2c/i2c_dw.c +++ b/drivers/i2c/i2c_dw.c @@ -845,7 +845,8 @@ IRQ_CONNECT_STATIC(i2c_dw_0, CONFIG_I2C_DW_0_IRQ, CONFIG_I2C_DW_0_INT_PRIORITY, i2c_dw_isr, - 0); + 0, + I2C_DW_IRQ_FLAGS); #endif void i2c_config_0(struct device *port) diff --git a/drivers/interrupt_controller/system_apic.c b/drivers/interrupt_controller/system_apic.c index 9084eecd3e3..d61fa99629e 100644 --- a/drivers/interrupt_controller/system_apic.c +++ b/drivers/interrupt_controller/system_apic.c @@ -65,6 +65,7 @@ * * @param irq virtualized IRQ * @param priority get vector from group + * @param flags Interrupt flags * * @return the allocated interrupt vector * @@ -76,7 +77,8 @@ */ int _SysIntVecAlloc( unsigned int irq, /* virtualized IRQ */ - unsigned int priority /* get vector from group */ + unsigned int priority, /* get vector from group */ + uint32_t flags /* interrupt flags */ ) { int vector; @@ -113,7 +115,7 @@ int _SysIntVecAlloc( if (irq != NANO_SOFT_IRQ) #endif { - _SysIntVecProgram(vector, irq); + _SysIntVecProgram(vector, irq, flags); } return vector; @@ -129,7 +131,7 @@ int _SysIntVecAlloc( * Drivers call this routine instead of irq_connect() when interrupts are * configured statically. * - * The Clanton board virtualizes IRQs as follows: + * The Galileo board virtualizes IRQs as follows: * * - The first CONFIG_IOAPIC_NUM_RTES IRQs are provided by the IOAPIC so the * IOAPIC is programmed for these IRQs @@ -138,13 +140,14 @@ int _SysIntVecAlloc( * * @param vector the vector number * @param irq the virtualized IRQ + * @param flags interrupt flags * */ -void _SysIntVecProgram(unsigned int vector, unsigned int irq) +void _SysIntVecProgram(unsigned int vector, unsigned int irq, uint32_t flags) { if (irq < CONFIG_IOAPIC_NUM_RTES) { - _ioapic_int_vec_set(irq, vector); + _ioapic_irq_set(irq, vector, flags); } else { _loapic_int_vec_set(irq - CONFIG_IOAPIC_NUM_RTES, vector); } diff --git a/drivers/shared_irq/shared_irq.c b/drivers/shared_irq/shared_irq.c index 8462cc05b59..288edf83542 100644 --- a/drivers/shared_irq/shared_irq.c +++ b/drivers/shared_irq/shared_irq.c @@ -145,7 +145,8 @@ DECLARE_DEVICE_INIT_CONFIG(shared_irq_0, CONFIG_SHARED_IRQ_0_NAME, pre_kernel_early_init(shared_irq_0, &shared_irq_0_runtime); IRQ_CONNECT_STATIC(shared_irq_0, CONFIG_SHARED_IRQ_0_IRQ, - CONFIG_SHARED_IRQ_0_PRI, shared_irq_isr_0, 0); + CONFIG_SHARED_IRQ_0_PRI, shared_irq_isr_0, 0, + SHARED_IRQ_0_FLAGS); void shared_irq_config_0_irq(struct device *port) { @@ -177,7 +178,8 @@ DECLARE_DEVICE_INIT_CONFIG(shared_irq_1, CONFIG_SHARED_IRQ_1_NAME, pre_kernel_early_init(shared_irq_1, &shared_irq_1_runtime); IRQ_CONNECT_STATIC(shared_irq_1, CONFIG_SHARED_IRQ_1_IRQ, - CONFIG_SHARED_IRQ_1_PRI, shared_irq_isr_1, 0); + CONFIG_SHARED_IRQ_1_PRI, shared_irq_isr_1, 0, + SHARED_IRQ_1_FLAGS); void shared_irq_config_1_irq(struct device *port) { diff --git a/drivers/simple/uart.c b/drivers/simple/uart.c index 9c9a5b1b65a..be8eef6364a 100644 --- a/drivers/simple/uart.c +++ b/drivers/simple/uart.c @@ -70,7 +70,8 @@ int uart_simple_send(const uint8_t *data, int len) } IRQ_CONNECT_STATIC(uart_simple, CONFIG_UART_SIMPLE_IRQ, - CONFIG_UART_SIMPLE_INT_PRI, uart_simple_isr, 0); + CONFIG_UART_SIMPLE_INT_PRI, uart_simple_isr, 0, + UART_IRQ_FLAGS); static void uart_simple_setup(struct device *uart, struct uart_init_info *info) { diff --git a/drivers/spi/intel_spi.c b/drivers/spi/intel_spi.c index 5446555cf04..18cd66cb64b 100644 --- a/drivers/spi/intel_spi.c +++ b/drivers/spi/intel_spi.c @@ -459,7 +459,8 @@ nano_late_init(spi_intel_port_0, &spi_intel_data_port_0); 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, - CONFIG_SPI_INTEL_PORT_0_PRI, spi_intel_isr, 0); + CONFIG_SPI_INTEL_PORT_0_PRI, spi_intel_isr, 0, + SPI_INTEL_IRQ_FLAGS); void spi_config_0_irq(struct device *dev) { @@ -500,7 +501,8 @@ nano_late_init(spi_intel_port_1, &spi_intel_data_port_1); 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, - CONFIG_SPI_INTEL_PORT_1_PRI, spi_intel_isr, 0); + CONFIG_SPI_INTEL_PORT_1_PRI, spi_intel_isr, 0, + SPI_INTEL_IRQ_FLAGS); void spi_config_1_irq(struct device *dev) { diff --git a/drivers/timer/arcv2_timer0.c b/drivers/timer/arcv2_timer0.c index e59d3694984..978571a6130 100644 --- a/drivers/timer/arcv2_timer0.c +++ b/drivers/timer/arcv2_timer0.c @@ -150,7 +150,7 @@ int _sys_clock_driver_init(struct device *device) _arc_v2_aux_reg_write(_ARC_V2_TMR0_CONTROL, 0); _arc_v2_aux_reg_write(_ARC_V2_TMR0_COUNT, 0); /* clear the count value */ - (void)irq_connect(irq, prio, _timer_int_handler, 0); + (void)irq_connect(irq, prio, _timer_int_handler, 0, 0); /* * Set the reload value to achieve the configured tick rate, enable the diff --git a/drivers/timer/hpet.c b/drivers/timer/hpet.c index 2f8f9c9fa0b..61fc9590cf2 100644 --- a/drivers/timer/hpet.c +++ b/drivers/timer/hpet.c @@ -59,6 +59,7 @@ #include #include #include +#include #ifdef CONFIG_MICROKERNEL @@ -173,7 +174,7 @@ extern struct nano_stack _k_command_stack; #define HPET_COMP_DELAY 192 IRQ_CONNECT_STATIC(hpet, CONFIG_HPET_TIMER_IRQ, CONFIG_HPET_TIMER_IRQ_PRIORITY, - _timer_int_handler, 0); + _timer_int_handler, 0, HPET_IOAPIC_FLAGS); #ifdef CONFIG_INT_LATENCY_BENCHMARK static uint32_t main_count_first_irq_value; diff --git a/drivers/timer/loapic_timer.c b/drivers/timer/loapic_timer.c index a8a6e13a3a7..fc486e7f1a4 100644 --- a/drivers/timer/loapic_timer.c +++ b/drivers/timer/loapic_timer.c @@ -130,7 +130,7 @@ extern int32_t _sys_idle_elapsed_ticks; IRQ_CONNECT_STATIC(loapic, CONFIG_LOAPIC_TIMER_IRQ, CONFIG_LOAPIC_TIMER_IRQ_PRIORITY, - _timer_int_handler, 0); + _timer_int_handler, 0, 0); /* computed counter 0 initial count value */ static uint32_t __noinit cycles_per_tick; diff --git a/include/arch/arc/arch.h b/include/arch/arc/arch.h index f4a64fcc04e..4f07d4714b8 100644 --- a/include/arch/arc/arch.h +++ b/include/arch/arc/arch.h @@ -69,11 +69,12 @@ extern "C" { * @param priority IRQ Priority * @param isr Interrupt Service Routine * @param parameter ISR parameter + * @param flags IRQ flags * * @return N/A * */ -#define IRQ_CONNECT_STATIC(device, irq, priority, isr, parameter) +#define IRQ_CONNECT_STATIC(device, irq, priority, isr, parameter, flags) /** * @@ -90,6 +91,6 @@ extern "C" { * */ #define IRQ_CONFIG(isr, irq, priority) \ - irq_connect(irq, priority, isr, NULL); + irq_connect(irq, priority, isr, NULL, 0); #endif /* _ARC_ARCH__H_ */ diff --git a/include/arch/arc/v2/irq.h b/include/arch/arc/v2/irq.h index aa26893dd65..bf4cd2226b7 100644 --- a/include/arch/arc/v2/irq.h +++ b/include/arch/arc/v2/irq.h @@ -36,7 +36,8 @@ GTEXT(irq_disable) extern int irq_connect(unsigned int irq, unsigned int prio, void (*isr)(void *arg), - void *arg); + void *arg, + uint32_t flags); extern void irq_enable(unsigned int irq); extern void irq_disable(unsigned int irq); diff --git a/include/arch/arm/cortex_m/irq.h b/include/arch/arm/cortex_m/irq.h index aaed421cd63..c48c4c8d9b7 100644 --- a/include/arch/arm/cortex_m/irq.h +++ b/include/arch/arm/cortex_m/irq.h @@ -36,7 +36,8 @@ GTEXT(irq_disable) extern int irq_connect(unsigned int irq, unsigned int prio, void (*isr)(void *arg), - void *arg); + void *arg, + uint32_t flags); extern void irq_enable(unsigned int irq); extern void irq_disable(unsigned int irq); @@ -62,7 +63,7 @@ extern void _IntExit(void); * @return N/A * */ -#define IRQ_CONNECT_STATIC(device, irq, priority, isr, parameter) \ +#define IRQ_CONNECT_STATIC(device, irq, priority, isr, parameter, flags) \ const unsigned int _##device##_int_priority = (priority); \ struct _IsrTableEntry CONCAT(_isr_irq, irq) \ __attribute__ ((section(TOSTR(CONCAT(.gnu.linkonce.isr_irq, irq))))) = \ diff --git a/include/arch/x86/arch.h b/include/arch/x86/arch.h index db9ee968150..9e0f058599e 100644 --- a/include/arch/x86/arch.h +++ b/include/arch/x86/arch.h @@ -161,8 +161,9 @@ typedef struct s_isrList { * @return N/A * */ -#define IRQ_CONNECT_STATIC(device, irq, priority, isr, parameter) \ +#define IRQ_CONNECT_STATIC(device, irq, priority, isr, parameter, flags) \ extern void *_##device##_##isr##_stub; \ + const const uint32_t _##device##_irq_flags = (flags); \ NANO_CPU_INT_REGISTER(_##device##_##isr##_stub, (irq), (priority), -1, 0) @@ -188,9 +189,10 @@ extern unsigned char _irq_to_interrupt_vector[]; * @return N/A * */ -#define IRQ_CONFIG(device, irq, priority) \ - do { \ - _SysIntVecProgram(_IRQ_TO_INTERRUPT_VECTOR(irq), irq); \ +#define IRQ_CONFIG(device, irq, priority) \ + do { \ + _SysIntVecProgram(_IRQ_TO_INTERRUPT_VECTOR((irq)), (irq), \ + _##device##_irq_flags); \ } while (0) @@ -363,7 +365,8 @@ typedef void (*NANO_EOI_GET_FUNC) (void *); extern int irq_connect(unsigned int irq, unsigned int priority, void (*routine)(void *parameter), - void *parameter); + void *parameter, + uint32_t flags); /** * @brief Enable a specific IRQ @@ -413,7 +416,21 @@ extern const NANO_ESF _default_esf; * vector, and returns the vector number */ extern int _SysIntVecAlloc(unsigned int irq, - unsigned int priority); + unsigned int priority, + uint32_t flags); + +/** + * + * @brief Program interrupt controller + * + * This routine programs the interrupt controller with the given vector + * based on the given IRQ parameter. + * + * Drivers call this routine instead of irq_connect() when interrupts are + * configured statically. + * + */ +extern void _SysIntVecProgram(unsigned int vector, unsigned int irq, uint32_t flags); /* functions provided by the kernel for usage by _SysIntVecAlloc() */ diff --git a/include/microkernel/task_irq.h b/include/microkernel/task_irq.h index 480cd27d76d..9da6bdfeea4 100644 --- a/include/microkernel/task_irq.h +++ b/include/microkernel/task_irq.h @@ -44,10 +44,12 @@ * @param irq_obj IRQ object identifier * @param irq Request IRQ * @param priority Requested interrupt priority + * @param flags IRQ flags * * @return assigned interrupt vector if successful, INVALID_VECTOR if not */ -extern uint32_t task_irq_alloc(kirq_t irq_obj, uint32_t irq, uint32_t priority); +extern uint32_t task_irq_alloc(kirq_t irq_obj, uint32_t irq, uint32_t priority, + uint32_t flags); /** * @cond internal */ diff --git a/kernel/microkernel/k_irq.c b/kernel/microkernel/k_irq.c index 7434d630904..899c9bcef02 100644 --- a/kernel/microkernel/k_irq.c +++ b/kernel/microkernel/k_irq.c @@ -206,7 +206,8 @@ static int _k_task_irq_alloc(void *arg) } -uint32_t task_irq_alloc(kirq_t irq_obj, uint32_t irq, uint32_t priority) +uint32_t task_irq_alloc(kirq_t irq_obj, uint32_t irq, uint32_t priority, + uint32_t flags) { struct irq_obj_reg_arg arg; /* IRQ object registration request arguments */ struct task_irq_info *irq_obj_ptr; /* ptr to task IRQ object */ @@ -228,7 +229,8 @@ uint32_t task_irq_alloc(kirq_t irq_obj, uint32_t irq, uint32_t priority) * definition to abstract the different irq_connect signatures */ irq_obj_ptr->vector = irq_connect( - irq, priority, task_irq_int_handler, (void *)irq_obj_ptr); + irq, priority, task_irq_int_handler, (void *)irq_obj_ptr, + flags); irq_enable(irq); return irq_obj_ptr->vector; diff --git a/samples/include/irq_test_common.h b/samples/include/irq_test_common.h index 553b4399e8b..75dd61327e3 100644 --- a/samples/include/irq_test_common.h +++ b/samples/include/irq_test_common.h @@ -103,7 +103,7 @@ static int initIRQ(struct isrInitInfo *i) if (i->isr[0]) { vector = irq_connect(NANO_SOFT_IRQ, IRQ_PRIORITY, i->isr[0], - i->arg[0]); + i->arg[0], 0); if (-1 == vector) { return -1; } @@ -113,7 +113,7 @@ static int initIRQ(struct isrInitInfo *i) #if NUM_SW_IRQS >= 2 if (i->isr[1]) { vector = irq_connect(NANO_SOFT_IRQ, IRQ_PRIORITY, i->isr[1], - i->arg[1]); + i->arg[1], 0); if (-1 == vector) { return -1; } @@ -123,11 +123,11 @@ static int initIRQ(struct isrInitInfo *i) #elif defined(CONFIG_ARM) #if defined(CONFIG_CPU_CORTEX_M) if (i->isr[0]) { - (void) irq_connect(0, IRQ_PRIORITY, i->isr[0], i->arg[0]); + (void) irq_connect(0, IRQ_PRIORITY, i->isr[0], i->arg[0], 0); irq_enable(0); } if (i->isr[1]) { - (void) irq_connect(1, IRQ_PRIORITY, i->isr[1], i->arg[1]); + (void) irq_connect(1, IRQ_PRIORITY, i->isr[1], i->arg[1], 0); irq_enable(1); } #endif /* CONFIG_CPU_CORTEX_M */ diff --git a/samples/microkernel/apps/nfc_hello/src/main.c b/samples/microkernel/apps/nfc_hello/src/main.c index 74e888354f7..e3f9bdc908c 100644 --- a/samples/microkernel/apps/nfc_hello/src/main.c +++ b/samples/microkernel/apps/nfc_hello/src/main.c @@ -69,7 +69,7 @@ static void uart1_init(void) uart_init(UART1, &uart1); - irq_connect(UART1_IRQ, uart1.irq_pri, uart1_isr, 0); + irq_connect(UART1_IRQ, uart1.irq_pri, uart1_isr, 0, UART_IRQ_FLAGS); irq_enable(UART1_IRQ); diff --git a/samples/microkernel/benchmark/footprint/src/microkernel_footprint.c b/samples/microkernel/benchmark/footprint/src/microkernel_footprint.c index 5bd9da7721f..566687b1da9 100644 --- a/samples/microkernel/benchmark/footprint/src/microkernel_footprint.c +++ b/samples/microkernel/benchmark/footprint/src/microkernel_footprint.c @@ -158,7 +158,7 @@ void fgTaskEntry(void) { #ifdef TEST_max /* dynamically link in dummy ISR */ - irq_connect(NANO_SOFT_IRQ, IRQ_PRIORITY, dummyIsr, (void *) 0); + irq_connect(NANO_SOFT_IRQ, IRQ_PRIORITY, dummyIsr, (void *) 0, 0); #endif /* TEST_max */ /* note: referencing "func_array" ensures it isn't optimized out */ diff --git a/samples/microkernel/benchmark/latency_measure/src/utils.c b/samples/microkernel/benchmark/latency_measure/src/utils.c index eaec305c517..ffd67df61dc 100644 --- a/samples/microkernel/benchmark/latency_measure/src/utils.c +++ b/samples/microkernel/benchmark/latency_measure/src/utils.c @@ -46,7 +46,7 @@ char tmpString[TMP_STRING_SIZE]; int initSwInterrupt(ptestIsr pIsrHdlr) { vector = irq_connect(NANO_SOFT_IRQ, IRQ_PRIORITY, pIsrHdlr, - (void *) 0); + (void *) 0, 0); return vector; } diff --git a/samples/microkernel/test/test_task_irq/src/test_device.c b/samples/microkernel/test/test_task_irq/src/test_device.c index 5ee62657481..5ef007d5d82 100644 --- a/samples/microkernel/test/test_task_irq/src/test_device.c +++ b/samples/microkernel/test/test_task_irq/src/test_device.c @@ -67,14 +67,14 @@ uint32_t irq_vectors[NUM_OBJECTS] = {[0 ... (NUM_OBJECTS - 1)] = INVALID_VECTOR} int taskA(ksem_t semRdy) { - irq_vectors[DEV1_ID] = task_irq_alloc(DEV1_ID, DEV1_IRQ, 1); + irq_vectors[DEV1_ID] = task_irq_alloc(DEV1_ID, DEV1_IRQ, 1, 0); if (irq_vectors[DEV1_ID] == INVALID_VECTOR) { TC_ERROR("Not able to allocate IRQ object\n"); return TC_FAIL; } TC_PRINT("IRQ object %d using IRQ%d allocated\n", DEV1_ID, DEV1_IRQ); - irq_vectors[DEV2_ID] = task_irq_alloc(DEV2_ID, DEV2_IRQ, 2); + irq_vectors[DEV2_ID] = task_irq_alloc(DEV2_ID, DEV2_IRQ, 2, 0); if (irq_vectors[DEV2_ID] == INVALID_VECTOR) { TC_ERROR("Not able to allocate IRQ object\n"); return TC_FAIL; @@ -105,7 +105,7 @@ int taskA(ksem_t semRdy) TC_PRINT("\nAttempt to allocate an IRQ object that\n"); TC_PRINT("is already allocated by another task...\n"); - if (task_irq_alloc(DEV4_ID, DEV4_IRQ, 1) != INVALID_VECTOR) { + if (task_irq_alloc(DEV4_ID, DEV4_IRQ, 1, 0) != INVALID_VECTOR) { TC_ERROR("Error: Was able to allocate\n\n"); return TC_FAIL; } @@ -113,7 +113,7 @@ int taskA(ksem_t semRdy) TC_PRINT("\nAttempt to allocate an IRQ that\n" "is already allocated by another task...\n"); - if (task_irq_alloc(DEV5_ID, DEV4_IRQ, 1) != INVALID_VECTOR) { + if (task_irq_alloc(DEV5_ID, DEV4_IRQ, 1, 0) != INVALID_VECTOR) { TC_ERROR("Error: Was able to allocate\n\n"); return TC_FAIL; } @@ -139,14 +139,14 @@ int taskA(ksem_t semRdy) int taskB(ksem_t semRdy) { - irq_vectors[DEV3_ID] = task_irq_alloc(DEV3_ID, DEV3_IRQ, 1); + irq_vectors[DEV3_ID] = task_irq_alloc(DEV3_ID, DEV3_IRQ, 1, 0); if (irq_vectors[DEV3_ID] == INVALID_VECTOR) { TC_ERROR("Not able to allocate IRQ object\n"); return TC_FAIL; } TC_PRINT("IRQ object %d using IRQ%d allocated\n", DEV3_ID, DEV3_IRQ); - irq_vectors[DEV4_ID] = task_irq_alloc(DEV4_ID, DEV4_IRQ, 1); + irq_vectors[DEV4_ID] = task_irq_alloc(DEV4_ID, DEV4_IRQ, 1, 0); if (irq_vectors[DEV4_ID] == INVALID_VECTOR) { TC_ERROR("Not able to allocate IRQ object\n"); return TC_FAIL; diff --git a/samples/nanokernel/benchmark/footprint/src/nanokernel_footprint.c b/samples/nanokernel/benchmark/footprint/src/nanokernel_footprint.c index 9b22190fb3f..55e82d00f7e 100644 --- a/samples/nanokernel/benchmark/footprint/src/nanokernel_footprint.c +++ b/samples/nanokernel/benchmark/footprint/src/nanokernel_footprint.c @@ -160,7 +160,7 @@ void main(void) #ifdef TEST_max /* dynamically link in dummy ISR */ irq_connect(NANO_SOFT_IRQ, IRQ_PRIORITY, dummyIsr, - (void *) 0); + (void *) 0, 0); #endif /* TEST_max */ #ifndef TEST_min /* start a trivial fiber */ diff --git a/samples/nanokernel/benchmark/object_footprint/src/nanokernel_objects.c b/samples/nanokernel/benchmark/object_footprint/src/nanokernel_objects.c index 2ecd9c5ca7c..e242fcc1ea8 100644 --- a/samples/nanokernel/benchmark/object_footprint/src/nanokernel_objects.c +++ b/samples/nanokernel/benchmark/object_footprint/src/nanokernel_objects.c @@ -147,7 +147,7 @@ void main(void) #ifdef CONFIG_DYNAMIC_ISR /* dynamically link in dummy ISR */ irq_connect(NANO_SOFT_IRQ, IRQ_PRIORITY, dummyIsr, - (void *) 0); + (void *) 0, 0); #endif #ifdef CONFIG_OBJECTS_FIBER