From d9cfbd5a6102cd0be5869b9f98a5a067b7a60e14 Mon Sep 17 00:00:00 2001 From: Andrew Boie Date: Fri, 8 Jan 2016 00:46:14 -0800 Subject: interrupts: new static IRQ API The interrupt API has been redesigned: - irq_connect() for dynamic interrupts renamed to irq_connect_dynamic(). It will be used in situations where the new static irq_connect() won't work, i.e. the value of arguments can't be computed at build time - a new API for static interrupts replaces irq_connect(). it is used exactly the same way as its dynamic counterpart. The old static irq macros will be removed - Separate stub assembly files are no longer needed as the stubs are now generated inline with irq_connect() ReST documentation updated for the changed API. Some detail about the IDT in ROM added, and an oblique reference to the internal-only _irq_handler_set() API removed; we don't talk about internal APIs in the official documentation. Change-Id: I280519993da0e0fe671eb537a876f67de33d3cd4 Signed-off-by: Andrew Boie --- drivers/spi/Makefile | 2 -- drivers/spi/dw_spi.c | 45 ++++++++++++-------------------------- drivers/spi/dw_spi_priv.h | 2 +- drivers/spi/intel_spi.c | 32 ++++++++++----------------- drivers/spi/intel_spi_priv.h | 2 +- drivers/spi/spi_static_irq_stubs.S | 40 --------------------------------- 6 files changed, 27 insertions(+), 96 deletions(-) delete mode 100644 drivers/spi/spi_static_irq_stubs.S (limited to 'drivers/spi') diff --git a/drivers/spi/Makefile b/drivers/spi/Makefile index 5abbe7781..07ae38b62 100644 --- a/drivers/spi/Makefile +++ b/drivers/spi/Makefile @@ -1,4 +1,2 @@ - -obj-$(CONFIG_SPI) = spi_static_irq_stubs.o obj-$(CONFIG_SPI_INTEL) += intel_spi.o obj-$(CONFIG_SPI_DW) += dw_spi.o diff --git a/drivers/spi/dw_spi.c b/drivers/spi/dw_spi.c index 172644ec3..2a4b32127 100644 --- a/drivers/spi/dw_spi.c +++ b/drivers/spi/dw_spi.c @@ -459,8 +459,13 @@ int spi_dw_init(struct device *dev) #endif /* CONFIG_IOAPIC */ #ifdef CONFIG_SPI_DW_PORT_0 - -void spi_config_0_irq(struct device *dev); +void spi_config_0_irq(void) +{ + irq_connect(CONFIG_SPI_DW_PORT_0_IRQ, CONFIG_SPI_DW_PORT_0_PRI, + spi_dw_isr, SYS_GET_DEVICE(spi_dw_port_0), + SPI_DW_IRQ_FLAGS); + irq_enable(CONFIG_SPI_DW_PORT_0_IRQ); +} struct spi_dw_data spi_dw_data_port_0; @@ -479,24 +484,16 @@ DECLARE_DEVICE_INIT_CONFIG(spi_dw_port_0, CONFIG_SPI_DW_PORT_0_DRV_NAME, 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, - CONFIG_SPI_DW_PORT_0_PRI, spi_dw_isr, 0, - SPI_DW_IRQ_FLAGS); - -void spi_config_0_irq(struct device *dev) -{ - struct spi_dw_config *config = dev->config->config_info; - - IRQ_CONFIG(spi_dw_irq_port_0, config->irq); - irq_enable(config->irq); -} - #endif /* CONFIG_SPI_DW_PORT_0 */ #ifdef CONFIG_SPI_DW_PORT_1 -void spi_config_1_irq(struct device *dev); +void spi_config_1_irq(void) +{ + irq_connect(CONFIG_SPI_DW_PORT_1_IRQ, CONFIG_SPI_DW_PORT_1_PRI, + spi_dw_isr, SYS_GET_DEVICE(spi_dw_port_1), + SPI_DW_IRQ_FLAGS); + irq_enable(CONFIG_SPI_DW_PORT_1_IRQ); +} struct spi_dw_data spi_dw_data_port_1; @@ -515,18 +512,4 @@ DECLARE_DEVICE_INIT_CONFIG(spi_dw_port_1, CONFIG_SPI_DW_PORT_1_DRV_NAME, 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, - CONFIG_SPI_DW_PORT_1_PRI, spi_dw_isr, 0, - SPI_DW_IRQ_FLAGS); - -void spi_config_1_irq(struct device *dev) -{ - struct spi_dw_config *config = dev->config->config_info; - - IRQ_CONFIG(spi_dw_irq_port_1, config->irq); - irq_enable(config->irq); -} - #endif /* CONFIG_SPI_DW_PORT_1 */ diff --git a/drivers/spi/dw_spi_priv.h b/drivers/spi/dw_spi_priv.h index a81bcb60b..83c5a29a2 100644 --- a/drivers/spi/dw_spi_priv.h +++ b/drivers/spi/dw_spi_priv.h @@ -21,7 +21,7 @@ #include -typedef void (*spi_dw_config_t)(struct device *dev); +typedef void (*spi_dw_config_t)(void); /* Private structures */ struct spi_dw_config { diff --git a/drivers/spi/intel_spi.c b/drivers/spi/intel_spi.c index 765c6dd7f..12eacc80c 100644 --- a/drivers/spi/intel_spi.c +++ b/drivers/spi/intel_spi.c @@ -420,7 +420,7 @@ int spi_intel_init(struct device *dev) return DEV_NOT_CONFIG; } - info->config_func(dev); + info->config_func(); _spi_config_cs(dev); @@ -448,7 +448,7 @@ int spi_intel_init(struct device *dev) /* system bindings */ #ifdef CONFIG_SPI_INTEL_PORT_0 -void spi_config_0_irq(struct device *dev); +void spi_config_0_irq(void); struct spi_intel_data spi_intel_data_port_0; @@ -476,23 +476,18 @@ DECLARE_DEVICE_INIT_CONFIG(spi_intel_port_0, CONFIG_SPI_INTEL_PORT_0_DRV_NAME, /* 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, - CONFIG_SPI_INTEL_PORT_0_PRI, spi_intel_isr, 0, - SPI_INTEL_IRQ_FLAGS); - -void spi_config_0_irq(struct device *dev) +void spi_config_0_irq(void) { - struct spi_intel_config *config = dev->config->config_info; - - IRQ_CONFIG(spi_intel_irq_port_0, config->irq); + irq_connect(CONFIG_SPI_INTEL_PORT_0_IRQ, CONFIG_SPI_INTEL_PORT_0_PRI, + spi_intel_isr, SYS_GET_DEVICE(spi_intel_port_0), + SPI_INTEL_IRQ_FLAGS); } #endif /* CONFIG_SPI_INTEL_PORT_0 */ #ifdef CONFIG_SPI_INTEL_PORT_1 -void spi_config_1_irq(struct device *dev); +void spi_config_1_irq(void); struct spi_intel_data spi_intel_data_port_1; @@ -520,17 +515,12 @@ DECLARE_DEVICE_INIT_CONFIG(spi_intel_port_1, CONFIG_SPI_INTEL_PORT_1_DRV_NAME, /* 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, - CONFIG_SPI_INTEL_PORT_1_PRI, spi_intel_isr, 0, - SPI_INTEL_IRQ_FLAGS); - -void spi_config_1_irq(struct device *dev) +void spi_config_1_irq(void); { - struct spi_intel_config *config = dev->config->config_info; - - IRQ_CONFIG(spi_intel_irq_port_1, config->irq); + irq_connect(CONFIG_SPI_INTEL_PORT_1_IRQ, CONFIG_SPI_INTEL_PORT_1_PRI, + spi_intel_isr, SYS_GET_DEVICE(spi_intel_port_1), + SPI_INTEL_IRQ_FLAGS); } #endif /* CONFIG_SPI_INTEL_PORT_1 */ diff --git a/drivers/spi/intel_spi_priv.h b/drivers/spi/intel_spi_priv.h index 9b9fcf547..a0e1b8bb7 100644 --- a/drivers/spi/intel_spi_priv.h +++ b/drivers/spi/intel_spi_priv.h @@ -24,7 +24,7 @@ #include #endif /* CONFIG_PCI */ -typedef void (*spi_intel_config_t)(struct device *dev); +typedef void (*spi_intel_config_t)(void); struct spi_intel_config { uint32_t regs; diff --git a/drivers/spi/spi_static_irq_stubs.S b/drivers/spi/spi_static_irq_stubs.S deleted file mode 100644 index 33f6c7afb..000000000 --- a/drivers/spi/spi_static_irq_stubs.S +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2012-2015, Wind River Systems, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#define _ASMLANGUAGE - -#ifdef CONFIG_X86 -#include -#include -#endif - -#if defined(CONFIG_SPI_INTEL_PORT_0) - ioapic_mkstub spi_intel_irq_port_0 spi_intel_isr spi_intel_isr_port_0 -#endif /* CONFIG_SPI_INTEL_PORT_0 */ -#if defined(CONFIG_SPI_INTEL_PORT_1) - ioapic_mkstub spi_intel_irq_port_1 spi_intel_isr spi_intel_isr_port_1 -#endif /* CONFIG_SPI_INTEL_PORT_1 */ - -#if defined(CONFIG_SPI_DW_PORT_0) -#ifdef CONFIG_IOAPIC - ioapic_mkstub spi_dw_irq_port_0 spi_dw_isr spi_dw_isr_port_0 -#endif -#endif -#if defined(CONFIG_SPI_DW_PORT_1) -#ifdef CONFIG_IOAPIC - ioapic_mkstub spi_dw_irq_port_1 spi_dw_isr spi_dw_isr_port_1 -#endif -#endif - -- cgit v1.2.3