aboutsummaryrefslogtreecommitdiffstats
path: root/arch/c6x
diff options
context:
space:
mode:
authorMark Salter <msalter@redhat.com>2012-07-18 23:49:40 -0400
committerMark Salter <msalter@redhat.com>2012-07-18 23:49:40 -0400
commitf84f1f462bfaf0e45511f97ef54068b8539a7af6 (patch)
treeb6013fba89b6cf8af72b58e3a97a7f4556c5a1c2 /arch/c6x
parentb3f89562100ad7d8deecc5a97ac74db7708c1bba (diff)
C6X: remove dependence on legacy IRQs
The core priority PIC code uses legacy irq support to facilitate direct mapping of core hw interrupt numbers to linux interrupt numbers. This patch removes the legacy irq usage and replaces it with a generic linear mapping. Signed-off-by: Mark Salter <msalter@redhat.com>
Diffstat (limited to 'arch/c6x')
-rw-r--r--arch/c6x/include/asm/irq.h2
-rw-r--r--arch/c6x/kernel/irq.c21
2 files changed, 10 insertions, 13 deletions
diff --git a/arch/c6x/include/asm/irq.h b/arch/c6x/include/asm/irq.h
index ab4577f93d96..1324e62bd4ef 100644
--- a/arch/c6x/include/asm/irq.h
+++ b/arch/c6x/include/asm/irq.h
@@ -34,8 +34,6 @@
34 */ 34 */
35#define NR_PRIORITY_IRQS 16 35#define NR_PRIORITY_IRQS 16
36 36
37#define NR_IRQS_LEGACY NR_PRIORITY_IRQS
38
39/* Total number of virq in the platform */ 37/* Total number of virq in the platform */
40#define NR_IRQS 256 38#define NR_IRQS 256
41 39
diff --git a/arch/c6x/kernel/irq.c b/arch/c6x/kernel/irq.c
index c90fb5e82ad7..247e0eb5e467 100644
--- a/arch/c6x/kernel/irq.c
+++ b/arch/c6x/kernel/irq.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * Copyright (C) 2011 Texas Instruments Incorporated 2 * Copyright (C) 2011-2012 Texas Instruments Incorporated
3 * 3 *
4 * This borrows heavily from powerpc version, which is: 4 * This borrows heavily from powerpc version, which is:
5 * 5 *
@@ -35,9 +35,7 @@ static DEFINE_RAW_SPINLOCK(core_irq_lock);
35 35
36static void mask_core_irq(struct irq_data *data) 36static void mask_core_irq(struct irq_data *data)
37{ 37{
38 unsigned int prio = data->irq; 38 unsigned int prio = data->hwirq;
39
40 BUG_ON(prio < 4 || prio >= NR_PRIORITY_IRQS);
41 39
42 raw_spin_lock(&core_irq_lock); 40 raw_spin_lock(&core_irq_lock);
43 and_creg(IER, ~(1 << prio)); 41 and_creg(IER, ~(1 << prio));
@@ -46,7 +44,7 @@ static void mask_core_irq(struct irq_data *data)
46 44
47static void unmask_core_irq(struct irq_data *data) 45static void unmask_core_irq(struct irq_data *data)
48{ 46{
49 unsigned int prio = data->irq; 47 unsigned int prio = data->hwirq;
50 48
51 raw_spin_lock(&core_irq_lock); 49 raw_spin_lock(&core_irq_lock);
52 or_creg(IER, 1 << prio); 50 or_creg(IER, 1 << prio);
@@ -59,15 +57,15 @@ static struct irq_chip core_chip = {
59 .irq_unmask = unmask_core_irq, 57 .irq_unmask = unmask_core_irq,
60}; 58};
61 59
60static int prio_to_virq[NR_PRIORITY_IRQS];
61
62asmlinkage void c6x_do_IRQ(unsigned int prio, struct pt_regs *regs) 62asmlinkage void c6x_do_IRQ(unsigned int prio, struct pt_regs *regs)
63{ 63{
64 struct pt_regs *old_regs = set_irq_regs(regs); 64 struct pt_regs *old_regs = set_irq_regs(regs);
65 65
66 irq_enter(); 66 irq_enter();
67 67
68 BUG_ON(prio < 4 || prio >= NR_PRIORITY_IRQS); 68 generic_handle_irq(prio_to_virq[prio]);
69
70 generic_handle_irq(prio);
71 69
72 irq_exit(); 70 irq_exit();
73 71
@@ -82,6 +80,8 @@ static int core_domain_map(struct irq_domain *h, unsigned int virq,
82 if (hw < 4 || hw >= NR_PRIORITY_IRQS) 80 if (hw < 4 || hw >= NR_PRIORITY_IRQS)
83 return -EINVAL; 81 return -EINVAL;
84 82
83 prio_to_virq[hw] = virq;
84
85 irq_set_status_flags(virq, IRQ_LEVEL); 85 irq_set_status_flags(virq, IRQ_LEVEL);
86 irq_set_chip_and_handler(virq, &core_chip, handle_level_irq); 86 irq_set_chip_and_handler(virq, &core_chip, handle_level_irq);
87 return 0; 87 return 0;
@@ -102,9 +102,8 @@ void __init init_IRQ(void)
102 np = of_find_compatible_node(NULL, NULL, "ti,c64x+core-pic"); 102 np = of_find_compatible_node(NULL, NULL, "ti,c64x+core-pic");
103 if (np != NULL) { 103 if (np != NULL) {
104 /* create the core host */ 104 /* create the core host */
105 core_domain = irq_domain_add_legacy(np, NR_PRIORITY_IRQS, 105 core_domain = irq_domain_add_linear(np, NR_PRIORITY_IRQS,
106 0, 0, &core_domain_ops, 106 &core_domain_ops, NULL);
107 NULL);
108 if (core_domain) 107 if (core_domain)
109 irq_set_default_host(core_domain); 108 irq_set_default_host(core_domain);
110 of_node_put(np); 109 of_node_put(np);