ARM: S3C24XX: rework irq handling for a later dt usage
Subsystems (3)
v3 cover ARM: S3C24XX: rework irq handling for a later dt usage
Third version of redoing the s3c24xx irqs in a generic way by using a declarative approach.
Main change is the different approach to the init. Moved the s3c24xx_init_intc function from the dt patchset here, so that both init types (dt and non-dt) can use a similar init scheme.
As in the second version, the 1st patch might be hard to read due to the rewrite character, but I didn't see a way to do these changes in individual steps. So it might be helpful to look at the result after applying this patch.
Runtime-tested on a s3c2416 based board and compile tested for the others.
As also written before, inclusion of the other S3C24XX SoCs to follow once the general approach is acceptable.
Applies to the most current for-next (from two hours ago) from linux-samsung
Heiko Stuebner (9):
ARM: S3C24XX: transform irq handling into a declarative form
ARM: S3C24XX: Move irq syscore-ops to irq-pm
ARM: S3C24XX: Modify s3c_irq_wake to use the hwirq property
ARM: S3C24XX: move s3c2416 irq init to common irq code
ARM: S3C24XX: modify s3c2416 irq init to initialize all irqs
ARM: S3C24XX: transform s3c2416 irqs into new structure
ARM: S3C24XX: move s3c2443 irq code to irq.c
ARM: S3C24XX: modify s3c2443 irq init to initialize all irqs
ARM: S3C24XX: transform s3c2443 subirqs into new structure
arch/arm/mach-s3c24xx/Makefile | 4 +- arch/arm/mach-s3c24xx/common.h | 2 + arch/arm/mach-s3c24xx/irq-pm.c | 41 +- arch/arm/mach-s3c24xx/irq-s3c2416.c | 348 -------- arch/arm/mach-s3c24xx/irq-s3c2443.c | 281 ------- arch/arm/mach-s3c24xx/mach-smdk2416.c | 2 +- arch/arm/mach-s3c24xx/mach-smdk2443.c | 2 +- arch/arm/mach-s3c24xx/s3c2410.c | 4 +- arch/arm/mach-s3c24xx/s3c2412.c | 4 +- arch/arm/mach-s3c24xx/s3c2416.c | 4 +- arch/arm/mach-s3c24xx/s3c2440.c | 4 +- arch/arm/mach-s3c24xx/s3c2442.c | 4 +- arch/arm/plat-s3c24xx/Kconfig | 1 + arch/arm/plat-s3c24xx/irq.c | 1110 +++++++++++++++----------- arch/arm/plat-samsung/include/plat/pm.h | 6 - arch/arm/plat-samsung/include/plat/s3c2416.h | 1 + arch/arm/plat-samsung/include/plat/s3c2443.h | 2 + 17 files changed, 688 insertions(+), 1132 deletions(-) delete mode 100644 arch/arm/mach-s3c24xx/irq-s3c2416.c delete mode 100644 arch/arm/mach-s3c24xx/irq-s3c2443.c
Signature · 1 line
1.7.2.3
PATCH v3 1/9 ARM: S3C24XX: transform irq handling into a declarative form
The irqs available on the machine and even the bit settings in the irq registers differ a lot through all the s3c24xx subarchitectures. This results in each subarch having its own irq init which adds its specific irqs to the base ones created in plat-s3c24xx/irq.c.
This of course makes a future move to devicetree hard to implement.
Therefore this patch transforms the base irq handling to a declarative style, where the irq types as well as its parent/child relationship gets read from a predefined datastructure, which later on can hopefully be easily represented in devicetree too.
It should also be easy to include the subarch specific irqs here in later patches, reducing code size and duplication.
It should not affect anything outside of the file, as the original irq numbers and their handling are preserved (hopefully) correctly.
---
changes since v2:
- redo the initialization, move parts of the upcoming dt init here to enable both init variants to share the code
changes since v1:
- more generalized irq types, resulting in only types for none, eint, edge and level being needed
- use chained_irq_enter/exit to simplify subirq handling
arch/arm/plat-s3c24xx/Kconfig | 1 + arch/arm/plat-s3c24xx/irq.c | 930 ++++++++++++++++++++--------------------- 2 files changed, 445 insertions(+), 486 deletions(-)
arch/arm/plat-s3c24xx/Kconfig +1 -0
@@ -9,6 +9,7 @@ config PLAT_S3C24XX select ARCH_REQUIRE_GPIOLIB select NO_IOPORT select S3C_DEV_NAND + select IRQ_DOMAIN help Base platform code for any Samsung S3C24XX device
arch/arm/plat-s3c24xx/irq.c +444 -486
1,061 lines not on this page · raw message
Signature · 1 line
1.7.2.3
PATCH v3 2/9 ARM: S3C24XX: Move irq syscore-ops to irq-pm
In reply to Heiko StübnerWith this the definition of s3c24xx_irq_syscore_ops can also move to common.h from plat/pm.h and the definitions of s3c24xx_irq_suspend and s3c24xx_irq_resume are also not necessary anymore in plat/pm.h
--- arch/arm/mach-s3c24xx/common.h | 2 ++ arch/arm/mach-s3c24xx/irq-pm.c | 10 ++++++++-- arch/arm/mach-s3c24xx/s3c2410.c | 4 +++- arch/arm/mach-s3c24xx/s3c2412.c | 4 +++- arch/arm/mach-s3c24xx/s3c2416.c | 4 +++- arch/arm/mach-s3c24xx/s3c2440.c | 4 +++- arch/arm/mach-s3c24xx/s3c2442.c | 4 +++- arch/arm/plat-s3c24xx/irq.c | 6 ------ arch/arm/plat-samsung/include/plat/pm.h | 6 ------ 9 files changed, 25 insertions(+), 19 deletions(-)
arch/arm/mach-s3c24xx/common.h +2 -0
@@ -15,4 +15,6 @@void s3c2410_restart (char mode,const char *cmd);void s3c244x_restart (char mode,const char *cmd); +extern struct syscore_ops s3c24xx_irq_syscore_ops; +#endif /* __ARCH_ARM_MACH_S3C24XX_COMMON_H */
arch/arm/mach-s3c24xx/irq-pm.c +8 -2
@@ -15,6 +15,7 @@#include <linux/module.h> #include <linux/interrupt.h> #include <linux/irq.h> +#include <linux/syscore_ops.h> #include <plat/cpu.h> #include <plat/pm.h>
@@ -64,7 +65,7 @@ static unsigned long save_extint[3];static unsigned long save_eintflt[4 ];static unsigned long save_eintmask; -int s3c24xx_irq_suspend (void ) +static int s3c24xx_irq_suspend (void ) {unsigned int i;
@@ -80,7 +81,7 @@ int s3c24xx_irq_suspend(void)return 0 ; } -void s3c24xx_irq_resume (void ) +static void s3c24xx_irq_resume (void ) {unsigned int i;
@@ -93,3 +94,8 @@ void s3c24xx_irq_resume(void)s3c_pm_do_restore (irq_save,ARRAY_SIZE (irq_save));__raw_writel (save_eintmask,S3C24XX_EINTMASK ); } + +struct syscore_ops s3c24xx_irq_syscore_ops = { + .suspend = s3c24xx_irq_suspend, + .resume = s3c24xx_irq_resume, +};
arch/arm/mach-s3c24xx/s3c2410.c +3 -1
@@ -49,6 +49,8 @@#include <plat/gpio-cfg.h> #include <plat/gpio-cfg-helpers.h> +#include "common.h" +/* Initial IO mappings */ static struct map_desc s3c2410_iodesc[]__initdata = {
@@ -182,8 +184,8 @@ int __init s3c2410_init(void)#ifdef CONFIG_PM register_syscore_ops (&s3c2410_pm_syscore_ops); -#endif register_syscore_ops (&s3c24xx_irq_syscore_ops); +#endif return device_register (&s3c2410_dev); }
arch/arm/mach-s3c24xx/s3c2412.c +3 -1
@@ -52,6 +52,8 @@#define S3C2412_SWRST (S3C24XX_VA_CLKPWR + 0x30)#define S3C2412_SWRST_RESET (0x533C2412) +#include "common.h" +#ifndef CONFIG_CPU_S3C2412_ONLY void __iomem *s3c24xx_va_gpio2 =S3C24XX_VA_GPIO ;
@@ -245,8 +247,8 @@ int __init s3c2412_init(void)#ifdef CONFIG_PM register_syscore_ops (&s3c2412_pm_syscore_ops); -#endif register_syscore_ops (&s3c24xx_irq_syscore_ops); +#endif return device_register (&s3c2412_dev); }
arch/arm/mach-s3c24xx/s3c2416.c +3 -1
@@ -63,6 +63,8 @@#include <plat/rtc-core.h> #include <plat/spi-core.h> +#include "common.h" +static struct map_desc s3c2416_iodesc[]__initdata = {IODESC_ENT (WATCHDOG ),IODESC_ENT (CLKPWR ),
@@ -105,9 +107,9 @@ int __init s3c2416_init(void)#ifdef CONFIG_PM register_syscore_ops (&s3c2416_pm_syscore_ops); -#endif register_syscore_ops (&s3c24xx_irq_syscore_ops);register_syscore_ops (&s3c2416_irq_syscore_ops); +#endif return device_register (&s3c2416_dev); }
arch/arm/mach-s3c24xx/s3c2440.c +3 -1
@@ -40,6 +40,8 @@#include <plat/gpio-cfg.h> #include <plat/gpio-cfg-helpers.h> +#include "common.h" +static struct device s3c2440_dev = { .bus = &s3c2440_subsys, };
@@ -57,9 +59,9 @@ int __init s3c2440_init(void)#ifdef CONFIG_PM register_syscore_ops (&s3c2410_pm_syscore_ops); +register_syscore_ops (&s3c24xx_irq_syscore_ops);#endif register_syscore_ops (&s3c244x_pm_syscore_ops); -register_syscore_ops (&s3c24xx_irq_syscore_ops);/* register our system device for everything else */
arch/arm/mach-s3c24xx/s3c2442.c +3 -1
@@ -51,6 +51,8 @@#include <plat/gpio-cfg.h> #include <plat/gpio-cfg-helpers.h> +#include "common.h" +/* S3C2442 extended clock support */ static unsigned long s3c2442_camif_upll_round(struct clk *clk,
@@ -172,9 +174,9 @@ int __init s3c2442_init(void)#ifdef CONFIG_PM register_syscore_ops (&s3c2410_pm_syscore_ops); +register_syscore_ops (&s3c24xx_irq_syscore_ops);#endif register_syscore_ops (&s3c244x_pm_syscore_ops); -register_syscore_ops (&s3c24xx_irq_syscore_ops);return device_register (&s3c2442_dev); }
arch/arm/plat-s3c24xx/irq.c +0 -6
@@ -24,7 +24,6 @@#include <linux/interrupt.h> #include <linux/ioport.h> #include <linux/device.h> -#include <linux/syscore_ops.h> #include <linux/irqdomain.h> #include <asm/mach/irq.h>
@@ -627,8 +626,3 @@ void __init s3c24xx_init_irq(void)s3c24xx_init_intc (NULL , &init_subint[0 ], main_intc,0x4a000018 );s3c24xx_init_intc (NULL , &init_eint[0 ], main_intc,0x560000a4 ); } - -struct syscore_ops s3c24xx_irq_syscore_ops = { - .suspend = s3c24xx_irq_suspend, - .resume = s3c24xx_irq_resume, -};
arch/arm/plat-samsung/include/plat/pm.h +0 -6
@@ -109,17 +109,11 @@ extern void s3c_pm_do_restore_core(struct sleep_save *ptr, int count);#ifdef CONFIG_PM extern int s3c_irq_wake (struct irq_data *data,unsigned int state);extern int s3c_irqext_wake (struct irq_data *data,unsigned int state); -extern int s3c24xx_irq_suspend (void ); -extern void s3c24xx_irq_resume (void );#else #define s3c_irq_wake NULL#define s3c_irqext_wake NULL -#define s3c24xx_irq_suspend NULL -#define s3c24xx_irq_resume NULL#endif -extern struct syscore_ops s3c24xx_irq_syscore_ops; -/* PM debug functions */ #ifdef CONFIG_SAMSUNG_PM_DEBUG
Signature · 1 line
1.7.2.3
PATCH v3 3/9 ARM: S3C24XX: Modify s3c_irq_wake to use the hwirq property
In reply to Heiko StübnerThis gets rid of the use of static irq mappings there.
--- arch/arm/mach-s3c24xx/irq-pm.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-)
arch/arm/mach-s3c24xx/irq-pm.c +4 -4
@@ -30,18 +30,18 @@* set bit to 1 in allow bitfield to enable the wakeup settings on it */ -unsigned long s3c_irqwake_intallow =1L << (IRQ_RTC -IRQ_EINT0 ) |0xfL ; +unsigned long s3c_irqwake_intallow =1L <<30 |0xfL ;unsigned long s3c_irqwake_eintallow =0x0000fff0L ;int s3c_irq_wake (struct irq_data *data,unsigned int state) { -unsigned long irqbit =1 << (data->irq -IRQ_EINT0 ); +unsigned long irqbit =1 << data->hwirq;if (!(s3c_irqwake_intallow & irqbit))return -ENOENT ; -printk (KERN_INFO "wake %s for irq %d\n" , - state ?"enabled" :"disabled" , data->irq); +pr_info ("wake %s for hwirq %lu\n" , + state ?"enabled" :"disabled" , data->hwirq);if (!state) s3c_irqwake_intmask |= irqbit;
Signature · 1 line
1.7.2.3
PATCH v3 4/9 ARM: S3C24XX: move s3c2416 irq init to common irq code
In reply to Heiko StübnerThis is needed to further clean up the irq init. The only change made during the move is the renaming of the conflicting irq_save to s3c2416_irq_save
--- arch/arm/mach-s3c24xx/Makefile | 2 +- arch/arm/mach-s3c24xx/irq-pm.c | 23 +++ arch/arm/mach-s3c24xx/irq-s3c2416.c | 348 ----------------------------------- arch/arm/plat-s3c24xx/irq.c | 286 ++++++++++++++++++++++++++++ 4 files changed, 310 insertions(+), 349 deletions(-) delete mode 100644 arch/arm/mach-s3c24xx/irq-s3c2416.c
arch/arm/mach-s3c24xx/Makefile +1 -1
@@ -25,7 +25,7 @@ obj-$(CONFIG_S3C2412_DMA) += dma-s3c2412.o obj-$(CONFIG_S3C2412_PM) += pm-s3c2412.o obj-$(CONFIG_S3C2412_PM_SLEEP) += sleep-s3c2412.o -obj-$(CONFIG_CPU_S3C2416) += s3c2416.o irq-s3c2416.o clock-s3c2416.o +obj-$(CONFIG_CPU_S3C2416) += s3c2416.o clock-s3c2416.o obj-$(CONFIG_S3C2416_PM) += pm-s3c2416.o obj-$(CONFIG_CPU_S3C2440) += s3c2440.o irq-s3c2440.o clock-s3c2440.o
arch/arm/mach-s3c24xx/irq-pm.c +23 -0
@@ -99,3 +99,26 @@ struct syscore_ops s3c24xx_irq_syscore_ops = { .suspend = s3c24xx_irq_suspend, .resume = s3c24xx_irq_resume, }; + +#ifdef CONFIG_CPU_S3C2416 +static struct sleep_save s3c2416_irq_save[] = { +SAVE_ITEM (S3C2416_INTMSK2 ), +}; + +static int s3c2416_irq_suspend (void ) +{ +s3c_pm_do_save (s3c2416_irq_save,ARRAY_SIZE (s3c2416_irq_save)); + +return 0 ; +} + +static void s3c2416_irq_resume (void ) +{ +s3c_pm_do_restore (s3c2416_irq_save,ARRAY_SIZE (s3c2416_irq_save)); +} + +struct syscore_ops s3c2416_irq_syscore_ops = { + .suspend = s3c2416_irq_suspend, + .resume = s3c2416_irq_resume, +}; +#endif
arch/arm/mach-s3c24xx/irq-s3c2416.c deleted +0 -348
348 lines not on this page · raw message
arch/arm/plat-s3c24xx/irq.c +286 -0
289 lines not on this page · raw message
Signature · 1 line
1.7.2.3
PATCH v3 5/9 ARM: S3C24XX: modify s3c2416 irq init to initialize all irqs
In reply to Heiko StübnerPreviously the irq init used s3c24xx_init_irq and an additional arch_initcall to add the cpu specific irqs.
To be able to simplyfy the irq init later, create a new function s3c416_init_irq, which then calls s3c24xx_init_irq but also adds the cpu specific irqs.
--- arch/arm/mach-s3c24xx/mach-smdk2416.c | 2 +- arch/arm/plat-s3c24xx/irq.c | 22 ++++------------------ arch/arm/plat-samsung/include/plat/s3c2416.h | 1 + 3 files changed, 6 insertions(+), 19 deletions(-)
arch/arm/mach-s3c24xx/mach-smdk2416.c +1 -1
@@ -250,7 +250,7 @@ MACHINE_START(SMDK2416, "SMDK2416")/* Maintainer: Yauhen Kharuzhy <[email protected]> */ .atag_offset = 0x100, - .init_irq = s3c24xx_init_irq, + .init_irq = s3c2416_init_irq, .map_io = smdk2416_map_io, .init_machine = smdk2416_machine_init, .timer = &s3c24xx_timer,
arch/arm/plat-s3c24xx/irq.c +4 -18
@@ -874,10 +874,11 @@ static void s3c2416_irq_add_second(void) } } -static int s3c2416_irq_add (struct device *dev, -struct subsys_interface *sif) +void __init s3c2416_init_irq (void ) { -printk (KERN_INFO "S3C2416: IRQ Support\n" ); +pr_info ("S3C2416: IRQ Support\n" ); + +s3c24xx_init_irq ();s3c2416_add_sub (IRQ_LCD , s3c2416_irq_demux_lcd, &s3c2416_irq_lcd,IRQ_S3C2443_LCD2 ,IRQ_S3C2443_LCD4 );
@@ -894,21 +895,6 @@ static int s3c2416_irq_add(struct device *dev, IRQ_S3C2443_WDT, IRQ_S3C2443_AC97); s3c2416_irq_add_second(); - - return 0; } -static struct subsys_interface s3c2416_irq_interface = { - .name ="s3c2416_irq" , - .subsys = &s3c2416_subsys, - .add_dev = s3c2416_irq_add, -}; - -static int __init s3c2416_irq_init (void ) -{ -return subsys_interface_register (&s3c2416_irq_interface); -} - -arch_initcall (s3c2416_irq_init); -#endif
arch/arm/plat-samsung/include/plat/s3c2416.h +1 -0
@@ -25,6 +25,7 @@ extern int s3c2416_baseclk_add(void);extern void s3c2416_restart (char mode,const char *cmd); +extern void s3c2416_init_irq (void );extern struct syscore_ops s3c2416_irq_syscore_ops;#else
Signature · 1 line
1.7.2.3
PATCH v3 6/9 ARM: S3C24XX: transform s3c2416 irqs into new structure
In reply to Heiko StübnerShare the common irq code by simply defining a correct mapping declaration for the s3c2416.
--- arch/arm/plat-s3c24xx/irq.c | 342 +++++++++++-------------------------------- 1 files changed, 87 insertions(+), 255 deletions(-)
arch/arm/plat-s3c24xx/irq.c +87 -255
@@ -352,7 +352,8 @@ static int s3c24xx_irq_map(struct irq_domain *h, unsigned int virq, handle_edge_irq);break ;case S3C_IRQTYPE_EDGE : -if (irq_data->parent_irq) +if (irq_data->parent_irq || + intc->reg_pending ==S3C2416_SRCPND2 )irq_set_chip_and_handler (virq, &s3c_irq_level_chip, handle_edge_irq);else
@@ -628,273 +629,104 @@ void __init s3c24xx_init_irq(void) }#ifdef CONFIG_CPU_S3C2416 -#define INTMSK (start, end) ((1 << ((end) + 1 - (start))) - 1) - -static inline void s3c2416_irq_demux (unsigned int irq,unsigned int len) -{ -unsigned int subsrc, submsk; -unsigned int end; - -/* read the current pending interrupts, and the mask -* for what it is available */ - - subsrc =__raw_readl (S3C2410_SUBSRCPND ); - submsk =__raw_readl (S3C2410_INTSUBMSK ); - - subsrc &= ~submsk; - subsrc >>= (irq -S3C2410_IRQSUB (0 )); - subsrc &= (1 << len)-1 ; - - end = len + irq; - -for (; irq < end && subsrc; irq++) { -if (subsrc &1 ) -generic_handle_irq (irq); - - subsrc >>=1 ; - } -} - -/* WDT/AC97 sub interrupts */ - -static void s3c2416_irq_demux_wdtac97 (unsigned int irq,struct irq_desc *desc) -{ -s3c2416_irq_demux (IRQ_S3C2443_WDT ,4 ); -} - -#define INTMSK_WDTAC97 (1UL << (IRQ_WDT - IRQ_EINT0)) -#define SUBMSK_WDTAC97 INTMSK(IRQ_S3C2443_WDT, IRQ_S3C2443_AC97) - -static void s3c2416_irq_wdtac97_mask (struct irq_data *data) -{ -s3c_irqsub_mask (data->irq,INTMSK_WDTAC97 ,SUBMSK_WDTAC97 ); -} - -static void s3c2416_irq_wdtac97_unmask (struct irq_data *data) -{ -s3c_irqsub_unmask (data->irq,INTMSK_WDTAC97 ); -} - -static void s3c2416_irq_wdtac97_ack (struct irq_data *data) -{ -s3c_irqsub_maskack (data->irq,INTMSK_WDTAC97 ,SUBMSK_WDTAC97 ); -} - -static struct irq_chip s3c2416_irq_wdtac97 = { - .irq_mask = s3c2416_irq_wdtac97_mask, - .irq_unmask = s3c2416_irq_wdtac97_unmask, - .irq_ack = s3c2416_irq_wdtac97_ack, -}; - -/* LCD sub interrupts */ - -static void s3c2416_irq_demux_lcd (unsigned int irq,struct irq_desc *desc) -{ -s3c2416_irq_demux (IRQ_S3C2443_LCD1 ,4 ); -} - -#define INTMSK_LCD (1UL << (IRQ_LCD - IRQ_EINT0)) -#define SUBMSK_LCD INTMSK(IRQ_S3C2443_LCD1, IRQ_S3C2443_LCD4) - -static void s3c2416_irq_lcd_mask (struct irq_data *data) -{ -s3c_irqsub_mask (data->irq,INTMSK_LCD ,SUBMSK_LCD ); -} - -static void s3c2416_irq_lcd_unmask (struct irq_data *data) -{ -s3c_irqsub_unmask (data->irq,INTMSK_LCD ); -} - -static void s3c2416_irq_lcd_ack (struct irq_data *data) -{ -s3c_irqsub_maskack (data->irq,INTMSK_LCD ,SUBMSK_LCD ); -} - -static struct irq_chip s3c2416_irq_lcd = { - .irq_mask = s3c2416_irq_lcd_mask, - .irq_unmask = s3c2416_irq_lcd_unmask, - .irq_ack = s3c2416_irq_lcd_ack, -}; - -/* DMA sub interrupts */ - -static void s3c2416_irq_demux_dma (unsigned int irq,struct irq_desc *desc) -{ -s3c2416_irq_demux (IRQ_S3C2443_DMA0 ,6 ); -} - -#define INTMSK_DMA (1UL << (IRQ_S3C2443_DMA - IRQ_EINT0)) -#define SUBMSK_DMA INTMSK(IRQ_S3C2443_DMA0, IRQ_S3C2443_DMA5) - - -static void s3c2416_irq_dma_mask (struct irq_data *data) -{ -s3c_irqsub_mask (data->irq,INTMSK_DMA ,SUBMSK_DMA ); -} - -static void s3c2416_irq_dma_unmask (struct irq_data *data) -{ -s3c_irqsub_unmask (data->irq,INTMSK_DMA ); -} - -static void s3c2416_irq_dma_ack (struct irq_data *data) -{ -s3c_irqsub_maskack (data->irq,INTMSK_DMA ,SUBMSK_DMA ); -} - -static struct irq_chip s3c2416_irq_dma = { - .irq_mask = s3c2416_irq_dma_mask, - .irq_unmask = s3c2416_irq_dma_unmask, - .irq_ack = s3c2416_irq_dma_ack, +static struct s3c_irq_data init_s3c2416base[32 ] = { + { .type =S3C_IRQTYPE_EINT , },/* EINT0 */ + { .type =S3C_IRQTYPE_EINT , },/* EINT1 */ + { .type =S3C_IRQTYPE_EINT , },/* EINT2 */ + { .type =S3C_IRQTYPE_EINT , },/* EINT3 */ + { .type =S3C_IRQTYPE_LEVEL , },/* EINT4to7 */ + { .type =S3C_IRQTYPE_LEVEL , },/* EINT8to23 */ + { .type =S3C_IRQTYPE_NONE , },/* reserved */ + { .type =S3C_IRQTYPE_EDGE , },/* nBATT_FLT */ + { .type =S3C_IRQTYPE_EDGE , },/* TICK */ + { .type =S3C_IRQTYPE_LEVEL , },/* WDT/AC97 */ + { .type =S3C_IRQTYPE_EDGE , },/* TIMER0 */ + { .type =S3C_IRQTYPE_EDGE , },/* TIMER1 */ + { .type =S3C_IRQTYPE_EDGE , },/* TIMER2 */ + { .type =S3C_IRQTYPE_EDGE , },/* TIMER3 */ + { .type =S3C_IRQTYPE_EDGE , },/* TIMER4 */ + { .type =S3C_IRQTYPE_LEVEL , },/* UART2 */ + { .type =S3C_IRQTYPE_LEVEL , },/* LCD */ + { .type =S3C_IRQTYPE_LEVEL , },/* DMA */ + { .type =S3C_IRQTYPE_LEVEL , },/* UART3 */ + { .type =S3C_IRQTYPE_NONE , },/* reserved */ + { .type =S3C_IRQTYPE_EDGE , },/* SDI1 */ + { .type =S3C_IRQTYPE_EDGE , },/* SDI0 */ + { .type =S3C_IRQTYPE_EDGE , },/* SPI0 */ + { .type =S3C_IRQTYPE_LEVEL , },/* UART1 */ + { .type =S3C_IRQTYPE_EDGE , },/* NAND */ + { .type =S3C_IRQTYPE_EDGE , },/* USBD */ + { .type =S3C_IRQTYPE_EDGE , },/* USBH */ + { .type =S3C_IRQTYPE_EDGE , },/* IIC */ + { .type =S3C_IRQTYPE_LEVEL , },/* UART0 */ + { .type =S3C_IRQTYPE_NONE , }, + { .type =S3C_IRQTYPE_EDGE , },/* RTC */ + { .type =S3C_IRQTYPE_LEVEL , },/* ADCPARENT */ }; -/* UART3 sub interrupts */ - -static void s3c2416_irq_demux_uart3 (unsigned int irq,struct irq_desc *desc) -{ -s3c2416_irq_demux (IRQ_S3C2443_RX3 ,3 ); -} - -#define INTMSK_UART3 (1UL << (IRQ_S3C2443_UART3 - IRQ_EINT0)) -#define SUBMSK_UART3 (0x7 << (IRQ_S3C2443_RX3 - S3C2410_IRQSUB(0))) - -static void s3c2416_irq_uart3_mask (struct irq_data *data) -{ -s3c_irqsub_mask (data->irq,INTMSK_UART3 ,SUBMSK_UART3 ); -} - -static void s3c2416_irq_uart3_unmask (struct irq_data *data) -{ -s3c_irqsub_unmask (data->irq,INTMSK_UART3 ); -} - -static void s3c2416_irq_uart3_ack (struct irq_data *data) -{ -s3c_irqsub_maskack (data->irq,INTMSK_UART3 ,SUBMSK_UART3 ); -} - -static struct irq_chip s3c2416_irq_uart3 = { - .irq_mask = s3c2416_irq_uart3_mask, - .irq_unmask = s3c2416_irq_uart3_unmask, - .irq_ack = s3c2416_irq_uart3_ack, +static struct s3c_irq_data init_s3c2416subint[32 ] = { + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =28 },/* UART0-RX */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =28 },/* UART0-TX */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =28 },/* UART0-ERR */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =23 },/* UART1-RX */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =23 },/* UART1-TX */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =23 },/* UART1-ERR */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =15 },/* UART2-RX */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =15 },/* UART2-TX */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =15 },/* UART2-ERR */ + { .type =S3C_IRQTYPE_EDGE , .parent_irq =31 },/* TC */ + { .type =S3C_IRQTYPE_EDGE , .parent_irq =31 },/* ADC */ + { .type =S3C_IRQTYPE_NONE },/* reserved */ + { .type =S3C_IRQTYPE_NONE },/* reserved */ + { .type =S3C_IRQTYPE_NONE },/* reserved */ + { .type =S3C_IRQTYPE_NONE },/* reserved */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =16 },/* LCD2 */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =16 },/* LCD3 */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =16 },/* LCD4 */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =17 },/* DMA0 */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =17 },/* DMA1 */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =17 },/* DMA2 */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =17 },/* DMA3 */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =17 },/* DMA4 */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =17 },/* DMA5 */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =18 },/* UART3-RX */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =18 },/* UART3-TX */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =18 },/* UART3-ERR */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =9 },/* WDT */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =9 },/* AC97 */ }; -/* second interrupt register */ - -static inline void s3c2416_irq_ack_second (struct irq_data *data) -{ -unsigned long bitval =1UL << (data->irq -IRQ_S3C2416_2D ); - -__raw_writel (bitval,S3C2416_SRCPND2 ); -__raw_writel (bitval,S3C2416_INTPND2 ); -} - -static void s3c2416_irq_mask_second (struct irq_data *data) -{ -unsigned long bitval =1UL << (data->irq -IRQ_S3C2416_2D ); -unsigned long mask; - - mask =__raw_readl (S3C2416_INTMSK2 ); - mask |= bitval; -__raw_writel (mask,S3C2416_INTMSK2 ); -} - -static void s3c2416_irq_unmask_second (struct irq_data *data) -{ -unsigned long bitval =1UL << (data->irq -IRQ_S3C2416_2D ); -unsigned long mask; - - mask =__raw_readl (S3C2416_INTMSK2 ); - mask &= ~bitval; -__raw_writel (mask,S3C2416_INTMSK2 ); -} - -static struct irq_chip s3c2416_irq_second = { - .irq_ack = s3c2416_irq_ack_second, - .irq_mask = s3c2416_irq_mask_second, - .irq_unmask = s3c2416_irq_unmask_second, +static struct s3c_irq_data init_s3c2416_second[32 ] = { + { .type =S3C_IRQTYPE_EDGE },/* 2D */ + { .type =S3C_IRQTYPE_EDGE },/* IIC1 */ + { .type =S3C_IRQTYPE_NONE },/* reserved */ + { .type =S3C_IRQTYPE_NONE },/* reserved */ + { .type =S3C_IRQTYPE_EDGE },/* PCM0 */ + { .type =S3C_IRQTYPE_EDGE },/* PCM1 */ + { .type =S3C_IRQTYPE_EDGE },/* I2S0 */ + { .type =S3C_IRQTYPE_EDGE },/* I2S1 */ }; - -/* IRQ initialisation code */ - -static int s3c2416_add_sub (unsigned int base, -void (*demux)(unsigned int , -struct irq_desc *), -struct irq_chip *chip, -unsigned int start,unsigned int end) -{ -unsigned int irqno; - -irq_set_chip_and_handler (base, &s3c_irq_level_chip, handle_level_irq); -irq_set_chained_handler (base, demux); - -for (irqno = start; irqno <= end; irqno++) { -irq_set_chip_and_handler (irqno, chip, handle_level_irq); -set_irq_flags (irqno,IRQF_VALID ); - } - -return 0 ; -} - -static void s3c2416_irq_add_second (void ) -{ -unsigned long pend; -unsigned long last; -int irqno; -int i; - -/* first, clear all interrupts pending... */ - last =0 ; -for (i =0 ; i <4 ; i++) { - pend =__raw_readl (S3C2416_INTPND2 ); - -if (pend ==0 || pend == last) -break ; - -__raw_writel (pend,S3C2416_SRCPND2 ); -__raw_writel (pend,S3C2416_INTPND2 ); -printk (KERN_INFO "irq: clearing pending status %08x\n" , - (int )pend); - last = pend; - } - -for (irqno =IRQ_S3C2416_2D ; irqno <=IRQ_S3C2416_I2S1 ; irqno++) { -switch (irqno) { -case IRQ_S3C2416_RESERVED2 : -case IRQ_S3C2416_RESERVED3 : -/* no IRQ here */ -break ; -default : -irq_set_chip_and_handler (irqno, &s3c2416_irq_second, - handle_edge_irq); -set_irq_flags (irqno,IRQF_VALID ); - } - } -} -void __init s3c2416_init_irq (void ) { -pr_info ("S3C2416: IRQ Support\n" ); - -s3c24xx_init_irq (); +struct s3c_irq_intc *main_intc; -s3c2416_add_sub (IRQ_LCD , s3c2416_irq_demux_lcd, &s3c2416_irq_lcd, -IRQ_S3C2443_LCD2 ,IRQ_S3C2443_LCD4 ); +pr_info ("S3C2416: IRQ Support\n" ); -s3c2416_add_sub (IRQ_S3C2443_DMA , s3c2416_irq_demux_dma, - &s3c2416_irq_dma,IRQ_S3C2443_DMA0 ,IRQ_S3C2443_DMA5 ); +#ifdef CONFIG_FIQ +init_FIQ (FIQ_START ); +#endif -s3c2416_add_sub (IRQ_S3C2443_UART3 , s3c2416_irq_demux_uart3, - &s3c2416_irq_uart3, -IRQ_S3C2443_RX3 ,IRQ_S3C2443_ERR3 ); + main_intc =s3c24xx_init_intc (NULL , &init_s3c2416base[0 ],NULL ,0x4a000000 ); +if (IS_ERR (main_intc)) { +pr_err ("irq: could not create main interrupt controller\n" ); +return ; + } -s3c2416_add_sub (IRQ_WDT , s3c2416_irq_demux_wdtac97, - &s3c2416_irq_wdtac97, -IRQ_S3C2443_WDT ,IRQ_S3C2443_AC97 ); +s3c24xx_init_intc (NULL , &init_eint[0 ], main_intc,0x560000a4 ); +s3c24xx_init_intc (NULL , &init_s3c2416subint[0 ], main_intc,0x4a000018 ); -s3c2416_irq_add_second (); +s3c24xx_init_intc (NULL , &init_s3c2416_second[0 ],NULL ,0x4a000040 ); }#endif
Signature · 1 line
1.7.2.3
PATCH v3 7/9 ARM: S3C24XX: move s3c2443 irq code to irq.c
In reply to Heiko StübnerPrequisite for further optimizations.
--- arch/arm/mach-s3c24xx/Makefile | 2 +- arch/arm/mach-s3c24xx/irq-s3c2443.c | 281 ----------------------------------- arch/arm/plat-s3c24xx/irq.c | 243 ++++++++++++++++++++++++++++++ 3 files changed, 244 insertions(+), 282 deletions(-) delete mode 100644 arch/arm/mach-s3c24xx/irq-s3c2443.c
arch/arm/mach-s3c24xx/Makefile +1 -1
@@ -33,7 +33,7 @@ obj-$(CONFIG_CPU_S3C2442) += s3c2442.o obj-$(CONFIG_CPU_S3C244X) += s3c244x.o irq-s3c244x.o clock-s3c244x.o obj-$(CONFIG_S3C2440_DMA) += dma-s3c2440.o -obj-$(CONFIG_CPU_S3C2443) += s3c2443.o irq-s3c2443.o clock-s3c2443.o +obj-$(CONFIG_CPU_S3C2443) += s3c2443.o clock-s3c2443.o # PM
arch/arm/mach-s3c24xx/irq-s3c2443.c deleted +0 -281
281 lines not on this page · raw message
arch/arm/plat-s3c24xx/irq.c +243 -0
246 lines not on this page · raw message
Signature · 1 line
1.7.2.3
PATCH v3 8/9 ARM: S3C24XX: modify s3c2443 irq init to initialize all irqs
In reply to Heiko StübnerPreviously the irq init used s3c24xx_init_irq and an additional arch_initcall to add the cpu specific irqs.
To be able to simplyfy the irq init later, create a new function s3c2443_init_irq, which then calls s3c24xx_init_irq but also adds the cpu specific irqs.
--- arch/arm/mach-s3c24xx/mach-smdk2443.c | 2 +- arch/arm/plat-s3c24xx/irq.c | 22 ++++------------------ arch/arm/plat-samsung/include/plat/s3c2443.h | 2 ++ 3 files changed, 7 insertions(+), 19 deletions(-)
arch/arm/mach-s3c24xx/mach-smdk2443.c +1 -1
@@ -140,7 +140,7 @@ MACHINE_START(SMDK2443, "SMDK2443")/* Maintainer: Ben Dooks <[email protected]> */ .atag_offset = 0x100, - .init_irq = s3c24xx_init_irq, + .init_irq = s3c2443_init_irq, .map_io = smdk2443_map_io, .init_machine = smdk2443_machine_init, .timer = &s3c24xx_timer,
arch/arm/plat-s3c24xx/irq.c +4 -18
@@ -935,10 +935,11 @@ static int s3c2443_add_sub(unsigned int base,return 0 ; } -static int s3c2443_irq_add (struct device *dev, -struct subsys_interface *sif) +void __init s3c2443_init_irq (void ) { -printk ("S3C2443: IRQ Support\n" ); +pr_info ("S3C2443: IRQ Support\n" ); + +s3c24xx_init_irq ();s3c2443_add_sub (IRQ_CAM , s3c2443_irq_demux_cam, &s3c2443_irq_cam,IRQ_S3C2440_CAM_C ,IRQ_S3C2440_CAM_P );
@@ -956,20 +957,5 @@ static int s3c2443_irq_add(struct device *dev,s3c2443_add_sub (IRQ_WDT , s3c2443_irq_demux_wdtac97, &s3c2443_irq_wdtac97, IRQ_S3C2443_WDT, IRQ_S3C2443_AC97); - - return 0; } - -static struct subsys_interface s3c2443_irq_interface = { - .name ="s3c2443_irq" , - .subsys = &s3c2443_subsys, - .add_dev = s3c2443_irq_add, -}; - -static int __init s3c2443_irq_init (void ) -{ -return subsys_interface_register (&s3c2443_irq_interface); -} - -arch_initcall (s3c2443_irq_init);#endif
arch/arm/plat-samsung/include/plat/s3c2443.h +2 -0
@@ -25,6 +25,8 @@ extern void s3c2443_init_clocks(int xtal);extern int s3c2443_baseclk_add (void );extern void s3c2443_restart (char mode,const char *cmd); + +extern void s3c2443_init_irq (void );#else #define s3c2443_init_clocks NULL#define s3c2443_init_uarts NULL
Signature · 1 line
1.7.2.3
PATCH v3 9/9 ARM: S3C24XX: transform s3c2443 subirqs into new structure
In reply to Heiko StübnerShare the common irq code by simply defining a correct mapping declaration for the s3c2443.
--- arch/arm/plat-s3c24xx/irq.c | 289 +++++++++++-------------------------------- 1 files changed, 75 insertions(+), 214 deletions(-)
arch/arm/plat-s3c24xx/irq.c +75 -214
@@ -732,230 +732,91 @@ void __init s3c2416_init_irq(void)#endif #ifdef CONFIG_CPU_S3C2443 -#define INTMSK (start, end) ((1 << ((end) + 1 - (start))) - 1) - -static inline void s3c2443_irq_demux (unsigned int irq,unsigned int len) -{ -unsigned int subsrc, submsk; -unsigned int end; - -/* read the current pending interrupts, and the mask -* for what it is available */ - - subsrc =__raw_readl (S3C2410_SUBSRCPND ); - submsk =__raw_readl (S3C2410_INTSUBMSK ); - - subsrc &= ~submsk; - subsrc >>= (irq -S3C2410_IRQSUB (0 )); - subsrc &= (1 << len)-1 ; - - end = len + irq; - -for (; irq < end && subsrc; irq++) { -if (subsrc &1 ) -generic_handle_irq (irq); - - subsrc >>=1 ; - } -} - -/* WDT/AC97 sub interrupts */ - -static void s3c2443_irq_demux_wdtac97 (unsigned int irq,struct irq_desc *desc) -{ -s3c2443_irq_demux (IRQ_S3C2443_WDT ,4 ); -} - -#define INTMSK_WDTAC97 (1UL << (IRQ_WDT - IRQ_EINT0)) -#define SUBMSK_WDTAC97 INTMSK(IRQ_S3C2443_WDT, IRQ_S3C2443_AC97) - -static void s3c2443_irq_wdtac97_mask (struct irq_data *data) -{ -s3c_irqsub_mask (data->irq,INTMSK_WDTAC97 ,SUBMSK_WDTAC97 ); -} - -static void s3c2443_irq_wdtac97_unmask (struct irq_data *data) -{ -s3c_irqsub_unmask (data->irq,INTMSK_WDTAC97 ); -} - -static void s3c2443_irq_wdtac97_ack (struct irq_data *data) -{ -s3c_irqsub_maskack (data->irq,INTMSK_WDTAC97 ,SUBMSK_WDTAC97 ); -} - -static struct irq_chip s3c2443_irq_wdtac97 = { - .irq_mask = s3c2443_irq_wdtac97_mask, - .irq_unmask = s3c2443_irq_wdtac97_unmask, - .irq_ack = s3c2443_irq_wdtac97_ack, -}; - -/* LCD sub interrupts */ - -static void s3c2443_irq_demux_lcd (unsigned int irq,struct irq_desc *desc) -{ -s3c2443_irq_demux (IRQ_S3C2443_LCD1 ,4 ); -} - -#define INTMSK_LCD (1UL << (IRQ_LCD - IRQ_EINT0)) -#define SUBMSK_LCD INTMSK(IRQ_S3C2443_LCD1, IRQ_S3C2443_LCD4) - -static void s3c2443_irq_lcd_mask (struct irq_data *data) -{ -s3c_irqsub_mask (data->irq,INTMSK_LCD ,SUBMSK_LCD ); -} - -static void s3c2443_irq_lcd_unmask (struct irq_data *data) -{ -s3c_irqsub_unmask (data->irq,INTMSK_LCD ); -} - -static void s3c2443_irq_lcd_ack (struct irq_data *data) -{ -s3c_irqsub_maskack (data->irq,INTMSK_LCD ,SUBMSK_LCD ); -} - -static struct irq_chip s3c2443_irq_lcd = { - .irq_mask = s3c2443_irq_lcd_mask, - .irq_unmask = s3c2443_irq_lcd_unmask, - .irq_ack = s3c2443_irq_lcd_ack, -}; - -/* DMA sub interrupts */ - -static void s3c2443_irq_demux_dma (unsigned int irq,struct irq_desc *desc) -{ -s3c2443_irq_demux (IRQ_S3C2443_DMA0 ,6 ); -} - -#define INTMSK_DMA (1UL << (IRQ_S3C2443_DMA - IRQ_EINT0)) -#define SUBMSK_DMA INTMSK(IRQ_S3C2443_DMA0, IRQ_S3C2443_DMA5) - -static void s3c2443_irq_dma_mask (struct irq_data *data) -{ -s3c_irqsub_mask (data->irq,INTMSK_DMA ,SUBMSK_DMA ); -} - -static void s3c2443_irq_dma_unmask (struct irq_data *data) -{ -s3c_irqsub_unmask (data->irq,INTMSK_DMA ); -} - -static void s3c2443_irq_dma_ack (struct irq_data *data) -{ -s3c_irqsub_maskack (data->irq,INTMSK_DMA ,SUBMSK_DMA ); -} - -static struct irq_chip s3c2443_irq_dma = { - .irq_mask = s3c2443_irq_dma_mask, - .irq_unmask = s3c2443_irq_dma_unmask, - .irq_ack = s3c2443_irq_dma_ack, -}; - -/* UART3 sub interrupts */ - -static void s3c2443_irq_demux_uart3 (unsigned int irq,struct irq_desc *desc) -{ -s3c2443_irq_demux (IRQ_S3C2443_RX3 ,3 ); -} - -#define INTMSK_UART3 (1UL << (IRQ_S3C2443_UART3 - IRQ_EINT0)) -#define SUBMSK_UART3 (0x7 << (IRQ_S3C2443_RX3 - S3C2410_IRQSUB(0))) - -static void s3c2443_irq_uart3_mask (struct irq_data *data) -{ -s3c_irqsub_mask (data->irq,INTMSK_UART3 ,SUBMSK_UART3 ); -} - -static void s3c2443_irq_uart3_unmask (struct irq_data *data) -{ -s3c_irqsub_unmask (data->irq,INTMSK_UART3 ); -} - -static void s3c2443_irq_uart3_ack (struct irq_data *data) -{ -s3c_irqsub_maskack (data->irq,INTMSK_UART3 ,SUBMSK_UART3 ); -} - -static struct irq_chip s3c2443_irq_uart3 = { - .irq_mask = s3c2443_irq_uart3_mask, - .irq_unmask = s3c2443_irq_uart3_unmask, - .irq_ack = s3c2443_irq_uart3_ack, +static struct s3c_irq_data init_s3c2443base[32 ] = { + { .type =S3C_IRQTYPE_EINT , },/* EINT0 */ + { .type =S3C_IRQTYPE_EINT , },/* EINT1 */ + { .type =S3C_IRQTYPE_EINT , },/* EINT2 */ + { .type =S3C_IRQTYPE_EINT , },/* EINT3 */ + { .type =S3C_IRQTYPE_LEVEL , },/* EINT4to7 */ + { .type =S3C_IRQTYPE_LEVEL , },/* EINT8to23 */ + { .type =S3C_IRQTYPE_LEVEL , },/* CAM */ + { .type =S3C_IRQTYPE_EDGE , },/* nBATT_FLT */ + { .type =S3C_IRQTYPE_EDGE , },/* TICK */ + { .type =S3C_IRQTYPE_LEVEL , },/* WDT/AC97 */ + { .type =S3C_IRQTYPE_EDGE , },/* TIMER0 */ + { .type =S3C_IRQTYPE_EDGE , },/* TIMER1 */ + { .type =S3C_IRQTYPE_EDGE , },/* TIMER2 */ + { .type =S3C_IRQTYPE_EDGE , },/* TIMER3 */ + { .type =S3C_IRQTYPE_EDGE , },/* TIMER4 */ + { .type =S3C_IRQTYPE_LEVEL , },/* UART2 */ + { .type =S3C_IRQTYPE_LEVEL , },/* LCD */ + { .type =S3C_IRQTYPE_LEVEL , },/* DMA */ + { .type =S3C_IRQTYPE_LEVEL , },/* UART3 */ + { .type =S3C_IRQTYPE_EDGE , },/* CFON */ + { .type =S3C_IRQTYPE_EDGE , },/* SDI1 */ + { .type =S3C_IRQTYPE_EDGE , },/* SDI0 */ + { .type =S3C_IRQTYPE_EDGE , },/* SPI0 */ + { .type =S3C_IRQTYPE_LEVEL , },/* UART1 */ + { .type =S3C_IRQTYPE_EDGE , },/* NAND */ + { .type =S3C_IRQTYPE_EDGE , },/* USBD */ + { .type =S3C_IRQTYPE_EDGE , },/* USBH */ + { .type =S3C_IRQTYPE_EDGE , },/* IIC */ + { .type =S3C_IRQTYPE_LEVEL , },/* UART0 */ + { .type =S3C_IRQTYPE_EDGE , },/* SPI1 */ + { .type =S3C_IRQTYPE_EDGE , },/* RTC */ + { .type =S3C_IRQTYPE_LEVEL , },/* ADCPARENT */ }; -/* CAM sub interrupts */ -static void s3c2443_irq_demux_cam (unsigned int irq,struct irq_desc *desc) -{ -s3c2443_irq_demux (IRQ_S3C2440_CAM_C ,4 ); -} - -#define INTMSK_CAM (1UL << (IRQ_CAM - IRQ_EINT0)) -#define SUBMSK_CAM INTMSK(IRQ_S3C2440_CAM_C, IRQ_S3C2440_CAM_P) - -static void s3c2443_irq_cam_mask (struct irq_data *data) -{ -s3c_irqsub_mask (data->irq,INTMSK_CAM ,SUBMSK_CAM ); -} - -static void s3c2443_irq_cam_unmask (struct irq_data *data) -{ -s3c_irqsub_unmask (data->irq,INTMSK_CAM ); -} - -static void s3c2443_irq_cam_ack (struct irq_data *data) -{ -s3c_irqsub_maskack (data->irq,INTMSK_CAM ,SUBMSK_CAM ); -} - -static struct irq_chip s3c2443_irq_cam = { - .irq_mask = s3c2443_irq_cam_mask, - .irq_unmask = s3c2443_irq_cam_unmask, - .irq_ack = s3c2443_irq_cam_ack, +static struct s3c_irq_data init_s3c2443subint[32 ] = { + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =28 },/* UART0-RX */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =28 },/* UART0-TX */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =28 },/* UART0-ERR */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =23 },/* UART1-RX */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =23 },/* UART1-TX */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =23 },/* UART1-ERR */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =15 },/* UART2-RX */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =15 },/* UART2-TX */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =15 },/* UART2-ERR */ + { .type =S3C_IRQTYPE_EDGE , .parent_irq =31 },/* TC */ + { .type =S3C_IRQTYPE_EDGE , .parent_irq =31 },/* ADC */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =6 },/* CAM_C */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =6 },/* CAM_P */ + { .type =S3C_IRQTYPE_NONE },/* reserved */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =16 },/* LCD1 */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =16 },/* LCD2 */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =16 },/* LCD3 */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =16 },/* LCD4 */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =17 },/* DMA0 */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =17 },/* DMA1 */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =17 },/* DMA2 */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =17 },/* DMA3 */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =17 },/* DMA4 */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =17 },/* DMA5 */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =18 },/* UART3-RX */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =18 },/* UART3-TX */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =18 },/* UART3-ERR */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =9 },/* WDT */ + { .type =S3C_IRQTYPE_LEVEL , .parent_irq =9 },/* AC97 */ }; -/* IRQ initialisation code */ - -static int s3c2443_add_sub (unsigned int base, -void (*demux)(unsigned int , -struct irq_desc *), -struct irq_chip *chip, -unsigned int start,unsigned int end) -{ -unsigned int irqno; - -irq_set_chip_and_handler (base, &s3c_irq_level_chip, handle_level_irq); -irq_set_chained_handler (base, demux); - -for (irqno = start; irqno <= end; irqno++) { -irq_set_chip_and_handler (irqno, chip, handle_level_irq); -set_irq_flags (irqno,IRQF_VALID ); - } - -return 0 ; -} -void __init s3c2443_init_irq (void ) { -pr_info ("S3C2443: IRQ Support\n" ); - -s3c24xx_init_irq (); - -s3c2443_add_sub (IRQ_CAM , s3c2443_irq_demux_cam, &s3c2443_irq_cam, -IRQ_S3C2440_CAM_C ,IRQ_S3C2440_CAM_P ); +struct s3c_irq_intc *main_intc; -s3c2443_add_sub (IRQ_LCD , s3c2443_irq_demux_lcd, &s3c2443_irq_lcd, -IRQ_S3C2443_LCD1 ,IRQ_S3C2443_LCD4 ); +pr_info ("S3C2443: IRQ Support\n" ); -s3c2443_add_sub (IRQ_S3C2443_DMA , s3c2443_irq_demux_dma, - &s3c2443_irq_dma,IRQ_S3C2443_DMA0 ,IRQ_S3C2443_DMA5 ); +#ifdef CONFIG_FIQ +init_FIQ (FIQ_START ); +#endif -s3c2443_add_sub (IRQ_S3C2443_UART3 , s3c2443_irq_demux_uart3, - &s3c2443_irq_uart3, -IRQ_S3C2443_RX3 ,IRQ_S3C2443_ERR3 ); + main_intc =s3c24xx_init_intc (NULL , &init_s3c2443base[0 ],NULL ,0x4a000000 ); +if (IS_ERR (main_intc)) { +pr_err ("irq: could not create main interrupt controller\n" ); +return ; + } -s3c2443_add_sub (IRQ_WDT , s3c2443_irq_demux_wdtac97, - &s3c2443_irq_wdtac97, -IRQ_S3C2443_WDT ,IRQ_S3C2443_AC97 ); +s3c24xx_init_intc (NULL , &init_eint[0 ], main_intc,0x560000a4 ); +s3c24xx_init_intc (NULL , &init_s3c2443subint[0 ], main_intc,0x4a000018 ); }#endif
Signature · 1 line
1.7.2.3
v3 cover ARM: S3C24XX: rework irq handling for a later dt usage
In reply to Heiko StübnerQuoted 52 lines · Heiko St?bner
Third version of redoing the s3c24xx irqs in a generic way by using a declarative approach.
Main change is the different approach to the init. Moved the
s3c24xx_init_intcfunction from the dt patchset here, so that both init types (dt and non-dt) can use a similar init scheme.As in the second version, the 1st patch might be hard to read due to the rewrite character, but I didn't see a way to do these changes in individual steps. So it might be helpful to look at the result after applying this patch.
Runtime-tested on a s3c2416 based board and compile tested for the others.
As also written before, inclusion of the other S3C24XX SoCs to follow once the general approach is acceptable.
Applies to the most current for-next (from two hours ago) from linux- samsung
Heiko Stuebner (9):
ARM: S3C24XX: transform irq handling into a declarative form
ARM: S3C24XX: Move irq syscore-ops to irq-pm
ARM: S3C24XX: Modifys3c_irq_waketo use the hwirq property
ARM: S3C24XX: move s3c2416 irq init to common irq code
ARM: S3C24XX: modify s3c2416 irq init to initialize all irqs
ARM: S3C24XX: transform s3c2416 irqs into new structure
ARM: S3C24XX: move s3c2443 irq code toirq.c
ARM: S3C24XX: modify s3c2443 irq init to initialize all irqs
ARM: S3C24XX: transform s3c2443 subirqs into new structurearch/arm/mach-s3c24xx/Makefile | 4 +- arch/arm/mach-s3c24xx/common.h | 2 + arch/arm/mach-s3c24xx/irq-pm.c | 41 +- arch/arm/mach-s3c24xx/irq-s3c2416.c | 348 -------- arch/arm/mach-s3c24xx/irq-s3c2443.c | 281 ------- arch/arm/mach-s3c24xx/mach-smdk2416.c | 2 +- arch/arm/mach-s3c24xx/mach-smdk2443.c | 2 +- arch/arm/mach-s3c24xx/s3c2410.c | 4 +- arch/arm/mach-s3c24xx/s3c2412.c | 4 +- arch/arm/mach-s3c24xx/s3c2416.c | 4 +- arch/arm/mach-s3c24xx/s3c2440.c | 4 +- arch/arm/mach-s3c24xx/s3c2442.c | 4 +- arch/arm/plat-s3c24xx/Kconfig | 1 + arch/arm/plat-s3c24xx/irq.c | 1110 +++++++++++++++----------- arch/arm/plat-samsung/include/plat/pm.h | 6 - arch/arm/plat-samsung/include/plat/s3c2416.h | 1 + arch/arm/plat-samsung/include/plat/s3c2443.h | 2 + 17 files changed, 688 insertions(+), 1132 deletions(-) delete mode 100644 arch/arm/mach-s3c24xx/irq-s3c2416.c delete mode 100644 arch/arm/mach-s3c24xx/irq-s3c2443.c
Quoted 2 lines
--
1.7.2.3
Heiko, looks good to me :-)
BTW, can you rebase this against on next/cleanup-s3c24xx branch in my tree?
Thanks.
- Kukjin
v3 cover ARM: S3C24XX: rework irq handling for a later dt usage
Am Freitag, 25. Januar 2013, 19:59:18 schrieb Kukjin Kim:
Quoted 55 lines
Quoted 54 lines · Heiko St?bner
Third version of redoing the s3c24xx irqs in a generic way by using a declarative approach.
Main change is the different approach to the init. Moved the
s3c24xx_init_intcfunction from the dt patchset here, so that both init types (dt and non-dt) can use a similar init scheme.As in the second version, the 1st patch might be hard to read due to the rewrite character, but I didn't see a way to do these changes in individual steps. So it might be helpful to look at the result after applying this patch.
Runtime-tested on a s3c2416 based board and compile tested for the others.
As also written before, inclusion of the other S3C24XX SoCs to follow once the general approach is acceptable.
Applies to the most current for-next (from two hours ago) from linux- samsung
Heiko Stuebner (9):
ARM: S3C24XX: transform irq handling into a declarative form
ARM: S3C24XX: Move irq syscore-ops to irq-pm
ARM: S3C24XX: Modifys3c_irq_waketo use the hwirq property
ARM: S3C24XX: move s3c2416 irq init to common irq code
ARM: S3C24XX: modify s3c2416 irq init to initialize all irqs
ARM: S3C24XX: transform s3c2416 irqs into new structure
ARM: S3C24XX: move s3c2443 irq code toirq.c
ARM: S3C24XX: modify s3c2443 irq init to initialize all irqs
ARM: S3C24XX: transform s3c2443 subirqs into new structurearch/arm/mach-s3c24xx/Makefile | 4 +- arch/arm/mach-s3c24xx/common.h | 2 + arch/arm/mach-s3c24xx/irq-pm.c | 41 +- arch/arm/mach-s3c24xx/irq-s3c2416.c | 348 -------- arch/arm/mach-s3c24xx/irq-s3c2443.c | 281 ------- arch/arm/mach-s3c24xx/mach-smdk2416.c | 2 +- arch/arm/mach-s3c24xx/mach-smdk2443.c | 2 +- arch/arm/mach-s3c24xx/s3c2410.c | 4 +- arch/arm/mach-s3c24xx/s3c2412.c | 4 +- arch/arm/mach-s3c24xx/s3c2416.c | 4 +- arch/arm/mach-s3c24xx/s3c2440.c | 4 +- arch/arm/mach-s3c24xx/s3c2442.c | 4 +- arch/arm/plat-s3c24xx/Kconfig | 1 + arch/arm/plat-s3c24xx/irq.c | 1110 +++++++++++++++----------- arch/arm/plat-samsung/include/plat/pm.h | 6 - arch/arm/plat-samsung/include/plat/s3c2416.h | 1 + arch/arm/plat-samsung/include/plat/s3c2443.h | 2 + 17 files changed, 688 insertions(+), 1132 deletions(-) delete mode 100644 arch/arm/mach-s3c24xx/irq-s3c2416.c delete mode 100644 arch/arm/mach-s3c24xx/irq-s3c2443.c
Quoted 4 lines
Quoted 2 lines
--
1.7.2.3Heiko, looks good to me :-)
very cool :-)
Quoted 1 line
BTW, can you rebase this against on next/cleanup-s3c24xx branch in my tree?
will try to do this today
Heiko