SMDKV210 has 4 VICs. Use the device tree to get the virtual and
physical address and the bit mask for the populted IRQ on each
VIC.
The DT probing of VIC is moved to a seperate file which gets compiled
only if device tree support is enabled

Signed-off-by: Shaju Abraham <[email protected]>
---
 arch/arm/mach-s5pv210/cpu.c              |    3 +-
 arch/arm/mach-s5pv210/mach-smdkv210_dt.c |    9 +++-
 arch/arm/plat-s5p/Makefile               |    4 +
 arch/arm/plat-s5p/irq_dt.c               |   98 ++++++++++++++++++++++++++++++
 4 files changed, 112 insertions(+), 2 deletions(-)
 create mode 100644 arch/arm/plat-s5p/irq_dt.c

diff --git a/arch/arm/mach-s5pv210/cpu.c b/arch/arm/mach-s5pv210/cpu.c
index 411a4a9..94165b7 100644
--- a/arch/arm/mach-s5pv210/cpu.c
+++ b/arch/arm/mach-s5pv210/cpu.c
@@ -103,6 +103,7 @@ void __init s5pv210_init_clocks(int xtal)
        s5pv210_setup_clocks();
 }
 
+#ifndef CONFIG_USE_OF
 void __init s5pv210_init_irq(void)
 {
        u32 vic[4];     /* S5PV210 supports 4 VIC */
@@ -115,7 +116,7 @@ void __init s5pv210_init_irq(void)
 
        s5p_init_irq(vic, ARRAY_SIZE(vic));
 }
-
+#endif
 struct sysdev_class s5pv210_sysclass = {
        .name   = "s5pv210-core",
 };
diff --git a/arch/arm/mach-s5pv210/mach-smdkv210_dt.c 
b/arch/arm/mach-s5pv210/mach-smdkv210_dt.c
index 679401b..d0e930c 100644
--- a/arch/arm/mach-s5pv210/mach-smdkv210_dt.c
+++ b/arch/arm/mach-s5pv210/mach-smdkv210_dt.c
@@ -41,6 +41,7 @@
 #include <plat/ts.h>
 
 
+extern void s5p_dt_init_irq(void);
 
 /* Following are default values for UCON, ULCON and UFCON UART registers */
 #define SMDKV210_UCON_DEFAULT  (S3C2410_UCON_TXILEVEL |        \
@@ -88,6 +89,12 @@ static struct s3c2410_uartcfg smdkv210_uartcfgs[] __initdata 
= {
 };
 
 
+void __init s5pv210_dt_init_irq(void)
+{
+       s5p_dt_init_irq();
+}
+
+
 
 static void __init smdkv210_map_io(void)
 {
@@ -114,7 +121,7 @@ static int __init smdkv210_dt_probe(unsigned long dt)
 DT_MACHINE_START(SMDKV210, "SMDKV210 (Device Tree Support)")
        .boot_params    = 0x00000100,
        .map_io         = smdkv210_map_io,
-       .init_irq       = s5pv210_init_irq,
+       .init_irq       = s5pv210_dt_init_irq,
        .init_machine   = smdkv210_dt_init,
        .timer          = &s3c24xx_timer,
        .probe_dt       = smdkv210_dt_probe,
diff --git a/arch/arm/plat-s5p/Makefile b/arch/arm/plat-s5p/Makefile
index cdfb78d..e4d7218 100644
--- a/arch/arm/plat-s5p/Makefile
+++ b/arch/arm/plat-s5p/Makefile
@@ -16,6 +16,10 @@ obj-y                                += dev-uart.o
 obj-y                          += cpu.o
 obj-$(CONFIG_USE_NONCOMMON_STRUCT_CLK) += clock.o
 obj-$(CONFIG_USE_COMMON_STRUCT_CLK)            += clock-common-clk.o
+ifeq ($(CONFIG_USE_OF),y)
+obj-y                          += irq_dt.o
+else
 obj-y                          += irq.o
+endif
 obj-$(CONFIG_S5P_EXT_INT)      += irq-eint.o
 
diff --git a/arch/arm/plat-s5p/irq_dt.c b/arch/arm/plat-s5p/irq_dt.c
new file mode 100644
index 0000000..2fca196
--- /dev/null
+++ b/arch/arm/plat-s5p/irq_dt.c
@@ -0,0 +1,98 @@
+/* arch/arm/plat-s5p/irq_dt.c
+ *
+ * Copyright (c) 2009 Samsung Electronics Co., Ltd.
+ *             http://www.samsung.com/
+ *
+ * S5P - Interrupt handling
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+*/
+
+#include <linux/kernel.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <linux/io.h>
+#include <linux/of.h>
+#include <linux/of_fdt.h>
+#include <linux/of_platform.h>
+#include <linux/of_address.h>
+
+
+#include <asm/hardware/vic.h>
+
+#include <linux/serial_core.h>
+#include <mach/map.h>
+#include <plat/regs-timer.h>
+#include <plat/regs-serial.h>
+#include <plat/cpu.h>
+#include <plat/irq-vic-timer.h>
+#include <plat/irq-uart.h>
+
+/*
+ * Note, we make use of the fact that the parent IRQs, IRQ_UART[0..3]
+ * are consecutive when looking up the interrupt in the demux routines.
+ */
+static struct s3c_uart_irq uart_irqs[] = {
+       [0] = {
+               .regs           = S5P_VA_UART0,
+               .base_irq       = IRQ_S5P_UART_BASE0,
+               .parent_irq     = IRQ_UART0,
+       },
+       [1] = {
+               .regs           = S5P_VA_UART1,
+               .base_irq       = IRQ_S5P_UART_BASE1,
+               .parent_irq     = IRQ_UART1,
+       },
+       [2] = {
+               .regs           = S5P_VA_UART2,
+               .base_irq       = IRQ_S5P_UART_BASE2,
+               .parent_irq     = IRQ_UART2,
+       },
+#if CONFIG_SERIAL_SAMSUNG_UARTS > 3
+       [3] = {
+               .regs           = S5P_VA_UART3,
+               .base_irq       = IRQ_S5P_UART_BASE3,
+               .parent_irq     = IRQ_UART3,
+       },
+#endif
+};
+
+
+static int __init s5p_dt_vic_init(void)
+{
+       struct device_node *node;
+       struct resource r;
+       int err = -ENODEV , irq = 0;
+       const u32 *prop;
+       u32 virt_reg = 0, src_mask = 0;
+
+       for_each_compatible_node(node , NULL  , "arm,vic") {
+               err = of_address_to_resource(node, 0 , &r);
+               prop = of_get_property(node, "virtual-reg" , NULL);
+               if (prop)
+                       virt_reg = of_read_number(prop, 1);
+               prop = of_get_property(node, "irq-src", NULL);
+               if (prop)
+                       src_mask = of_read_number(prop, 1);
+               vic_init((void __iomem __force *) virt_reg, VIC_BASE(irq), 
src_mask, 0);
+               irq++;
+       }
+       of_node_put(node);
+       return err;
+}
+
+void __init s5p_dt_init_irq(void)
+{
+
+       /* initialize the VICs */
+       s5p_dt_vic_init();
+       s3c_init_vic_timer_irq(IRQ_TIMER0_VIC, IRQ_TIMER0);
+       s3c_init_vic_timer_irq(IRQ_TIMER1_VIC, IRQ_TIMER1);
+       s3c_init_vic_timer_irq(IRQ_TIMER2_VIC, IRQ_TIMER2);
+       s3c_init_vic_timer_irq(IRQ_TIMER3_VIC, IRQ_TIMER3);
+       s3c_init_vic_timer_irq(IRQ_TIMER4_VIC, IRQ_TIMER4);
+
+       s3c_init_uart_irqs(uart_irqs, ARRAY_SIZE(uart_irqs));
+}
-- 
1.7.2

_______________________________________________
devicetree-discuss mailing list
[email protected]
https://lists.ozlabs.org/listinfo/devicetree-discuss

Reply via email to