Skip to contentSkip to conversation

ARM: S3C24XX: irq move to drivers and first steps to dt

RFC PATCH New Heiko Stübner 2 participants 7 messages Nov 12, 2012

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

cover ARM: S3C24XX: irq move to drivers and first steps to dt

On the way back from Barcelona I've started the move of the common s3c24xx irq-code to drivers/irqchip and also modifications to enable using it in a devicetree context at some point.

So, as I'm also missing the now probably famous tail-lights in this, it would be cool to have some feedback if I'm moving in the right direction here or am thinking wrong somewhere.

The whole endeavour is of course not finished yet, but should not break anything in its current form.

Tested on a s3c2416 based machine.

Heiko Stuebner (4):
ARM: S3C24XX: move s3c24xx-irq to drivers/irqchip
irqchip: s3c24xx: add irq_domains for the interrupt registers
ARM: S3C24XX: irq_data conversion for s3c_irqsub_* functions
ARM: S3C24XX: First part converting irq code to use hwirq

 arch/arm/Kconfig                                   |    1 +
 arch/arm/mach-s3c24xx/irq-pm.c                     |    4 +-
 arch/arm/mach-s3c24xx/irq-s3c2412.c                |    6 +-
 arch/arm/mach-s3c24xx/irq-s3c2416.c                |   24 ++--
 arch/arm/mach-s3c24xx/irq-s3c2440.c                |    6 +-
 arch/arm/mach-s3c24xx/irq-s3c2443.c                |   30 ++--
 arch/arm/mach-s3c24xx/irq-s3c244x.c                |    6 +-
 arch/arm/plat-s3c24xx/Makefile                     |    1 -
 arch/arm/plat-samsung/include/plat/irq.h           |   18 ++--
 drivers/irqchip/Kconfig                            |    4 +
 drivers/irqchip/Makefile                           |    1 +
 .../irq.c => drivers/irqchip/irq-s3c24xx.c         |  147 ++++++++++++--------
 12 files changed, 144 insertions(+), 104 deletions(-)
 rename arch/arm/plat-s3c24xx/irq.c => drivers/irqchip/irq-s3c24xx.c (84%)
Signature · 1 line
1.7.2.3
#1 lore raw

RFC PATCH 1/4 ARM: S3C24XX: move s3c24xx-irq to drivers/irqchip

Removes another part from plat-s3c24xx and also enables further improvements happening in the correct location.

---
 arch/arm/Kconfig                                   |    1 +
 arch/arm/plat-s3c24xx/Makefile                     |    1 -
 drivers/irqchip/Kconfig                            |    3 +++
 drivers/irqchip/Makefile                           |    1 +
 .../irq.c => drivers/irqchip/irq-s3c24xx.c         |    0
 5 files changed, 5 insertions(+), 1 deletions(-)
 rename arch/arm/plat-s3c24xx/irq.c => drivers/irqchip/irq-s3c24xx.c (100%)
arch/arm/Kconfig +1 -0
index 48eea16..7db6b91 100644
@@ -742,6 +742,7 @@ config ARCH_S3C24XX
 	select HAVE_S3C_RTC if RTC_CLASS
 	select NEED_MACH_GPIO_H
 	select NEED_MACH_IO_H
+	select S3C24XX_IRQ
 	help
 	  Samsung S3C2410, S3C2412, S3C2413, S3C2416, S3C2440, S3C2442, S3C2443
 	  and S3C2450 SoCs based systems, such as the Simtec Electronics BAST
arch/arm/plat-s3c24xx/Makefile +0 -1
index 9f60549c..6472416 100644
@@ -12,7 +12,6 @@ obj-				:=
 
 # Core files
 
-obj-y				+= irq.o
 obj-$(CONFIG_S3C24XX_DCLK)	+= clock-dclk.o
 
 obj-$(CONFIG_CPU_FREQ_S3C24XX)	+= cpu-freq.o
drivers/irqchip/Kconfig +3 -0
index 62ca575..860d45d 100644
@@ -1,3 +1,6 @@
+config S3C24XX_IRQ
+	bool
+
 config VERSATILE_FPGA_IRQ
 	bool
 	select IRQ_DOMAIN
drivers/irqchip/Makefile +1 -0
index e2e6eb5..5c20f85 100644
@@ -1,2 +1,3 @@
 obj-$(CONFIG_ARCH_BCM2835) += irq-bcm2835.o
+obj-$(CONFIG_S3C24XX_IRQ) += irq-s3c24xx.o
 obj-$(CONFIG_VERSATILE_FPGA_IRQ) += irq-versatile-fpga.o
drivers/irqchip/irq-s3c24xx.c renamed from arch/arm/plat-s3c24xx/irq.c +0 -0
similarity index 100%
rename from arch/arm/plat-s3c24xx/irq.c
rename to drivers/irqchip/irq-s3c24xx.c
Signature · 1 line
1.7.2.3
#2 lore raw

RFC PATCH 1/4 ARM: S3C24XX: move s3c24xx-irq to drivers/irqchip

Quoted 4 lines · Heiko St?bner

Removes another part from plat-s3c24xx and also enables further improvements happening in the correct location.

Quoted 8 lines
---
 arch/arm/Kconfig                                   |    1 +
 arch/arm/plat-s3c24xx/Makefile                     |    1 -
 drivers/irqchip/Kconfig                            |    3 +++
 drivers/irqchip/Makefile                           |    1 +
 .../irq.c => drivers/irqchip/irq-s3c24xx.c         |    0
 5 files changed, 5 insertions(+), 1 deletions(-)
 rename arch/arm/plat-s3c24xx/irq.c => drivers/irqchip/irq-s3c24xx.c (100%)

Presumably there's a header file somewhere that defines the interface to irq-s3c24xx.c that other code in arch/arm/plat-s3c24xx is using to initialize it. That header should be moved somewhere public (i.e. outside {mach,plat}-*/include/{mach,plat}). However, you then end up with a header file per IRQ driver in that public location. So, Thomas Petazzoni started working on a solution for that:

Quoted 1 line

http://lists.arm.linux.org.uk/lurker/message/20121027.164514.11eb86db.en.html

#3 lore raw

RFC PATCH 1/4 ARM: S3C24XX: move s3c24xx-irq to drivers/irqchip

Am Montag, 12. November 2012, 18:05:39 schrieb Stephen Warren:

Quoted 16 lines · Heiko St?bner
Quoted 6 lines

Removes another part from plat-s3c24xx and also enables further improvements happening in the correct location.

---

Quoted 8 lines
 arch/arm/Kconfig                                   |    1 +
 arch/arm/plat-s3c24xx/Makefile                     |    1 -
 drivers/irqchip/Kconfig                            |    3 +++
 drivers/irqchip/Makefile                           |    1 +
 .../irq.c => drivers/irqchip/irq-s3c24xx.c         |    0
 5 files changed, 5 insertions(+), 1 deletions(-)
 rename arch/arm/plat-s3c24xx/irq.c => drivers/irqchip/irq-s3c24xx.c

(100%)

Quoted 9 lines

Presumably there's a header file somewhere that defines the interface to irq-s3c24xx.c that other code in arch/arm/plat-s3c24xx is using to initialize it. That header should be moved somewhere public (i.e. outside {mach,plat}-*/include/{mach,plat}). However, you then end up with a header file per IRQ driver in that public location. So, Thomas

Petazzoni started working on a solution for that:

Quoted 2 lines

http://lists.arm.linux.org.uk/lurker/message/20121027.164514.11eb86db.en.
html

cool, thanks for the pointer :-) .

For the headers, yes they are present and still in mach/plat. My intention was to first clean it up and then move the remaing necessary header.

I'm not sure what is the policy for adding stuff to drivers/irqchip (dt- only?), because _all_ s3c24xx subtypes using devicetree seems very very far in the future, if at all.

So when thinking a bit more about it, it might be better to keep the irq code in arch/arm for the time being?

Because non-dt init code will probably be necessary for a lot more time.

Heiko

#4 lore raw

RFC PATCH 2/4 irqchip: s3c24xx: add irq_domains for the interrupt registers

In reply to Heiko Stübner

Add irqdomains for the three register sets in use for base, external and sub-interrupts. This also pouplates the hwirq value for further improvements.

---
 drivers/irqchip/Kconfig       |    1 +
 drivers/irqchip/irq-s3c24xx.c |   14 ++++++++++++++
 2 files changed, 15 insertions(+), 0 deletions(-)
drivers/irqchip/Kconfig +1 -0
index 860d45d..e30feca 100644
@@ -1,5 +1,6 @@
 config S3C24XX_IRQ
 	bool
+	select IRQ_DOMAIN
 
 config VERSATILE_FPGA_IRQ
 	bool
drivers/irqchip/irq-s3c24xx.c +14 -0
index fe57bbb..cf9d04d 100644
@@ -25,6 +25,8 @@
 #include <linux/device.h>
 #include <linux/syscore_ops.h>
 
+#include <linux/irqdomain.h>
+
 #include <asm/irq.h>
 #include <asm/mach/irq.h>
 
@@ -667,6 +669,18 @@ void __init s3c24xx_init_irq(void)
 		set_irq_flags(irqno, IRQF_VALID);
 	}
 
+	/* basic interrupt register */
+	irq_domain_add_legacy(NULL, 32, IRQ_EINT0, 0, &irq_domain_simple_ops,
+			      NULL);
+
+	/* extint register, irqs begin at bit4 */
+	irq_domain_add_legacy(NULL, 20, IRQ_EINT4, 4, &irq_domain_simple_ops,
+			      NULL);
+
+	/* subint register, 29 to fit subints of all SoCs */
+	irq_domain_add_legacy(NULL, 29, IRQ_S3CUART_RX0, 0,
+			      &irq_domain_simple_ops, NULL);
+
 	irqdbf("s3c2410: registered interrupt handlers\n");
 }
 
Signature · 1 line
1.7.2.3
#5 lore raw

RFC PATCH 3/4 ARM: S3C24XX: irq_data conversion for s3c_irqsub_* functions

In reply to Heiko Stübner

Don't strip off the rest of the irq_data struct when calling one of the s3c_irqsub_* functions. This enables using its hwirq field later on.

---
 arch/arm/mach-s3c24xx/irq-s3c2412.c      |    6 +++---
 arch/arm/mach-s3c24xx/irq-s3c2416.c      |   24 ++++++++++++------------
 arch/arm/mach-s3c24xx/irq-s3c2440.c      |    6 +++---
 arch/arm/mach-s3c24xx/irq-s3c2443.c      |   30 +++++++++++++++---------------
 arch/arm/mach-s3c24xx/irq-s3c244x.c      |    6 +++---
 arch/arm/plat-samsung/include/plat/irq.h |   18 +++++++++---------
 drivers/irqchip/irq-s3c24xx.c            |   24 ++++++++++++------------
 7 files changed, 57 insertions(+), 57 deletions(-)
arch/arm/mach-s3c24xx/irq-s3c2412.c +3 -3
index e65619d..2cee386 100644
@@ -134,17 +134,17 @@ static void s3c2412_irq_demux_cfsdi(unsigned int irq, struct irq_desc *desc)
 
 static void s3c2412_irq_cfsdi_mask(struct irq_data *data)
 {
-	s3c_irqsub_mask(data->irq, INTMSK_CFSDI, SUBMSK_CFSDI);
+	s3c_irqsub_mask(data, INTMSK_CFSDI, SUBMSK_CFSDI);
 }
 
 static void s3c2412_irq_cfsdi_unmask(struct irq_data *data)
 {
-	s3c_irqsub_unmask(data->irq, INTMSK_CFSDI);
+	s3c_irqsub_unmask(data, INTMSK_CFSDI);
 }
 
 static void s3c2412_irq_cfsdi_ack(struct irq_data *data)
 {
-	s3c_irqsub_maskack(data->irq, INTMSK_CFSDI, SUBMSK_CFSDI);
+	s3c_irqsub_maskack(data, INTMSK_CFSDI, SUBMSK_CFSDI);
 }
 
 static struct irq_chip s3c2412_irq_cfsdi = {
arch/arm/mach-s3c24xx/irq-s3c2416.c +12 -12
index ff141b0..149d406 100644
@@ -80,17 +80,17 @@ static void s3c2416_irq_demux_wdtac97(unsigned int irq, struct irq_desc *desc)
 
 static void s3c2416_irq_wdtac97_mask(struct irq_data *data)
 {
-	s3c_irqsub_mask(data->irq, INTMSK_WDTAC97, SUBMSK_WDTAC97);
+	s3c_irqsub_mask(data, INTMSK_WDTAC97, SUBMSK_WDTAC97);
 }
 
 static void s3c2416_irq_wdtac97_unmask(struct irq_data *data)
 {
-	s3c_irqsub_unmask(data->irq, INTMSK_WDTAC97);
+	s3c_irqsub_unmask(data, INTMSK_WDTAC97);
 }
 
 static void s3c2416_irq_wdtac97_ack(struct irq_data *data)
 {
-	s3c_irqsub_maskack(data->irq, INTMSK_WDTAC97, SUBMSK_WDTAC97);
+	s3c_irqsub_maskack(data, INTMSK_WDTAC97, SUBMSK_WDTAC97);
 }
 
 static struct irq_chip s3c2416_irq_wdtac97 = {
@@ -111,17 +111,17 @@ static void s3c2416_irq_demux_lcd(unsigned int irq, struct irq_desc *desc)
 
 static void s3c2416_irq_lcd_mask(struct irq_data *data)
 {
-	s3c_irqsub_mask(data->irq, INTMSK_LCD, SUBMSK_LCD);
+	s3c_irqsub_mask(data, INTMSK_LCD, SUBMSK_LCD);
 }
 
 static void s3c2416_irq_lcd_unmask(struct irq_data *data)
 {
-	s3c_irqsub_unmask(data->irq, INTMSK_LCD);
+	s3c_irqsub_unmask(data, INTMSK_LCD);
 }
 
 static void s3c2416_irq_lcd_ack(struct irq_data *data)
 {
-	s3c_irqsub_maskack(data->irq, INTMSK_LCD, SUBMSK_LCD);
+	s3c_irqsub_maskack(data, INTMSK_LCD, SUBMSK_LCD);
 }
 
 static struct irq_chip s3c2416_irq_lcd = {
@@ -143,17 +143,17 @@ static void s3c2416_irq_demux_dma(unsigned int irq, struct irq_desc *desc)
 
 static void s3c2416_irq_dma_mask(struct irq_data *data)
 {
-	s3c_irqsub_mask(data->irq, INTMSK_DMA, SUBMSK_DMA);
+	s3c_irqsub_mask(data, INTMSK_DMA, SUBMSK_DMA);
 }
 
 static void s3c2416_irq_dma_unmask(struct irq_data *data)
 {
-	s3c_irqsub_unmask(data->irq, INTMSK_DMA);
+	s3c_irqsub_unmask(data, INTMSK_DMA);
 }
 
 static void s3c2416_irq_dma_ack(struct irq_data *data)
 {
-	s3c_irqsub_maskack(data->irq, INTMSK_DMA, SUBMSK_DMA);
+	s3c_irqsub_maskack(data, INTMSK_DMA, SUBMSK_DMA);
 }
 
 static struct irq_chip s3c2416_irq_dma = {
@@ -174,17 +174,17 @@ static void s3c2416_irq_demux_uart3(unsigned int irq, struct irq_desc *desc)
 
 static void s3c2416_irq_uart3_mask(struct irq_data *data)
 {
-	s3c_irqsub_mask(data->irq, INTMSK_UART3, SUBMSK_UART3);
+	s3c_irqsub_mask(data, INTMSK_UART3, SUBMSK_UART3);
 }
 
 static void s3c2416_irq_uart3_unmask(struct irq_data *data)
 {
-	s3c_irqsub_unmask(data->irq, INTMSK_UART3);
+	s3c_irqsub_unmask(data, INTMSK_UART3);
 }
 
 static void s3c2416_irq_uart3_ack(struct irq_data *data)
 {
-	s3c_irqsub_maskack(data->irq, INTMSK_UART3, SUBMSK_UART3);
+	s3c_irqsub_maskack(data, INTMSK_UART3, SUBMSK_UART3);
 }
 
 static struct irq_chip s3c2416_irq_uart3 = {
arch/arm/mach-s3c24xx/irq-s3c2440.c +3 -3
index 4a18cde..99fada9 100644
@@ -71,19 +71,19 @@ static void s3c_irq_demux_wdtac97(unsigned int irq,
 static void
 s3c_irq_wdtac97_mask(struct irq_data *data)
 {
-	s3c_irqsub_mask(data->irq, INTMSK_WDT, 3 << 13);
+	s3c_irqsub_mask(data, INTMSK_WDT, 3 << 13);
 }
 
 static void
 s3c_irq_wdtac97_unmask(struct irq_data *data)
 {
-	s3c_irqsub_unmask(data->irq, INTMSK_WDT);
+	s3c_irqsub_unmask(data, INTMSK_WDT);
 }
 
 static void
 s3c_irq_wdtac97_ack(struct irq_data *data)
 {
-	s3c_irqsub_maskack(data->irq, INTMSK_WDT, 3 << 13);
+	s3c_irqsub_maskack(data, INTMSK_WDT, 3 << 13);
 }
 
 static struct irq_chip s3c_irq_wdtac97 = {
arch/arm/mach-s3c24xx/irq-s3c2443.c +15 -15
index 5e69109..0d9f77a 100644
@@ -77,17 +77,17 @@ static void s3c2443_irq_demux_wdtac97(unsigned int irq, struct irq_desc *desc)
 
 static void s3c2443_irq_wdtac97_mask(struct irq_data *data)
 {
-	s3c_irqsub_mask(data->irq, INTMSK_WDTAC97, SUBMSK_WDTAC97);
+	s3c_irqsub_mask(data, INTMSK_WDTAC97, SUBMSK_WDTAC97);
 }
 
 static void s3c2443_irq_wdtac97_unmask(struct irq_data *data)
 {
-	s3c_irqsub_unmask(data->irq, INTMSK_WDTAC97);
+	s3c_irqsub_unmask(data, INTMSK_WDTAC97);
 }
 
 static void s3c2443_irq_wdtac97_ack(struct irq_data *data)
 {
-	s3c_irqsub_maskack(data->irq, INTMSK_WDTAC97, SUBMSK_WDTAC97);
+	s3c_irqsub_maskack(data, INTMSK_WDTAC97, SUBMSK_WDTAC97);
 }
 
 static struct irq_chip s3c2443_irq_wdtac97 = {
@@ -108,17 +108,17 @@ static void s3c2443_irq_demux_lcd(unsigned int irq, struct irq_desc *desc)
 
 static void s3c2443_irq_lcd_mask(struct irq_data *data)
 {
-	s3c_irqsub_mask(data->irq, INTMSK_LCD, SUBMSK_LCD);
+	s3c_irqsub_mask(data, INTMSK_LCD, SUBMSK_LCD);
 }
 
 static void s3c2443_irq_lcd_unmask(struct irq_data *data)
 {
-	s3c_irqsub_unmask(data->irq, INTMSK_LCD);
+	s3c_irqsub_unmask(data, INTMSK_LCD);
 }
 
 static void s3c2443_irq_lcd_ack(struct irq_data *data)
 {
-	s3c_irqsub_maskack(data->irq, INTMSK_LCD, SUBMSK_LCD);
+	s3c_irqsub_maskack(data, INTMSK_LCD, SUBMSK_LCD);
 }
 
 static struct irq_chip s3c2443_irq_lcd = {
@@ -139,17 +139,17 @@ static void s3c2443_irq_demux_dma(unsigned int irq, struct irq_desc *desc)
 
 static void s3c2443_irq_dma_mask(struct irq_data *data)
 {
-	s3c_irqsub_mask(data->irq, INTMSK_DMA, SUBMSK_DMA);
+	s3c_irqsub_mask(data, INTMSK_DMA, SUBMSK_DMA);
 }
 
 static void s3c2443_irq_dma_unmask(struct irq_data *data)
 {
-	s3c_irqsub_unmask(data->irq, INTMSK_DMA);
+	s3c_irqsub_unmask(data, INTMSK_DMA);
 }
 
 static void s3c2443_irq_dma_ack(struct irq_data *data)
 {
-	s3c_irqsub_maskack(data->irq, INTMSK_DMA, SUBMSK_DMA);
+	s3c_irqsub_maskack(data, INTMSK_DMA, SUBMSK_DMA);
 }
 
 static struct irq_chip s3c2443_irq_dma = {
@@ -170,17 +170,17 @@ static void s3c2443_irq_demux_uart3(unsigned int irq, struct irq_desc *desc)
 
 static void s3c2443_irq_uart3_mask(struct irq_data *data)
 {
-	s3c_irqsub_mask(data->irq, INTMSK_UART3, SUBMSK_UART3);
+	s3c_irqsub_mask(data, INTMSK_UART3, SUBMSK_UART3);
 }
 
 static void s3c2443_irq_uart3_unmask(struct irq_data *data)
 {
-	s3c_irqsub_unmask(data->irq, INTMSK_UART3);
+	s3c_irqsub_unmask(data, INTMSK_UART3);
 }
 
 static void s3c2443_irq_uart3_ack(struct irq_data *data)
 {
-	s3c_irqsub_maskack(data->irq, INTMSK_UART3, SUBMSK_UART3);
+	s3c_irqsub_maskack(data, INTMSK_UART3, SUBMSK_UART3);
 }
 
 static struct irq_chip s3c2443_irq_uart3 = {
@@ -201,17 +201,17 @@ static void s3c2443_irq_demux_cam(unsigned int irq, struct irq_desc *desc)
 
 static void s3c2443_irq_cam_mask(struct irq_data *data)
 {
-	s3c_irqsub_mask(data->irq, INTMSK_CAM, SUBMSK_CAM);
+	s3c_irqsub_mask(data, INTMSK_CAM, SUBMSK_CAM);
 }
 
 static void s3c2443_irq_cam_unmask(struct irq_data *data)
 {
-	s3c_irqsub_unmask(data->irq, INTMSK_CAM);
+	s3c_irqsub_unmask(data, INTMSK_CAM);
 }
 
 static void s3c2443_irq_cam_ack(struct irq_data *data)
 {
-	s3c_irqsub_maskack(data->irq, INTMSK_CAM, SUBMSK_CAM);
+	s3c_irqsub_maskack(data, INTMSK_CAM, SUBMSK_CAM);
 }
 
 static struct irq_chip s3c2443_irq_cam = {
arch/arm/mach-s3c24xx/irq-s3c244x.c +3 -3
index 5fe8e58..7a3f53d 100644
@@ -70,19 +70,19 @@ static void s3c_irq_demux_cam(unsigned int irq,
 static void
 s3c_irq_cam_mask(struct irq_data *data)
 {
-	s3c_irqsub_mask(data->irq, INTMSK_CAM, 3 << 11);
+	s3c_irqsub_mask(data, INTMSK_CAM, 3 << 11);
 }
 
 static void
 s3c_irq_cam_unmask(struct irq_data *data)
 {
-	s3c_irqsub_unmask(data->irq, INTMSK_CAM);
+	s3c_irqsub_unmask(data, INTMSK_CAM);
 }
 
 static void
 s3c_irq_cam_ack(struct irq_data *data)
 {
-	s3c_irqsub_maskack(data->irq, INTMSK_CAM, 3 << 11);
+	s3c_irqsub_maskack(data, INTMSK_CAM, 3 << 11);
 }
 
 static struct irq_chip s3c_irq_cam = {
arch/arm/plat-samsung/include/plat/irq.h +9 -9
index e21a89b..3ae54dc 100644
@@ -25,7 +25,7 @@
 extern struct irq_chip s3c_irq_level_chip;
 extern struct irq_chip s3c_irq_chip;
 
-static inline void s3c_irqsub_mask(unsigned int irqno,
+static inline void s3c_irqsub_mask(struct irq_data *data,
 				   unsigned int parentbit,
 				   int subcheck)
 {
@@ -35,7 +35,7 @@ static inline void s3c_irqsub_mask(unsigned int irqno,
 	submask = __raw_readl(S3C2410_INTSUBMSK);
 	mask = __raw_readl(S3C2410_INTMSK);
 
-	submask |= (1UL << (irqno - IRQ_S3CUART_RX0));
+	submask |= (1UL << (data->irq - IRQ_S3CUART_RX0));
 
 	/* check to see if we need to mask the parent IRQ */
 
@@ -47,7 +47,7 @@ static inline void s3c_irqsub_mask(unsigned int irqno,
 
 }
 
-static inline void s3c_irqsub_unmask(unsigned int irqno,
+static inline void s3c_irqsub_unmask(struct irq_data *data,
 				     unsigned int parentbit)
 {
 	unsigned long mask;
@@ -56,7 +56,7 @@ static inline void s3c_irqsub_unmask(unsigned int irqno,
 	submask = __raw_readl(S3C2410_INTSUBMSK);
 	mask = __raw_readl(S3C2410_INTMSK);
 
-	submask &= ~(1UL << (irqno - IRQ_S3CUART_RX0));
+	submask &= ~(1UL << (data->irq - IRQ_S3CUART_RX0));
 	mask &= ~parentbit;
 
 	/* write back masks */
@@ -65,13 +65,13 @@ static inline void s3c_irqsub_unmask(unsigned int irqno,
 }
 
 
-static inline void s3c_irqsub_maskack(unsigned int irqno,
+static inline void s3c_irqsub_maskack(struct irq_data *data,
 				      unsigned int parentmask,
 				      unsigned int group)
 {
-	unsigned int bit = 1UL << (irqno - IRQ_S3CUART_RX0);
+	unsigned int bit = 1UL << (data->irq - IRQ_S3CUART_RX0);
 
-	s3c_irqsub_mask(irqno, parentmask, group);
+	s3c_irqsub_mask(data, parentmask, group);
 
 	__raw_writel(bit, S3C2410_SUBSRCPND);
 
@@ -86,11 +86,11 @@ static inline void s3c_irqsub_maskack(unsigned int irqno,
 	}
 }
 
-static inline void s3c_irqsub_ack(unsigned int irqno,
+static inline void s3c_irqsub_ack(struct irq_data *data,
 				  unsigned int parentmask,
 				  unsigned int group)
 {
-	unsigned int bit = 1UL << (irqno - IRQ_S3CUART_RX0);
+	unsigned int bit = 1UL << (data->irq - IRQ_S3CUART_RX0);
 
 	__raw_writel(bit, S3C2410_SUBSRCPND);
 
drivers/irqchip/irq-s3c24xx.c +12 -12
index cf9d04d..073e614 100644
@@ -258,19 +258,19 @@ static struct irq_chip s3c_irq_eint0t4 = {
 static void
 s3c_irq_uart0_mask(struct irq_data *data)
 {
-	s3c_irqsub_mask(data->irq, INTMSK_UART0, 7);
+	s3c_irqsub_mask(data, INTMSK_UART0, 7);
 }
 
 static void
 s3c_irq_uart0_unmask(struct irq_data *data)
 {
-	s3c_irqsub_unmask(data->irq, INTMSK_UART0);
+	s3c_irqsub_unmask(data, INTMSK_UART0);
 }
 
 static void
 s3c_irq_uart0_ack(struct irq_data *data)
 {
-	s3c_irqsub_maskack(data->irq, INTMSK_UART0, 7);
+	s3c_irqsub_maskack(data, INTMSK_UART0, 7);
 }
 
 static struct irq_chip s3c_irq_uart0 = {
@@ -285,19 +285,19 @@ static struct irq_chip s3c_irq_uart0 = {
 static void
 s3c_irq_uart1_mask(struct irq_data *data)
 {
-	s3c_irqsub_mask(data->irq, INTMSK_UART1, 7 << 3);
+	s3c_irqsub_mask(data, INTMSK_UART1, 7 << 3);
 }
 
 static void
 s3c_irq_uart1_unmask(struct irq_data *data)
 {
-	s3c_irqsub_unmask(data->irq, INTMSK_UART1);
+	s3c_irqsub_unmask(data, INTMSK_UART1);
 }
 
 static void
 s3c_irq_uart1_ack(struct irq_data *data)
 {
-	s3c_irqsub_maskack(data->irq, INTMSK_UART1, 7 << 3);
+	s3c_irqsub_maskack(data, INTMSK_UART1, 7 << 3);
 }
 
 static struct irq_chip s3c_irq_uart1 = {
@@ -312,19 +312,19 @@ static struct irq_chip s3c_irq_uart1 = {
 static void
 s3c_irq_uart2_mask(struct irq_data *data)
 {
-	s3c_irqsub_mask(data->irq, INTMSK_UART2, 7 << 6);
+	s3c_irqsub_mask(data, INTMSK_UART2, 7 << 6);
 }
 
 static void
 s3c_irq_uart2_unmask(struct irq_data *data)
 {
-	s3c_irqsub_unmask(data->irq, INTMSK_UART2);
+	s3c_irqsub_unmask(data, INTMSK_UART2);
 }
 
 static void
 s3c_irq_uart2_ack(struct irq_data *data)
 {
-	s3c_irqsub_maskack(data->irq, INTMSK_UART2, 7 << 6);
+	s3c_irqsub_maskack(data, INTMSK_UART2, 7 << 6);
 }
 
 static struct irq_chip s3c_irq_uart2 = {
@@ -339,19 +339,19 @@ static struct irq_chip s3c_irq_uart2 = {
 static void
 s3c_irq_adc_mask(struct irq_data *d)
 {
-	s3c_irqsub_mask(d->irq, INTMSK_ADCPARENT, 3 << 9);
+	s3c_irqsub_mask(d, INTMSK_ADCPARENT, 3 << 9);
 }
 
 static void
 s3c_irq_adc_unmask(struct irq_data *d)
 {
-	s3c_irqsub_unmask(d->irq, INTMSK_ADCPARENT);
+	s3c_irqsub_unmask(d, INTMSK_ADCPARENT);
 }
 
 static void
 s3c_irq_adc_ack(struct irq_data *d)
 {
-	s3c_irqsub_ack(d->irq, INTMSK_ADCPARENT, 3 << 9);
+	s3c_irqsub_ack(d, INTMSK_ADCPARENT, 3 << 9);
 }
 
 static struct irq_chip s3c_irq_adc = {
Signature · 1 line
1.7.2.3
#6 lore raw

RFC PATCH 4/4 ARM: S3C24XX: First part converting irq code to use hwirq

In reply to Heiko Stübner

Use the newly introduced irq_domains to let the basic ack, mask and unmask functions use its hwirq field. This also includes the external irq sources and removes all offset calculations based on the static irq numbers from these parts.

---
 arch/arm/mach-s3c24xx/irq-pm.c           |    4 +-
 arch/arm/plat-samsung/include/plat/irq.h |    8 +-
 drivers/irqchip/irq-s3c24xx.c            |  109 ++++++++++++++++++------------
 3 files changed, 71 insertions(+), 50 deletions(-)
arch/arm/mach-s3c24xx/irq-pm.c +2 -2
index 0efb2e2..5aa7e28 100644
@@ -29,12 +29,12 @@
  * 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;
arch/arm/plat-samsung/include/plat/irq.h +4 -4
index 3ae54dc..d024d7a 100644
@@ -35,7 +35,7 @@ static inline void s3c_irqsub_mask(struct irq_data *data,
 	submask = __raw_readl(S3C2410_INTSUBMSK);
 	mask = __raw_readl(S3C2410_INTMSK);
 
-	submask |= (1UL << (data->irq - IRQ_S3CUART_RX0));
+	submask |= (1UL << data->hwirq);
 
 	/* check to see if we need to mask the parent IRQ */
 
@@ -56,7 +56,7 @@ static inline void s3c_irqsub_unmask(struct irq_data *data,
 	submask = __raw_readl(S3C2410_INTSUBMSK);
 	mask = __raw_readl(S3C2410_INTMSK);
 
-	submask &= ~(1UL << (data->irq - IRQ_S3CUART_RX0));
+	submask &= ~(1UL << data->hwirq);
 	mask &= ~parentbit;
 
 	/* write back masks */
@@ -69,7 +69,7 @@ static inline void s3c_irqsub_maskack(struct irq_data *data,
 				      unsigned int parentmask,
 				      unsigned int group)
 {
-	unsigned int bit = 1UL << (data->irq - IRQ_S3CUART_RX0);
+	unsigned int bit = 1UL << data->hwirq;
 
 	s3c_irqsub_mask(data, parentmask, group);
 
@@ -90,7 +90,7 @@ static inline void s3c_irqsub_ack(struct irq_data *data,
 				  unsigned int parentmask,
 				  unsigned int group)
 {
-	unsigned int bit = 1UL << (data->irq - IRQ_S3CUART_RX0);
+	unsigned int bit = 1UL << data->hwirq;
 
 	__raw_writel(bit, S3C2410_SUBSRCPND);
 
drivers/irqchip/irq-s3c24xx.c +65 -44

187 lines not on this page · raw message

Signature · 1 line
1.7.2.3