37
37
#include <mach/regs-pmu.h>
38
38
#include <mach/regs-gpio.h>
39
39
#include <mach/pmu.h>
40
+ #include <mach/irqs.h>
40
41
41
42
#include <plat/cpu.h>
42
43
#include <plat/clock.h>
@@ -496,6 +497,7 @@ struct combiner_chip_data {
496
497
unsigned int irq_offset ;
497
498
unsigned int irq_mask ;
498
499
void __iomem * base ;
500
+ unsigned int parent_irq ;
499
501
};
500
502
501
503
static struct irq_domain * combiner_irq_domain ;
@@ -552,35 +554,59 @@ static void combiner_handle_cascade_irq(unsigned int irq, struct irq_desc *desc)
552
554
chained_irq_exit (chip , desc );
553
555
}
554
556
557
+ #ifdef CONFIG_SMP
558
+ static int combiner_set_affinity (struct irq_data * d ,
559
+ const struct cpumask * mask_val , bool force )
560
+ {
561
+ struct combiner_chip_data * chip_data = irq_data_get_irq_chip_data (d );
562
+ struct irq_chip * chip = irq_get_chip (chip_data -> parent_irq );
563
+ struct irq_data * data = irq_get_irq_data (chip_data -> parent_irq );
564
+
565
+ if (chip && chip -> irq_set_affinity )
566
+ return chip -> irq_set_affinity (data , mask_val , force );
567
+ else
568
+ return - EINVAL ;
569
+ }
570
+ #endif
571
+
555
572
static struct irq_chip combiner_chip = {
556
573
.name = "COMBINER" ,
557
574
.irq_mask = combiner_mask_irq ,
558
575
.irq_unmask = combiner_unmask_irq ,
576
+ #ifdef CONFIG_SMP
577
+ .irq_set_affinity = combiner_set_affinity ,
578
+ #endif
559
579
};
560
580
561
- static void __init combiner_cascade_irq ( unsigned int combiner_nr , unsigned int irq )
581
+ static unsigned int max_combiner_nr ( void )
562
582
{
563
- unsigned int max_nr ;
564
-
565
583
if (soc_is_exynos5250 ())
566
- max_nr = EXYNOS5_MAX_COMBINER_NR ;
584
+ return EXYNOS5_MAX_COMBINER_NR ;
585
+ else if (soc_is_exynos4412 ())
586
+ return EXYNOS4412_MAX_COMBINER_NR ;
587
+ else if (soc_is_exynos4212 ())
588
+ return EXYNOS4212_MAX_COMBINER_NR ;
567
589
else
568
- max_nr = EXYNOS4_MAX_COMBINER_NR ;
590
+ return EXYNOS4210_MAX_COMBINER_NR ;
591
+ }
569
592
570
- if (combiner_nr >= max_nr )
593
+ static void __init combiner_cascade_irq (unsigned int combiner_nr , unsigned int irq )
594
+ {
595
+ if (combiner_nr >= max_combiner_nr ())
571
596
BUG ();
572
597
if (irq_set_handler_data (irq , & combiner_data [combiner_nr ]) != 0 )
573
598
BUG ();
574
599
irq_set_chained_handler (irq , combiner_handle_cascade_irq );
575
600
}
576
601
577
602
static void __init combiner_init_one (unsigned int combiner_nr ,
578
- void __iomem * base )
603
+ void __iomem * base , unsigned int irq )
579
604
{
580
605
combiner_data [combiner_nr ].base = base ;
581
606
combiner_data [combiner_nr ].irq_offset = irq_find_mapping (
582
607
combiner_irq_domain , combiner_nr * MAX_IRQ_IN_COMBINER );
583
608
combiner_data [combiner_nr ].irq_mask = 0xff << ((combiner_nr % 4 ) << 3 );
609
+ combiner_data [combiner_nr ].parent_irq = irq ;
584
610
585
611
/* Disable all interrupts */
586
612
__raw_writel (combiner_data [combiner_nr ].irq_mask ,
@@ -631,22 +657,36 @@ static struct irq_domain_ops combiner_irq_domain_ops = {
631
657
.map = combiner_irq_domain_map ,
632
658
};
633
659
660
+ static unsigned int exynos4x12_combiner_extra_irq (int group )
661
+ {
662
+ switch (group ) {
663
+ case 16 :
664
+ return IRQ_SPI (107 );
665
+ case 17 :
666
+ return IRQ_SPI (108 );
667
+ case 18 :
668
+ return IRQ_SPI (48 );
669
+ case 19 :
670
+ return IRQ_SPI (42 );
671
+ default :
672
+ return 0 ;
673
+ }
674
+ }
675
+
634
676
static void __init combiner_init (void __iomem * combiner_base ,
635
677
struct device_node * np )
636
678
{
637
679
int i , irq , irq_base ;
638
680
unsigned int max_nr , nr_irq ;
639
681
682
+ max_nr = max_combiner_nr ();
683
+
640
684
if (np ) {
641
685
if (of_property_read_u32 (np , "samsung,combiner-nr" , & max_nr )) {
642
686
pr_warning ("%s: number of combiners not specified, "
643
687
"setting default as %d.\n" ,
644
- __func__ , EXYNOS4_MAX_COMBINER_NR );
645
- max_nr = EXYNOS4_MAX_COMBINER_NR ;
688
+ __func__ , max_nr );
646
689
}
647
- } else {
648
- max_nr = soc_is_exynos5250 () ? EXYNOS5_MAX_COMBINER_NR :
649
- EXYNOS4_MAX_COMBINER_NR ;
650
690
}
651
691
nr_irq = max_nr * MAX_IRQ_IN_COMBINER ;
652
692
@@ -664,13 +704,16 @@ static void __init combiner_init(void __iomem *combiner_base,
664
704
}
665
705
666
706
for (i = 0 ; i < max_nr ; i ++ ) {
667
- combiner_init_one (i , combiner_base + (i >> 2 ) * 0x10 );
668
- irq = IRQ_SPI (i );
707
+ if (i < EXYNOS4210_MAX_COMBINER_NR || soc_is_exynos5250 ())
708
+ irq = IRQ_SPI (i );
709
+ else
710
+ irq = exynos4x12_combiner_extra_irq (i );
669
711
#ifdef CONFIG_OF
670
712
if (np )
671
713
irq = irq_of_parse_and_map (np , i );
672
714
#endif
673
715
combiner_cascade_irq (i , irq );
716
+ combiner_init_one (i , combiner_base + (i >> 2 ) * 0x10 , irq );
674
717
}
675
718
}
676
719
@@ -1143,3 +1186,30 @@ static int __init exynos_init_irq_eint(void)
1143
1186
return 0 ;
1144
1187
}
1145
1188
arch_initcall (exynos_init_irq_eint );
1189
+
1190
+ static struct resource exynos4_pmu_resource [] = {
1191
+ DEFINE_RES_IRQ (EXYNOS4_IRQ_PMU ),
1192
+ DEFINE_RES_IRQ (EXYNOS4_IRQ_PMU_CPU1 ),
1193
+ #if defined(CONFIG_SOC_EXYNOS4412 )
1194
+ DEFINE_RES_IRQ (EXYNOS4_IRQ_PMU_CPU2 ),
1195
+ DEFINE_RES_IRQ (EXYNOS4_IRQ_PMU_CPU3 ),
1196
+ #endif
1197
+ };
1198
+
1199
+ static struct platform_device exynos4_device_pmu = {
1200
+ .name = "arm-pmu" ,
1201
+ .num_resources = ARRAY_SIZE (exynos4_pmu_resource ),
1202
+ .resource = exynos4_pmu_resource ,
1203
+ };
1204
+
1205
+ static int __init exynos_armpmu_init (void )
1206
+ {
1207
+ if (!of_have_populated_dt ()) {
1208
+ if (soc_is_exynos4210 () || soc_is_exynos4212 ())
1209
+ exynos4_device_pmu .num_resources = 2 ;
1210
+ platform_device_register (& exynos4_device_pmu );
1211
+ }
1212
+
1213
+ return 0 ;
1214
+ }
1215
+ arch_initcall (exynos_armpmu_init );
0 commit comments