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

irqchip: s3c24xx: globally keep track of the created intc instances

For dt-enabled machines we want to use a big irq_domain over all controllers
and therefore need to access not only the main controllers but the
sub-controller as well.

Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>

authored by

Heiko Stuebner and committed by
Kukjin Kim
658dc8fb bd7c0da2

+50 -49
+50 -49
drivers/irqchip/irq-s3c24xx.c
··· 69 69 struct s3c_irq_data *irqs; 70 70 }; 71 71 72 + /* 73 + * Array holding pointers to the global controller structs 74 + * [0] ... main_intc 75 + * [1] ... sub_intc 76 + * [2] ... main_intc2 on s3c2416 77 + */ 78 + static struct s3c_irq_intc *s3c_intc[3]; 79 + 72 80 static void s3c_irq_mask(struct irq_data *data) 73 81 { 74 82 struct s3c_irq_intc *intc = data->domain->host_data; ··· 315 307 chained_irq_exit(chip, desc); 316 308 } 317 309 318 - static struct s3c_irq_intc *main_intc; 319 - static struct s3c_irq_intc *main_intc2; 320 - 321 310 static inline int s3c24xx_handle_intc(struct s3c_irq_intc *intc, 322 311 struct pt_regs *regs) 323 312 { ··· 350 345 asmlinkage void __exception_irq_entry s3c24xx_handle_irq(struct pt_regs *regs) 351 346 { 352 347 do { 353 - if (likely(main_intc)) 354 - if (s3c24xx_handle_intc(main_intc, regs)) 348 + if (likely(s3c_intc[0])) 349 + if (s3c24xx_handle_intc(s3c_intc[0], regs)) 355 350 continue; 356 351 357 - if (main_intc2) 358 - if (s3c24xx_handle_intc(main_intc2, regs)) 352 + if (s3c_intc[2]) 353 + if (s3c24xx_handle_intc(s3c_intc[2], regs)) 359 354 continue; 360 355 361 356 break; ··· 582 577 goto err; 583 578 } 584 579 585 - if (address == 0x4a000000) 586 - main_intc = intc; 587 - else if (address == 0x4a000040) 588 - main_intc2 = intc; 589 - 590 580 set_handle_irq(s3c24xx_handle_irq); 591 581 592 582 return intc; ··· 670 670 671 671 void __init s3c2410_init_irq(void) 672 672 { 673 - struct s3c_irq_intc *main_intc; 674 - 675 673 #ifdef CONFIG_FIQ 676 674 init_FIQ(FIQ_START); 677 675 #endif 678 676 679 - main_intc = s3c24xx_init_intc(NULL, &init_s3c2410base[0], NULL, 0x4a000000); 680 - if (IS_ERR(main_intc)) { 677 + s3c_intc[0] = s3c24xx_init_intc(NULL, &init_s3c2410base[0], NULL, 678 + 0x4a000000); 679 + if (IS_ERR(s3c_intc[0])) { 681 680 pr_err("irq: could not create main interrupt controller\n"); 682 681 return; 683 682 } 684 683 685 - s3c24xx_init_intc(NULL, &init_s3c2410subint[0], main_intc, 0x4a000018); 686 - s3c24xx_init_intc(NULL, &init_eint[0], main_intc, 0x560000a4); 684 + s3c_intc[1] = s3c24xx_init_intc(NULL, &init_s3c2410subint[0], 685 + s3c_intc[0], 0x4a000018); 686 + s3c24xx_init_intc(NULL, &init_eint[0], s3c_intc[0], 0x560000a4); 687 687 } 688 688 #endif 689 689 ··· 770 770 771 771 void s3c2412_init_irq(void) 772 772 { 773 - struct s3c_irq_intc *main_intc; 774 - 775 773 pr_info("S3C2412: IRQ Support\n"); 776 774 777 775 #ifdef CONFIG_FIQ 778 776 init_FIQ(FIQ_START); 779 777 #endif 780 778 781 - main_intc = s3c24xx_init_intc(NULL, &init_s3c2412base[0], NULL, 0x4a000000); 782 - if (IS_ERR(main_intc)) { 779 + s3c_intc[0] = s3c24xx_init_intc(NULL, &init_s3c2412base[0], NULL, 780 + 0x4a000000); 781 + if (IS_ERR(s3c_intc[0])) { 783 782 pr_err("irq: could not create main interrupt controller\n"); 784 783 return; 785 784 } 786 785 787 - s3c24xx_init_intc(NULL, &init_s3c2412eint[0], main_intc, 0x560000a4); 788 - s3c24xx_init_intc(NULL, &init_s3c2412subint[0], main_intc, 0x4a000018); 786 + s3c24xx_init_intc(NULL, &init_s3c2412eint[0], s3c_intc[0], 0x560000a4); 787 + s3c_intc[1] = s3c24xx_init_intc(NULL, &init_s3c2412subint[0], 788 + s3c_intc[0], 0x4a000018); 789 789 } 790 790 #endif 791 791 ··· 869 869 870 870 void __init s3c2416_init_irq(void) 871 871 { 872 - struct s3c_irq_intc *main_intc; 873 - 874 872 pr_info("S3C2416: IRQ Support\n"); 875 873 876 874 #ifdef CONFIG_FIQ 877 875 init_FIQ(FIQ_START); 878 876 #endif 879 877 880 - main_intc = s3c24xx_init_intc(NULL, &init_s3c2416base[0], NULL, 0x4a000000); 881 - if (IS_ERR(main_intc)) { 878 + s3c_intc[0] = s3c24xx_init_intc(NULL, &init_s3c2416base[0], NULL, 879 + 0x4a000000); 880 + if (IS_ERR(s3c_intc[0])) { 882 881 pr_err("irq: could not create main interrupt controller\n"); 883 882 return; 884 883 } 885 884 886 - s3c24xx_init_intc(NULL, &init_eint[0], main_intc, 0x560000a4); 887 - s3c24xx_init_intc(NULL, &init_s3c2416subint[0], main_intc, 0x4a000018); 885 + s3c24xx_init_intc(NULL, &init_eint[0], s3c_intc[0], 0x560000a4); 886 + s3c_intc[1] = s3c24xx_init_intc(NULL, &init_s3c2416subint[0], 887 + s3c_intc[0], 0x4a000018); 888 888 889 - s3c24xx_init_intc(NULL, &init_s3c2416_second[0], NULL, 0x4a000040); 889 + s3c_intc[2] = s3c24xx_init_intc(NULL, &init_s3c2416_second[0], 890 + NULL, 0x4a000040); 890 891 } 891 892 892 893 #endif ··· 948 947 949 948 void __init s3c2440_init_irq(void) 950 949 { 951 - struct s3c_irq_intc *main_intc; 952 - 953 950 pr_info("S3C2440: IRQ Support\n"); 954 951 955 952 #ifdef CONFIG_FIQ 956 953 init_FIQ(FIQ_START); 957 954 #endif 958 955 959 - main_intc = s3c24xx_init_intc(NULL, &init_s3c2440base[0], NULL, 0x4a000000); 960 - if (IS_ERR(main_intc)) { 956 + s3c_intc[0] = s3c24xx_init_intc(NULL, &init_s3c2440base[0], NULL, 957 + 0x4a000000); 958 + if (IS_ERR(s3c_intc[0])) { 961 959 pr_err("irq: could not create main interrupt controller\n"); 962 960 return; 963 961 } 964 962 965 - s3c24xx_init_intc(NULL, &init_eint[0], main_intc, 0x560000a4); 966 - s3c24xx_init_intc(NULL, &init_s3c2440subint[0], main_intc, 0x4a000018); 963 + s3c24xx_init_intc(NULL, &init_eint[0], s3c_intc[0], 0x560000a4); 964 + s3c_intc[1] = s3c24xx_init_intc(NULL, &init_s3c2440subint[0], 965 + s3c_intc[0], 0x4a000018); 967 966 } 968 967 #endif 969 968 ··· 1021 1020 1022 1021 void __init s3c2442_init_irq(void) 1023 1022 { 1024 - struct s3c_irq_intc *main_intc; 1025 - 1026 1023 pr_info("S3C2442: IRQ Support\n"); 1027 1024 1028 1025 #ifdef CONFIG_FIQ 1029 1026 init_FIQ(FIQ_START); 1030 1027 #endif 1031 1028 1032 - main_intc = s3c24xx_init_intc(NULL, &init_s3c2442base[0], NULL, 0x4a000000); 1033 - if (IS_ERR(main_intc)) { 1029 + s3c_intc[0] = s3c24xx_init_intc(NULL, &init_s3c2442base[0], NULL, 1030 + 0x4a000000); 1031 + if (IS_ERR(s3c_intc[0])) { 1034 1032 pr_err("irq: could not create main interrupt controller\n"); 1035 1033 return; 1036 1034 } 1037 1035 1038 - s3c24xx_init_intc(NULL, &init_eint[0], main_intc, 0x560000a4); 1039 - s3c24xx_init_intc(NULL, &init_s3c2442subint[0], main_intc, 0x4a000018); 1036 + s3c24xx_init_intc(NULL, &init_eint[0], s3c_intc[0], 0x560000a4); 1037 + s3c_intc[1] = s3c24xx_init_intc(NULL, &init_s3c2442subint[0], 1038 + s3c_intc[0], 0x4a000018); 1040 1039 } 1041 1040 #endif 1042 1041 ··· 1111 1110 1112 1111 void __init s3c2443_init_irq(void) 1113 1112 { 1114 - struct s3c_irq_intc *main_intc; 1115 - 1116 1113 pr_info("S3C2443: IRQ Support\n"); 1117 1114 1118 1115 #ifdef CONFIG_FIQ 1119 1116 init_FIQ(FIQ_START); 1120 1117 #endif 1121 1118 1122 - main_intc = s3c24xx_init_intc(NULL, &init_s3c2443base[0], NULL, 0x4a000000); 1123 - if (IS_ERR(main_intc)) { 1119 + s3c_intc[0] = s3c24xx_init_intc(NULL, &init_s3c2443base[0], NULL, 1120 + 0x4a000000); 1121 + if (IS_ERR(s3c_intc[0])) { 1124 1122 pr_err("irq: could not create main interrupt controller\n"); 1125 1123 return; 1126 1124 } 1127 1125 1128 - s3c24xx_init_intc(NULL, &init_eint[0], main_intc, 0x560000a4); 1129 - s3c24xx_init_intc(NULL, &init_s3c2443subint[0], main_intc, 0x4a000018); 1126 + s3c24xx_init_intc(NULL, &init_eint[0], s3c_intc[0], 0x560000a4); 1127 + s3c_intc[1] = s3c24xx_init_intc(NULL, &init_s3c2443subint[0], 1128 + s3c_intc[0], 0x4a000018); 1130 1129 } 1131 1130 #endif