Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'irq-s3c24xx-for-v3.10' of git://git.kernel.org/pub/scm/linux/kernel/git/kgene/linux-samsung into next/drivers

From Kukjin Kim <kgene.kim@samsung.com>:

s3c24xx irq cleanup and move into drivers/irqchip

* tag 'irq-s3c24xx-for-v3.10' of git://git.kernel.org/pub/scm/linux/kernel/git/kgene/linux-samsung:
irqchip: s3c24xx: add devicetree support
irqchip: s3c24xx: make interrupt handling independent of irq_domain structure
irqchip: s3c24xx: globally keep track of the created intc instances
irqchip: s3c24xx: add irq_set_type callback for basic interrupt types
irqchip: s3c24xx: fix irqlist of second s3c2416 controller
irqchip: s3c24xx: fix comments on some camera interrupts
ARM: S3C24XX: move irq driver to drivers/irqchip
ARM: S3C24XX: add handle_irq function
ARM: S3C24XX: make s3c24xx_init_intc static
ARM: S3C24XX: move s3c24xx_init_irq to s3c2410_init_irq
ARM: S3C24XX: fix irq parent check
ARM: S3C24XX: fix redundant checks in the irq mapping function

Signed-off-by: Arnd Bergmann <arnd@arndb.de>

+472 -205
+53
Documentation/devicetree/bindings/interrupt-controller/samsung,s3c24xx-irq.txt
··· 1 + Samsung S3C24XX Interrupt Controllers 2 + 3 + The S3C24XX SoCs contain a custom set of interrupt controllers providing a 4 + varying number of interrupt sources. The set consists of a main- and sub- 5 + controller and on newer SoCs even a second main controller. 6 + 7 + Required properties: 8 + - compatible: Compatible property value should be "samsung,s3c2410-irq" 9 + for machines before s3c2416 and "samsung,s3c2416-irq" for s3c2416 and later. 10 + 11 + - reg: Physical base address of the controller and length of memory mapped 12 + region. 13 + 14 + - interrupt-controller : Identifies the node as an interrupt controller 15 + 16 + - #interrupt-cells : Specifies the number of cells needed to encode an 17 + interrupt source. The value shall be 4 and interrupt descriptor shall 18 + have the following format: 19 + <ctrl_num parent_irq ctrl_irq type> 20 + 21 + ctrl_num contains the controller to use: 22 + - 0 ... main controller 23 + - 1 ... sub controller 24 + - 2 ... second main controller on s3c2416 and s3c2450 25 + parent_irq contains the parent bit in the main controller and will be 26 + ignored in main controllers 27 + ctrl_irq contains the interrupt bit of the controller 28 + type contains the trigger type to use 29 + 30 + Example: 31 + 32 + interrupt-controller@4a000000 { 33 + compatible = "samsung,s3c2410-irq"; 34 + reg = <0x4a000000 0x100>; 35 + interrupt-controller; 36 + #interrupt-cells=<4>; 37 + }; 38 + 39 + [...] 40 + 41 + serial@50000000 { 42 + compatible = "samsung,s3c2410-uart"; 43 + reg = <0x50000000 0x4000>; 44 + interrupt-parent = <&subintc>; 45 + interrupts = <1 28 0 4>, <1 28 1 4>; 46 + }; 47 + 48 + rtc@57000000 { 49 + compatible = "samsung,s3c2410-rtc"; 50 + reg = <0x57000000 0x100>; 51 + interrupt-parent = <&intc>; 52 + interrupts = <0 30 0 3>, <0 8 0 3>; 53 + };
+1
arch/arm/Kconfig
··· 778 778 select HAVE_S3C2410_I2C if I2C 779 779 select HAVE_S3C2410_WATCHDOG if WATCHDOG 780 780 select HAVE_S3C_RTC if RTC_CLASS 781 + select MULTI_IRQ_HANDLER 781 782 select NEED_MACH_GPIO_H 782 783 select NEED_MACH_IO_H 783 784 help
+1 -1
arch/arm/mach-s3c24xx/Makefile
··· 14 14 15 15 # core 16 16 17 - obj-y += common.o irq.o 17 + obj-y += common.o 18 18 19 19 obj-$(CONFIG_CPU_S3C2410) += s3c2410.o 20 20 obj-$(CONFIG_S3C2410_CPUFREQ) += cpufreq-s3c2410.o
+1
arch/arm/mach-s3c24xx/common.h
··· 21 21 extern void s3c2410_init_uarts(struct s3c2410_uartcfg *cfg, int no); 22 22 extern void s3c2410_init_clocks(int xtal); 23 23 extern void s3c2410_restart(char mode, const char *cmd); 24 + extern void s3c2410_init_irq(void); 24 25 #else 25 26 #define s3c2410_init_clocks NULL 26 27 #define s3c2410_init_uarts NULL
-70
arch/arm/mach-s3c24xx/include/mach/entry-macro.S
··· 1 - /* 2 - * arch/arm/mach-s3c2410/include/mach/entry-macro.S 3 - * 4 - * Low-level IRQ helper macros for S3C2410-based platforms 5 - * 6 - * This file is licensed under the terms of the GNU General Public 7 - * License version 2. This program is licensed "as is" without any 8 - * warranty of any kind, whether express or implied. 9 - */ 10 - 11 - /* We have a problem that the INTOFFSET register does not always 12 - * show one interrupt. Occasionally we get two interrupts through 13 - * the prioritiser, and this causes the INTOFFSET register to show 14 - * what looks like the logical-or of the two interrupt numbers. 15 - * 16 - * Thanks to Klaus, Shannon, et al for helping to debug this problem 17 - */ 18 - 19 - #define INTPND (0x10) 20 - #define INTOFFSET (0x14) 21 - 22 - #include <mach/hardware.h> 23 - #include <asm/irq.h> 24 - 25 - .macro get_irqnr_preamble, base, tmp 26 - .endm 27 - 28 - .macro get_irqnr_and_base, irqnr, irqstat, base, tmp 29 - 30 - mov \base, #S3C24XX_VA_IRQ 31 - 32 - @@ try the interrupt offset register, since it is there 33 - 34 - ldr \irqstat, [\base, #INTPND ] 35 - teq \irqstat, #0 36 - beq 1002f 37 - ldr \irqnr, [\base, #INTOFFSET ] 38 - mov \tmp, #1 39 - tst \irqstat, \tmp, lsl \irqnr 40 - bne 1001f 41 - 42 - @@ the number specified is not a valid irq, so try 43 - @@ and work it out for ourselves 44 - 45 - mov \irqnr, #0 @@ start here 46 - 47 - @@ work out which irq (if any) we got 48 - 49 - movs \tmp, \irqstat, lsl#16 50 - addeq \irqnr, \irqnr, #16 51 - moveq \irqstat, \irqstat, lsr#16 52 - tst \irqstat, #0xff 53 - addeq \irqnr, \irqnr, #8 54 - moveq \irqstat, \irqstat, lsr#8 55 - tst \irqstat, #0xf 56 - addeq \irqnr, \irqnr, #4 57 - moveq \irqstat, \irqstat, lsr#4 58 - tst \irqstat, #0x3 59 - addeq \irqnr, \irqnr, #2 60 - moveq \irqstat, \irqstat, lsr#2 61 - tst \irqstat, #0x1 62 - addeq \irqnr, \irqnr, #1 63 - 64 - @@ we have the value 65 - 1001: 66 - adds \irqnr, \irqnr, #IRQ_EINT0 67 - 1002: 68 - @@ exit here, Z flag unset if IRQ 69 - 70 - .endm
+405 -118
arch/arm/mach-s3c24xx/irq.c drivers/irqchip/irq-s3c24xx.c
··· 25 25 #include <linux/ioport.h> 26 26 #include <linux/device.h> 27 27 #include <linux/irqdomain.h> 28 + #include <linux/of.h> 29 + #include <linux/of_irq.h> 30 + #include <linux/of_address.h> 28 31 32 + #include <asm/exception.h> 29 33 #include <asm/mach/irq.h> 30 34 31 35 #include <mach/regs-irq.h> ··· 39 35 #include <plat/regs-irqtype.h> 40 36 #include <plat/pm.h> 41 37 38 + #include "irqchip.h" 39 + 42 40 #define S3C_IRQTYPE_NONE 0 43 41 #define S3C_IRQTYPE_EINT 1 44 42 #define S3C_IRQTYPE_EDGE 2 ··· 48 42 49 43 struct s3c_irq_data { 50 44 unsigned int type; 45 + unsigned long offset; 51 46 unsigned long parent_irq; 52 47 53 48 /* data gets filled during init */ ··· 75 68 struct s3c_irq_data *irqs; 76 69 }; 77 70 71 + /* 72 + * Array holding pointers to the global controller structs 73 + * [0] ... main_intc 74 + * [1] ... sub_intc 75 + * [2] ... main_intc2 on s3c2416 76 + */ 77 + static struct s3c_irq_intc *s3c_intc[3]; 78 + 78 79 static void s3c_irq_mask(struct irq_data *data) 79 80 { 80 - struct s3c_irq_intc *intc = data->domain->host_data; 81 + struct s3c_irq_data *irq_data = irq_data_get_irq_chip_data(data); 82 + struct s3c_irq_intc *intc = irq_data->intc; 81 83 struct s3c_irq_intc *parent_intc = intc->parent; 82 - struct s3c_irq_data *irq_data = &intc->irqs[data->hwirq]; 83 84 struct s3c_irq_data *parent_data; 84 85 unsigned long mask; 85 86 unsigned int irqno; 86 87 87 88 mask = __raw_readl(intc->reg_mask); 88 - mask |= (1UL << data->hwirq); 89 + mask |= (1UL << irq_data->offset); 89 90 __raw_writel(mask, intc->reg_mask); 90 91 91 - if (parent_intc && irq_data->parent_irq) { 92 + if (parent_intc) { 92 93 parent_data = &parent_intc->irqs[irq_data->parent_irq]; 93 94 94 - /* check to see if we need to mask the parent IRQ */ 95 + /* check to see if we need to mask the parent IRQ 96 + * The parent_irq is always in main_intc, so the hwirq 97 + * for find_mapping does not need an offset in any case. 98 + */ 95 99 if ((mask & parent_data->sub_bits) == parent_data->sub_bits) { 96 100 irqno = irq_find_mapping(parent_intc->domain, 97 101 irq_data->parent_irq); ··· 113 95 114 96 static void s3c_irq_unmask(struct irq_data *data) 115 97 { 116 - struct s3c_irq_intc *intc = data->domain->host_data; 98 + struct s3c_irq_data *irq_data = irq_data_get_irq_chip_data(data); 99 + struct s3c_irq_intc *intc = irq_data->intc; 117 100 struct s3c_irq_intc *parent_intc = intc->parent; 118 - struct s3c_irq_data *irq_data = &intc->irqs[data->hwirq]; 119 101 unsigned long mask; 120 102 unsigned int irqno; 121 103 122 104 mask = __raw_readl(intc->reg_mask); 123 - mask &= ~(1UL << data->hwirq); 105 + mask &= ~(1UL << irq_data->offset); 124 106 __raw_writel(mask, intc->reg_mask); 125 107 126 - if (parent_intc && irq_data->parent_irq) { 108 + if (parent_intc) { 127 109 irqno = irq_find_mapping(parent_intc->domain, 128 110 irq_data->parent_irq); 129 111 s3c_irq_unmask(irq_get_irq_data(irqno)); ··· 132 114 133 115 static inline void s3c_irq_ack(struct irq_data *data) 134 116 { 135 - struct s3c_irq_intc *intc = data->domain->host_data; 136 - unsigned long bitval = 1UL << data->hwirq; 117 + struct s3c_irq_data *irq_data = irq_data_get_irq_chip_data(data); 118 + struct s3c_irq_intc *intc = irq_data->intc; 119 + unsigned long bitval = 1UL << irq_data->offset; 137 120 138 121 __raw_writel(bitval, intc->reg_pending); 139 122 if (intc->reg_intpnd) 140 123 __raw_writel(bitval, intc->reg_intpnd); 124 + } 125 + 126 + static int s3c_irq_type(struct irq_data *data, unsigned int type) 127 + { 128 + switch (type) { 129 + case IRQ_TYPE_NONE: 130 + break; 131 + case IRQ_TYPE_EDGE_RISING: 132 + case IRQ_TYPE_EDGE_FALLING: 133 + case IRQ_TYPE_EDGE_BOTH: 134 + irq_set_handler(data->irq, handle_edge_irq); 135 + break; 136 + case IRQ_TYPE_LEVEL_LOW: 137 + case IRQ_TYPE_LEVEL_HIGH: 138 + irq_set_handler(data->irq, handle_level_irq); 139 + break; 140 + default: 141 + pr_err("No such irq type %d", type); 142 + return -EINVAL; 143 + } 144 + 145 + return 0; 141 146 } 142 147 143 148 static int s3c_irqext_type_set(void __iomem *gpcon_reg, ··· 268 227 .irq_ack = s3c_irq_ack, 269 228 .irq_mask = s3c_irq_mask, 270 229 .irq_unmask = s3c_irq_unmask, 230 + .irq_set_type = s3c_irq_type, 271 231 .irq_set_wake = s3c_irq_wake 272 232 }; 273 233 ··· 277 235 .irq_mask = s3c_irq_mask, 278 236 .irq_unmask = s3c_irq_unmask, 279 237 .irq_ack = s3c_irq_ack, 238 + .irq_set_type = s3c_irq_type, 280 239 }; 281 240 282 241 static struct irq_chip s3c_irqext_chip = { ··· 301 258 static void s3c_irq_demux(unsigned int irq, struct irq_desc *desc) 302 259 { 303 260 struct irq_chip *chip = irq_desc_get_chip(desc); 304 - struct s3c_irq_intc *intc = desc->irq_data.domain->host_data; 305 - struct s3c_irq_data *irq_data = &intc->irqs[desc->irq_data.hwirq]; 261 + struct s3c_irq_data *irq_data = irq_desc_get_chip_data(desc); 262 + struct s3c_irq_intc *intc = irq_data->intc; 306 263 struct s3c_irq_intc *sub_intc = irq_data->sub_intc; 307 264 unsigned long src; 308 265 unsigned long msk; 309 266 unsigned int n; 267 + unsigned int offset; 268 + 269 + /* we're using individual domains for the non-dt case 270 + * and one big domain for the dt case where the subintc 271 + * starts at hwirq number 32. 272 + */ 273 + offset = (intc->domain->of_node) ? 32 : 0; 310 274 311 275 chained_irq_enter(chip, desc); 312 276 ··· 326 276 while (src) { 327 277 n = __ffs(src); 328 278 src &= ~(1 << n); 329 - generic_handle_irq(irq_find_mapping(sub_intc->domain, n)); 279 + irq = irq_find_mapping(sub_intc->domain, offset + n); 280 + generic_handle_irq(irq); 330 281 } 331 282 332 283 chained_irq_exit(chip, desc); 284 + } 285 + 286 + static inline int s3c24xx_handle_intc(struct s3c_irq_intc *intc, 287 + struct pt_regs *regs, int intc_offset) 288 + { 289 + int pnd; 290 + int offset; 291 + int irq; 292 + 293 + pnd = __raw_readl(intc->reg_intpnd); 294 + if (!pnd) 295 + return false; 296 + 297 + /* non-dt machines use individual domains */ 298 + if (!intc->domain->of_node) 299 + intc_offset = 0; 300 + 301 + /* We have a problem that the INTOFFSET register does not always 302 + * show one interrupt. Occasionally we get two interrupts through 303 + * the prioritiser, and this causes the INTOFFSET register to show 304 + * what looks like the logical-or of the two interrupt numbers. 305 + * 306 + * Thanks to Klaus, Shannon, et al for helping to debug this problem 307 + */ 308 + offset = __raw_readl(intc->reg_intpnd + 4); 309 + 310 + /* Find the bit manually, when the offset is wrong. 311 + * The pending register only ever contains the one bit of the next 312 + * interrupt to handle. 313 + */ 314 + if (!(pnd & (1 << offset))) 315 + offset = __ffs(pnd); 316 + 317 + irq = irq_find_mapping(intc->domain, intc_offset + offset); 318 + handle_IRQ(irq, regs); 319 + return true; 320 + } 321 + 322 + asmlinkage void __exception_irq_entry s3c24xx_handle_irq(struct pt_regs *regs) 323 + { 324 + do { 325 + if (likely(s3c_intc[0])) 326 + if (s3c24xx_handle_intc(s3c_intc[0], regs, 0)) 327 + continue; 328 + 329 + if (s3c_intc[2]) 330 + if (s3c24xx_handle_intc(s3c_intc[2], regs, 64)) 331 + continue; 332 + 333 + break; 334 + } while (1); 333 335 } 334 336 335 337 #ifdef CONFIG_FIQ ··· 426 324 struct s3c_irq_data *parent_irq_data; 427 325 unsigned int irqno; 428 326 429 - if (!intc) { 430 - pr_err("irq-s3c24xx: no controller found for hwirq %lu\n", hw); 431 - return -EINVAL; 432 - } 433 - 434 - if (!irq_data) { 435 - pr_err("irq-s3c24xx: no irq data found for hwirq %lu\n", hw); 436 - return -EINVAL; 437 - } 438 - 439 327 /* attach controller pointer to irq_data */ 440 328 irq_data->intc = intc; 329 + irq_data->offset = hw; 330 + 331 + parent_intc = intc->parent; 441 332 442 333 /* set handler and flags */ 443 334 switch (irq_data->type) { ··· 440 345 /* On the S3C2412, the EINT0to3 have a parent irq 441 346 * but need the s3c_irq_eint0t4 chip 442 347 */ 443 - if (irq_data->parent_irq && (!soc_is_s3c2412() || hw >= 4)) 348 + if (parent_intc && (!soc_is_s3c2412() || hw >= 4)) 444 349 irq_set_chip_and_handler(virq, &s3c_irqext_chip, 445 350 handle_edge_irq); 446 351 else ··· 448 353 handle_edge_irq); 449 354 break; 450 355 case S3C_IRQTYPE_EDGE: 451 - if (irq_data->parent_irq || 452 - intc->reg_pending == S3C2416_SRCPND2) 356 + if (parent_intc || intc->reg_pending == S3C2416_SRCPND2) 453 357 irq_set_chip_and_handler(virq, &s3c_irq_level_chip, 454 358 handle_edge_irq); 455 359 else ··· 456 362 handle_edge_irq); 457 363 break; 458 364 case S3C_IRQTYPE_LEVEL: 459 - if (irq_data->parent_irq) 365 + if (parent_intc) 460 366 irq_set_chip_and_handler(virq, &s3c_irq_level_chip, 461 367 handle_level_irq); 462 368 else ··· 467 373 pr_err("irq-s3c24xx: unsupported irqtype %d\n", irq_data->type); 468 374 return -EINVAL; 469 375 } 376 + 377 + irq_set_chip_data(virq, irq_data); 378 + 470 379 set_irq_flags(virq, IRQF_VALID); 471 380 472 - if (irq_data->parent_irq) { 473 - parent_intc = intc->parent; 474 - if (!parent_intc) { 475 - pr_err("irq-s3c24xx: no parent controller found for hwirq %lu\n", 476 - hw); 381 + if (parent_intc && irq_data->type != S3C_IRQTYPE_NONE) { 382 + if (irq_data->parent_irq > 31) { 383 + pr_err("irq-s3c24xx: parent irq %lu is out of range\n", 384 + irq_data->parent_irq); 477 385 goto err; 478 386 } 479 387 480 388 parent_irq_data = &parent_intc->irqs[irq_data->parent_irq]; 481 - if (!irq_data) { 482 - pr_err("irq-s3c24xx: no irq data found for hwirq %lu\n", 483 - hw); 484 - goto err; 485 - } 486 - 487 389 parent_irq_data->sub_intc = intc; 488 390 parent_irq_data->sub_bits |= (1UL << hw); 489 391 ··· 534 444 } 535 445 } 536 446 537 - struct s3c_irq_intc *s3c24xx_init_intc(struct device_node *np, 447 + static struct s3c_irq_intc *s3c24xx_init_intc(struct device_node *np, 538 448 struct s3c_irq_data *irq_data, 539 449 struct s3c_irq_intc *parent, 540 450 unsigned long address) ··· 608 518 goto err; 609 519 } 610 520 521 + set_handle_irq(s3c24xx_handle_irq); 522 + 611 523 return intc; 612 524 613 525 err: ··· 617 525 return ERR_PTR(ret); 618 526 } 619 527 620 - /* s3c24xx_init_irq 621 - * 622 - * Initialise S3C2410 IRQ system 623 - */ 528 + static struct s3c_irq_data init_eint[32] = { 529 + { .type = S3C_IRQTYPE_NONE, }, /* reserved */ 530 + { .type = S3C_IRQTYPE_NONE, }, /* reserved */ 531 + { .type = S3C_IRQTYPE_NONE, }, /* reserved */ 532 + { .type = S3C_IRQTYPE_NONE, }, /* reserved */ 533 + { .type = S3C_IRQTYPE_EINT, .parent_irq = 4 }, /* EINT4 */ 534 + { .type = S3C_IRQTYPE_EINT, .parent_irq = 4 }, /* EINT5 */ 535 + { .type = S3C_IRQTYPE_EINT, .parent_irq = 4 }, /* EINT6 */ 536 + { .type = S3C_IRQTYPE_EINT, .parent_irq = 4 }, /* EINT7 */ 537 + { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT8 */ 538 + { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT9 */ 539 + { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT10 */ 540 + { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT11 */ 541 + { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT12 */ 542 + { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT13 */ 543 + { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT14 */ 544 + { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT15 */ 545 + { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT16 */ 546 + { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT17 */ 547 + { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT18 */ 548 + { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT19 */ 549 + { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT20 */ 550 + { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT21 */ 551 + { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT22 */ 552 + { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT23 */ 553 + }; 624 554 625 - static struct s3c_irq_data init_base[32] = { 555 + #ifdef CONFIG_CPU_S3C2410 556 + static struct s3c_irq_data init_s3c2410base[32] = { 626 557 { .type = S3C_IRQTYPE_EINT, }, /* EINT0 */ 627 558 { .type = S3C_IRQTYPE_EINT, }, /* EINT1 */ 628 559 { .type = S3C_IRQTYPE_EINT, }, /* EINT2 */ ··· 680 565 { .type = S3C_IRQTYPE_LEVEL, }, /* ADCPARENT */ 681 566 }; 682 567 683 - static struct s3c_irq_data init_eint[32] = { 684 - { .type = S3C_IRQTYPE_NONE, }, /* reserved */ 685 - { .type = S3C_IRQTYPE_NONE, }, /* reserved */ 686 - { .type = S3C_IRQTYPE_NONE, }, /* reserved */ 687 - { .type = S3C_IRQTYPE_NONE, }, /* reserved */ 688 - { .type = S3C_IRQTYPE_EINT, .parent_irq = 4 }, /* EINT4 */ 689 - { .type = S3C_IRQTYPE_EINT, .parent_irq = 4 }, /* EINT5 */ 690 - { .type = S3C_IRQTYPE_EINT, .parent_irq = 4 }, /* EINT6 */ 691 - { .type = S3C_IRQTYPE_EINT, .parent_irq = 4 }, /* EINT7 */ 692 - { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT8 */ 693 - { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT9 */ 694 - { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT10 */ 695 - { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT11 */ 696 - { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT12 */ 697 - { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT13 */ 698 - { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT14 */ 699 - { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT15 */ 700 - { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT16 */ 701 - { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT17 */ 702 - { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT18 */ 703 - { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT19 */ 704 - { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT20 */ 705 - { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT21 */ 706 - { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT22 */ 707 - { .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT23 */ 708 - }; 709 - 710 - static struct s3c_irq_data init_subint[32] = { 568 + static struct s3c_irq_data init_s3c2410subint[32] = { 711 569 { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-RX */ 712 570 { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-TX */ 713 571 { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-ERR */ ··· 694 606 { .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* ADC */ 695 607 }; 696 608 697 - void __init s3c24xx_init_irq(void) 609 + void __init s3c2410_init_irq(void) 698 610 { 699 - struct s3c_irq_intc *main_intc; 700 - 701 611 #ifdef CONFIG_FIQ 702 612 init_FIQ(FIQ_START); 703 613 #endif 704 614 705 - main_intc = s3c24xx_init_intc(NULL, &init_base[0], NULL, 0x4a000000); 706 - if (IS_ERR(main_intc)) { 615 + s3c_intc[0] = s3c24xx_init_intc(NULL, &init_s3c2410base[0], NULL, 616 + 0x4a000000); 617 + if (IS_ERR(s3c_intc[0])) { 707 618 pr_err("irq: could not create main interrupt controller\n"); 708 619 return; 709 620 } 710 621 711 - s3c24xx_init_intc(NULL, &init_subint[0], main_intc, 0x4a000018); 712 - s3c24xx_init_intc(NULL, &init_eint[0], main_intc, 0x560000a4); 622 + s3c_intc[1] = s3c24xx_init_intc(NULL, &init_s3c2410subint[0], 623 + s3c_intc[0], 0x4a000018); 624 + s3c24xx_init_intc(NULL, &init_eint[0], s3c_intc[0], 0x560000a4); 713 625 } 626 + #endif 714 627 715 628 #ifdef CONFIG_CPU_S3C2412 716 629 static struct s3c_irq_data init_s3c2412base[32] = { ··· 796 707 797 708 void s3c2412_init_irq(void) 798 709 { 799 - struct s3c_irq_intc *main_intc; 800 - 801 710 pr_info("S3C2412: IRQ Support\n"); 802 711 803 712 #ifdef CONFIG_FIQ 804 713 init_FIQ(FIQ_START); 805 714 #endif 806 715 807 - main_intc = s3c24xx_init_intc(NULL, &init_s3c2412base[0], NULL, 0x4a000000); 808 - if (IS_ERR(main_intc)) { 716 + s3c_intc[0] = s3c24xx_init_intc(NULL, &init_s3c2412base[0], NULL, 717 + 0x4a000000); 718 + if (IS_ERR(s3c_intc[0])) { 809 719 pr_err("irq: could not create main interrupt controller\n"); 810 720 return; 811 721 } 812 722 813 - s3c24xx_init_intc(NULL, &init_s3c2412eint[0], main_intc, 0x560000a4); 814 - s3c24xx_init_intc(NULL, &init_s3c2412subint[0], main_intc, 0x4a000018); 723 + s3c24xx_init_intc(NULL, &init_s3c2412eint[0], s3c_intc[0], 0x560000a4); 724 + s3c_intc[1] = s3c24xx_init_intc(NULL, &init_s3c2412subint[0], 725 + s3c_intc[0], 0x4a000018); 815 726 } 816 727 #endif 817 728 ··· 885 796 886 797 static struct s3c_irq_data init_s3c2416_second[32] = { 887 798 { .type = S3C_IRQTYPE_EDGE }, /* 2D */ 888 - { .type = S3C_IRQTYPE_EDGE }, /* IIC1 */ 799 + { .type = S3C_IRQTYPE_NONE }, /* reserved */ 889 800 { .type = S3C_IRQTYPE_NONE }, /* reserved */ 890 801 { .type = S3C_IRQTYPE_NONE }, /* reserved */ 891 802 { .type = S3C_IRQTYPE_EDGE }, /* PCM0 */ 892 - { .type = S3C_IRQTYPE_EDGE }, /* PCM1 */ 803 + { .type = S3C_IRQTYPE_NONE }, /* reserved */ 893 804 { .type = S3C_IRQTYPE_EDGE }, /* I2S0 */ 894 - { .type = S3C_IRQTYPE_EDGE }, /* I2S1 */ 895 805 }; 896 806 897 807 void __init s3c2416_init_irq(void) 898 808 { 899 - struct s3c_irq_intc *main_intc; 900 - 901 809 pr_info("S3C2416: IRQ Support\n"); 902 810 903 811 #ifdef CONFIG_FIQ 904 812 init_FIQ(FIQ_START); 905 813 #endif 906 814 907 - main_intc = s3c24xx_init_intc(NULL, &init_s3c2416base[0], NULL, 0x4a000000); 908 - if (IS_ERR(main_intc)) { 815 + s3c_intc[0] = s3c24xx_init_intc(NULL, &init_s3c2416base[0], NULL, 816 + 0x4a000000); 817 + if (IS_ERR(s3c_intc[0])) { 909 818 pr_err("irq: could not create main interrupt controller\n"); 910 819 return; 911 820 } 912 821 913 - s3c24xx_init_intc(NULL, &init_eint[0], main_intc, 0x560000a4); 914 - s3c24xx_init_intc(NULL, &init_s3c2416subint[0], main_intc, 0x4a000018); 822 + s3c24xx_init_intc(NULL, &init_eint[0], s3c_intc[0], 0x560000a4); 823 + s3c_intc[1] = s3c24xx_init_intc(NULL, &init_s3c2416subint[0], 824 + s3c_intc[0], 0x4a000018); 915 825 916 - s3c24xx_init_intc(NULL, &init_s3c2416_second[0], NULL, 0x4a000040); 826 + s3c_intc[2] = s3c24xx_init_intc(NULL, &init_s3c2416_second[0], 827 + NULL, 0x4a000040); 917 828 } 918 829 919 830 #endif ··· 966 877 { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-ERR */ 967 878 { .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* TC */ 968 879 { .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* ADC */ 969 - { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 6 }, /* TC */ 970 - { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 6 }, /* ADC */ 880 + { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 6 }, /* CAM_C */ 881 + { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 6 }, /* CAM_P */ 971 882 { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 9 }, /* WDT */ 972 883 { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 9 }, /* AC97 */ 973 884 }; 974 885 975 886 void __init s3c2440_init_irq(void) 976 887 { 977 - struct s3c_irq_intc *main_intc; 978 - 979 888 pr_info("S3C2440: IRQ Support\n"); 980 889 981 890 #ifdef CONFIG_FIQ 982 891 init_FIQ(FIQ_START); 983 892 #endif 984 893 985 - main_intc = s3c24xx_init_intc(NULL, &init_s3c2440base[0], NULL, 0x4a000000); 986 - if (IS_ERR(main_intc)) { 894 + s3c_intc[0] = s3c24xx_init_intc(NULL, &init_s3c2440base[0], NULL, 895 + 0x4a000000); 896 + if (IS_ERR(s3c_intc[0])) { 987 897 pr_err("irq: could not create main interrupt controller\n"); 988 898 return; 989 899 } 990 900 991 - s3c24xx_init_intc(NULL, &init_eint[0], main_intc, 0x560000a4); 992 - s3c24xx_init_intc(NULL, &init_s3c2440subint[0], main_intc, 0x4a000018); 901 + s3c24xx_init_intc(NULL, &init_eint[0], s3c_intc[0], 0x560000a4); 902 + s3c_intc[1] = s3c24xx_init_intc(NULL, &init_s3c2440subint[0], 903 + s3c_intc[0], 0x4a000018); 993 904 } 994 905 #endif 995 906 ··· 1041 952 { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-ERR */ 1042 953 { .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* TC */ 1043 954 { .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* ADC */ 1044 - { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 6 }, /* TC */ 1045 - { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 6 }, /* ADC */ 955 + { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 6 }, /* CAM_C */ 956 + { .type = S3C_IRQTYPE_LEVEL, .parent_irq = 6 }, /* CAM_P */ 1046 957 }; 1047 958 1048 959 void __init s3c2442_init_irq(void) 1049 960 { 1050 - struct s3c_irq_intc *main_intc; 1051 - 1052 961 pr_info("S3C2442: IRQ Support\n"); 1053 962 1054 963 #ifdef CONFIG_FIQ 1055 964 init_FIQ(FIQ_START); 1056 965 #endif 1057 966 1058 - main_intc = s3c24xx_init_intc(NULL, &init_s3c2442base[0], NULL, 0x4a000000); 1059 - if (IS_ERR(main_intc)) { 967 + s3c_intc[0] = s3c24xx_init_intc(NULL, &init_s3c2442base[0], NULL, 968 + 0x4a000000); 969 + if (IS_ERR(s3c_intc[0])) { 1060 970 pr_err("irq: could not create main interrupt controller\n"); 1061 971 return; 1062 972 } 1063 973 1064 - s3c24xx_init_intc(NULL, &init_eint[0], main_intc, 0x560000a4); 1065 - s3c24xx_init_intc(NULL, &init_s3c2442subint[0], main_intc, 0x4a000018); 974 + s3c24xx_init_intc(NULL, &init_eint[0], s3c_intc[0], 0x560000a4); 975 + s3c_intc[1] = s3c24xx_init_intc(NULL, &init_s3c2442subint[0], 976 + s3c_intc[0], 0x4a000018); 1066 977 } 1067 978 #endif 1068 979 ··· 1137 1048 1138 1049 void __init s3c2443_init_irq(void) 1139 1050 { 1140 - struct s3c_irq_intc *main_intc; 1141 - 1142 1051 pr_info("S3C2443: IRQ Support\n"); 1143 1052 1144 1053 #ifdef CONFIG_FIQ 1145 1054 init_FIQ(FIQ_START); 1146 1055 #endif 1147 1056 1148 - main_intc = s3c24xx_init_intc(NULL, &init_s3c2443base[0], NULL, 0x4a000000); 1149 - if (IS_ERR(main_intc)) { 1057 + s3c_intc[0] = s3c24xx_init_intc(NULL, &init_s3c2443base[0], NULL, 1058 + 0x4a000000); 1059 + if (IS_ERR(s3c_intc[0])) { 1150 1060 pr_err("irq: could not create main interrupt controller\n"); 1151 1061 return; 1152 1062 } 1153 1063 1154 - s3c24xx_init_intc(NULL, &init_eint[0], main_intc, 0x560000a4); 1155 - s3c24xx_init_intc(NULL, &init_s3c2443subint[0], main_intc, 0x4a000018); 1064 + s3c24xx_init_intc(NULL, &init_eint[0], s3c_intc[0], 0x560000a4); 1065 + s3c_intc[1] = s3c24xx_init_intc(NULL, &init_s3c2443subint[0], 1066 + s3c_intc[0], 0x4a000018); 1156 1067 } 1068 + #endif 1069 + 1070 + #ifdef CONFIG_OF 1071 + static int s3c24xx_irq_map_of(struct irq_domain *h, unsigned int virq, 1072 + irq_hw_number_t hw) 1073 + { 1074 + unsigned int ctrl_num = hw / 32; 1075 + unsigned int intc_hw = hw % 32; 1076 + struct s3c_irq_intc *intc = s3c_intc[ctrl_num]; 1077 + struct s3c_irq_intc *parent_intc = intc->parent; 1078 + struct s3c_irq_data *irq_data = &intc->irqs[intc_hw]; 1079 + 1080 + /* attach controller pointer to irq_data */ 1081 + irq_data->intc = intc; 1082 + irq_data->offset = intc_hw; 1083 + 1084 + if (!parent_intc) 1085 + irq_set_chip_and_handler(virq, &s3c_irq_chip, handle_edge_irq); 1086 + else 1087 + irq_set_chip_and_handler(virq, &s3c_irq_level_chip, 1088 + handle_edge_irq); 1089 + 1090 + irq_set_chip_data(virq, irq_data); 1091 + 1092 + set_irq_flags(virq, IRQF_VALID); 1093 + 1094 + return 0; 1095 + } 1096 + 1097 + /* Translate our of irq notation 1098 + * format: <ctrl_num ctrl_irq parent_irq type> 1099 + */ 1100 + static int s3c24xx_irq_xlate_of(struct irq_domain *d, struct device_node *n, 1101 + const u32 *intspec, unsigned int intsize, 1102 + irq_hw_number_t *out_hwirq, unsigned int *out_type) 1103 + { 1104 + struct s3c_irq_intc *intc; 1105 + struct s3c_irq_intc *parent_intc; 1106 + struct s3c_irq_data *irq_data; 1107 + struct s3c_irq_data *parent_irq_data; 1108 + int irqno; 1109 + 1110 + if (WARN_ON(intsize < 4)) 1111 + return -EINVAL; 1112 + 1113 + if (intspec[0] > 2 || !s3c_intc[intspec[0]]) { 1114 + pr_err("controller number %d invalid\n", intspec[0]); 1115 + return -EINVAL; 1116 + } 1117 + intc = s3c_intc[intspec[0]]; 1118 + 1119 + *out_hwirq = intspec[0] * 32 + intspec[2]; 1120 + *out_type = intspec[3] & IRQ_TYPE_SENSE_MASK; 1121 + 1122 + parent_intc = intc->parent; 1123 + if (parent_intc) { 1124 + irq_data = &intc->irqs[intspec[2]]; 1125 + irq_data->parent_irq = intspec[1]; 1126 + parent_irq_data = &parent_intc->irqs[irq_data->parent_irq]; 1127 + parent_irq_data->sub_intc = intc; 1128 + parent_irq_data->sub_bits |= (1UL << intspec[2]); 1129 + 1130 + /* parent_intc is always s3c_intc[0], so no offset */ 1131 + irqno = irq_create_mapping(parent_intc->domain, intspec[1]); 1132 + if (irqno < 0) { 1133 + pr_err("irq: could not map parent interrupt\n"); 1134 + return irqno; 1135 + } 1136 + 1137 + irq_set_chained_handler(irqno, s3c_irq_demux); 1138 + } 1139 + 1140 + return 0; 1141 + } 1142 + 1143 + static struct irq_domain_ops s3c24xx_irq_ops_of = { 1144 + .map = s3c24xx_irq_map_of, 1145 + .xlate = s3c24xx_irq_xlate_of, 1146 + }; 1147 + 1148 + struct s3c24xx_irq_of_ctrl { 1149 + char *name; 1150 + unsigned long offset; 1151 + struct s3c_irq_intc **handle; 1152 + struct s3c_irq_intc **parent; 1153 + struct irq_domain_ops *ops; 1154 + }; 1155 + 1156 + static int __init s3c_init_intc_of(struct device_node *np, 1157 + struct device_node *interrupt_parent, 1158 + struct s3c24xx_irq_of_ctrl *s3c_ctrl, int num_ctrl) 1159 + { 1160 + struct s3c_irq_intc *intc; 1161 + struct s3c24xx_irq_of_ctrl *ctrl; 1162 + struct irq_domain *domain; 1163 + void __iomem *reg_base; 1164 + int i; 1165 + 1166 + reg_base = of_iomap(np, 0); 1167 + if (!reg_base) { 1168 + pr_err("irq-s3c24xx: could not map irq registers\n"); 1169 + return -EINVAL; 1170 + } 1171 + 1172 + domain = irq_domain_add_linear(np, num_ctrl * 32, 1173 + &s3c24xx_irq_ops_of, NULL); 1174 + if (!domain) { 1175 + pr_err("irq: could not create irq-domain\n"); 1176 + return -EINVAL; 1177 + } 1178 + 1179 + for (i = 0; i < num_ctrl; i++) { 1180 + ctrl = &s3c_ctrl[i]; 1181 + 1182 + pr_debug("irq: found controller %s\n", ctrl->name); 1183 + 1184 + intc = kzalloc(sizeof(struct s3c_irq_intc), GFP_KERNEL); 1185 + if (!intc) 1186 + return -ENOMEM; 1187 + 1188 + intc->domain = domain; 1189 + intc->irqs = kzalloc(sizeof(struct s3c_irq_data) * 32, 1190 + GFP_KERNEL); 1191 + if (!intc->irqs) { 1192 + kfree(intc); 1193 + return -ENOMEM; 1194 + } 1195 + 1196 + if (ctrl->parent) { 1197 + intc->reg_pending = reg_base + ctrl->offset; 1198 + intc->reg_mask = reg_base + ctrl->offset + 0x4; 1199 + 1200 + if (*(ctrl->parent)) { 1201 + intc->parent = *(ctrl->parent); 1202 + } else { 1203 + pr_warn("irq: parent of %s missing\n", 1204 + ctrl->name); 1205 + kfree(intc->irqs); 1206 + kfree(intc); 1207 + continue; 1208 + } 1209 + } else { 1210 + intc->reg_pending = reg_base + ctrl->offset; 1211 + intc->reg_mask = reg_base + ctrl->offset + 0x08; 1212 + intc->reg_intpnd = reg_base + ctrl->offset + 0x10; 1213 + } 1214 + 1215 + s3c24xx_clear_intc(intc); 1216 + s3c_intc[i] = intc; 1217 + } 1218 + 1219 + set_handle_irq(s3c24xx_handle_irq); 1220 + 1221 + return 0; 1222 + } 1223 + 1224 + static struct s3c24xx_irq_of_ctrl s3c2410_ctrl[] = { 1225 + { 1226 + .name = "intc", 1227 + .offset = 0, 1228 + }, { 1229 + .name = "subintc", 1230 + .offset = 0x18, 1231 + .parent = &s3c_intc[0], 1232 + } 1233 + }; 1234 + 1235 + int __init s3c2410_init_intc_of(struct device_node *np, 1236 + struct device_node *interrupt_parent, 1237 + struct s3c24xx_irq_of_ctrl *ctrl, int num_ctrl) 1238 + { 1239 + return s3c_init_intc_of(np, interrupt_parent, 1240 + s3c2410_ctrl, ARRAY_SIZE(s3c2410_ctrl)); 1241 + } 1242 + IRQCHIP_DECLARE(s3c2410_irq, "samsung,s3c2410-irq", s3c2410_init_intc_of); 1243 + 1244 + static struct s3c24xx_irq_of_ctrl s3c2416_ctrl[] = { 1245 + { 1246 + .name = "intc", 1247 + .offset = 0, 1248 + }, { 1249 + .name = "subintc", 1250 + .offset = 0x18, 1251 + .parent = &s3c_intc[0], 1252 + }, { 1253 + .name = "intc2", 1254 + .offset = 0x40, 1255 + } 1256 + }; 1257 + 1258 + int __init s3c2416_init_intc_of(struct device_node *np, 1259 + struct device_node *interrupt_parent, 1260 + struct s3c24xx_irq_of_ctrl *ctrl, int num_ctrl) 1261 + { 1262 + return s3c_init_intc_of(np, interrupt_parent, 1263 + s3c2416_ctrl, ARRAY_SIZE(s3c2416_ctrl)); 1264 + } 1265 + IRQCHIP_DECLARE(s3c2416_irq, "samsung,s3c2416-irq", s3c2416_init_intc_of); 1157 1266 #endif
+1 -1
arch/arm/mach-s3c24xx/mach-amlm5900.c
··· 238 238 MACHINE_START(AML_M5900, "AML_M5900") 239 239 .atag_offset = 0x100, 240 240 .map_io = amlm5900_map_io, 241 - .init_irq = s3c24xx_init_irq, 241 + .init_irq = s3c2410_init_irq, 242 242 .init_machine = amlm5900_init, 243 243 .init_time = samsung_timer_init, 244 244 .restart = s3c2410_restart,
+1 -1
arch/arm/mach-s3c24xx/mach-bast.c
··· 605 605 /* Maintainer: Ben Dooks <ben@simtec.co.uk> */ 606 606 .atag_offset = 0x100, 607 607 .map_io = bast_map_io, 608 - .init_irq = s3c24xx_init_irq, 608 + .init_irq = s3c2410_init_irq, 609 609 .init_machine = bast_init, 610 610 .init_time = samsung_timer_init, 611 611 .restart = s3c2410_restart,
+1 -6
arch/arm/mach-s3c24xx/mach-h1940.c
··· 667 667 memblock_reserve(0x30081000, 0x1000); 668 668 } 669 669 670 - static void __init h1940_init_irq(void) 671 - { 672 - s3c24xx_init_irq(); 673 - } 674 - 675 670 static void __init h1940_init(void) 676 671 { 677 672 u32 tmp; ··· 735 740 .atag_offset = 0x100, 736 741 .map_io = h1940_map_io, 737 742 .reserve = h1940_reserve, 738 - .init_irq = h1940_init_irq, 743 + .init_irq = s3c2410_init_irq, 739 744 .init_machine = h1940_init, 740 745 .init_time = samsung_timer_init, 741 746 .restart = s3c2410_restart,
+2 -2
arch/arm/mach-s3c24xx/mach-n30.c
··· 592 592 .atag_offset = 0x100, 593 593 .init_time = samsung_timer_init, 594 594 .init_machine = n30_init, 595 - .init_irq = s3c24xx_init_irq, 595 + .init_irq = s3c2410_init_irq, 596 596 .map_io = n30_map_io, 597 597 .restart = s3c2410_restart, 598 598 MACHINE_END ··· 603 603 .atag_offset = 0x100, 604 604 .init_time = samsung_timer_init, 605 605 .init_machine = n30_init, 606 - .init_irq = s3c24xx_init_irq, 606 + .init_irq = s3c2410_init_irq, 607 607 .map_io = n30_map_io, 608 608 .restart = s3c2410_restart, 609 609 MACHINE_END
+1 -1
arch/arm/mach-s3c24xx/mach-otom.c
··· 116 116 .atag_offset = 0x100, 117 117 .map_io = otom11_map_io, 118 118 .init_machine = otom11_init, 119 - .init_irq = s3c24xx_init_irq, 119 + .init_irq = s3c2410_init_irq, 120 120 .init_time = samsung_timer_init, 121 121 .restart = s3c2410_restart, 122 122 MACHINE_END
+1 -1
arch/arm/mach-s3c24xx/mach-qt2410.c
··· 343 343 MACHINE_START(QT2410, "QT2410") 344 344 .atag_offset = 0x100, 345 345 .map_io = qt2410_map_io, 346 - .init_irq = s3c24xx_init_irq, 346 + .init_irq = s3c2410_init_irq, 347 347 .init_machine = qt2410_machine_init, 348 348 .init_time = samsung_timer_init, 349 349 .restart = s3c2410_restart,
+1 -1
arch/arm/mach-s3c24xx/mach-smdk2410.c
··· 116 116 /* Maintainer: Jonas Dietsche */ 117 117 .atag_offset = 0x100, 118 118 .map_io = smdk2410_map_io, 119 - .init_irq = s3c24xx_init_irq, 119 + .init_irq = s3c2410_init_irq, 120 120 .init_machine = smdk2410_init, 121 121 .init_time = samsung_timer_init, 122 122 .restart = s3c2410_restart,
+1 -1
arch/arm/mach-s3c24xx/mach-tct_hammer.c
··· 149 149 MACHINE_START(TCT_HAMMER, "TCT_HAMMER") 150 150 .atag_offset = 0x100, 151 151 .map_io = tct_hammer_map_io, 152 - .init_irq = s3c24xx_init_irq, 152 + .init_irq = s3c2410_init_irq, 153 153 .init_machine = tct_hammer_init, 154 154 .init_time = samsung_timer_init, 155 155 .restart = s3c2410_restart,
+1 -1
arch/arm/mach-s3c24xx/mach-vr1000.c
··· 355 355 .atag_offset = 0x100, 356 356 .map_io = vr1000_map_io, 357 357 .init_machine = vr1000_init, 358 - .init_irq = s3c24xx_init_irq, 358 + .init_irq = s3c2410_init_irq, 359 359 .init_time = samsung_timer_init, 360 360 .restart = s3c2410_restart, 361 361 MACHINE_END
-1
arch/arm/plat-samsung/include/plat/cpu.h
··· 183 183 184 184 /* core initialisation functions */ 185 185 186 - extern void s3c24xx_init_irq(void); 187 186 extern void s5p_init_irq(u32 *vic, u32 num_vic); 188 187 189 188 extern void s3c24xx_init_io(struct map_desc *mach_desc, int size);
+1
drivers/irqchip/Makefile
··· 2 2 3 3 obj-$(CONFIG_ARCH_BCM2835) += irq-bcm2835.o 4 4 obj-$(CONFIG_ARCH_EXYNOS) += exynos-combiner.o 5 + obj-$(CONFIG_ARCH_S3C24XX) += irq-s3c24xx.o 5 6 obj-$(CONFIG_METAG) += irq-metag-ext.o 6 7 obj-$(CONFIG_METAG_PERFCOUNTER_IRQS) += irq-metag.o 7 8 obj-$(CONFIG_ARCH_SUNXI) += irq-sunxi.o