~ubuntu-branches/ubuntu/precise/linux-ti-omap4/precise

« back to all changes in this revision

Viewing changes to arch/xtensa/kernel/irq.c

  • Committer: Bazaar Package Importer
  • Author(s): Paolo Pisati
  • Date: 2011-06-29 15:23:51 UTC
  • mfrom: (26.1.1 natty-proposed)
  • Revision ID: james.westby@ubuntu.com-20110629152351-xs96tm303d95rpbk
Tags: 3.0.0-1200.2
* Rebased against 3.0.0-6.7
* BSP from TI based on 3.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
35
35
asmlinkage void do_IRQ(int irq, struct pt_regs *regs)
36
36
{
37
37
        struct pt_regs *old_regs = set_irq_regs(regs);
38
 
        struct irq_desc *desc = irq_desc + irq;
39
38
 
40
39
        if (irq >= NR_IRQS) {
41
40
                printk(KERN_EMERG "%s: cannot handle IRQ %d\n",
57
56
                               sp - sizeof(struct thread_info));
58
57
        }
59
58
#endif
60
 
        desc->handle_irq(irq, desc);
 
59
        generic_handle_irq(irq);
61
60
 
62
61
        irq_exit();
63
62
        set_irq_regs(old_regs);
64
63
}
65
64
 
66
 
/*
67
 
 * Generic, controller-independent functions:
68
 
 */
69
 
 
70
 
int show_interrupts(struct seq_file *p, void *v)
 
65
int arch_show_interrupts(struct seq_file *p, int prec)
71
66
{
72
 
        int i = *(loff_t *) v, j;
73
 
        struct irqaction * action;
74
 
        unsigned long flags;
75
 
 
76
 
        if (i == 0) {
77
 
                seq_printf(p, "           ");
78
 
                for_each_online_cpu(j)
79
 
                        seq_printf(p, "CPU%d       ",j);
80
 
                seq_putc(p, '\n');
81
 
        }
82
 
 
83
 
        if (i < NR_IRQS) {
84
 
                raw_spin_lock_irqsave(&irq_desc[i].lock, flags);
85
 
                action = irq_desc[i].action;
86
 
                if (!action)
87
 
                        goto skip;
88
 
                seq_printf(p, "%3d: ",i);
89
 
#ifndef CONFIG_SMP
90
 
                seq_printf(p, "%10u ", kstat_irqs(i));
91
 
#else
92
 
                for_each_online_cpu(j)
93
 
                        seq_printf(p, "%10u ", kstat_irqs_cpu(i, j));
94
 
#endif
95
 
                seq_printf(p, " %14s", irq_desc[i].chip->name);
96
 
                seq_printf(p, "  %s", action->name);
97
 
 
98
 
                for (action=action->next; action; action = action->next)
99
 
                        seq_printf(p, ", %s", action->name);
100
 
 
101
 
                seq_putc(p, '\n');
102
 
skip:
103
 
                raw_spin_unlock_irqrestore(&irq_desc[i].lock, flags);
104
 
        } else if (i == NR_IRQS) {
105
 
                seq_printf(p, "NMI: ");
106
 
                for_each_online_cpu(j)
107
 
                        seq_printf(p, "%10u ", nmi_count(j));
108
 
                seq_putc(p, '\n');
109
 
                seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
110
 
        }
 
67
        seq_printf(p, "%*s: ", prec, "ERR");
 
68
        seq_printf(p, "%10u\n", atomic_read(&irq_err_count));
111
69
        return 0;
112
70
}
113
71
 
114
 
static void xtensa_irq_mask(unsigned int irq)
115
 
{
116
 
        cached_irq_mask &= ~(1 << irq);
117
 
        set_sr (cached_irq_mask, INTENABLE);
118
 
}
119
 
 
120
 
static void xtensa_irq_unmask(unsigned int irq)
121
 
{
122
 
        cached_irq_mask |= 1 << irq;
123
 
        set_sr (cached_irq_mask, INTENABLE);
124
 
}
125
 
 
126
 
static void xtensa_irq_enable(unsigned int irq)
127
 
{
128
 
        variant_irq_enable(irq);
129
 
        xtensa_irq_unmask(irq);
130
 
}
131
 
 
132
 
static void xtensa_irq_disable(unsigned int irq)
133
 
{
134
 
        xtensa_irq_mask(irq);
135
 
        variant_irq_disable(irq);
136
 
}
137
 
 
138
 
static void xtensa_irq_ack(unsigned int irq)
139
 
{
140
 
        set_sr(1 << irq, INTCLEAR);
141
 
}
142
 
 
143
 
static int xtensa_irq_retrigger(unsigned int irq)
144
 
{
145
 
        set_sr (1 << irq, INTSET);
 
72
static void xtensa_irq_mask(struct irq_data *d)
 
73
{
 
74
        cached_irq_mask &= ~(1 << d->irq);
 
75
        set_sr (cached_irq_mask, INTENABLE);
 
76
}
 
77
 
 
78
static void xtensa_irq_unmask(struct irq_data *d)
 
79
{
 
80
        cached_irq_mask |= 1 << d->irq;
 
81
        set_sr (cached_irq_mask, INTENABLE);
 
82
}
 
83
 
 
84
static void xtensa_irq_enable(struct irq_data *d)
 
85
{
 
86
        variant_irq_enable(d->irq);
 
87
        xtensa_irq_unmask(d->irq);
 
88
}
 
89
 
 
90
static void xtensa_irq_disable(struct irq_data *d)
 
91
{
 
92
        xtensa_irq_mask(d->irq);
 
93
        variant_irq_disable(d->irq);
 
94
}
 
95
 
 
96
static void xtensa_irq_ack(struct irq_data *d)
 
97
{
 
98
        set_sr(1 << d->irq, INTCLEAR);
 
99
}
 
100
 
 
101
static int xtensa_irq_retrigger(struct irq_data *d)
 
102
{
 
103
        set_sr (1 << d->irq, INTSET);
146
104
        return 1;
147
105
}
148
106
 
149
107
 
150
108
static struct irq_chip xtensa_irq_chip = {
151
109
        .name           = "xtensa",
152
 
        .enable         = xtensa_irq_enable,
153
 
        .disable        = xtensa_irq_disable,
154
 
        .mask           = xtensa_irq_mask,
155
 
        .unmask         = xtensa_irq_unmask,
156
 
        .ack            = xtensa_irq_ack,
157
 
        .retrigger      = xtensa_irq_retrigger,
 
110
        .irq_enable     = xtensa_irq_enable,
 
111
        .irq_disable    = xtensa_irq_disable,
 
112
        .irq_mask       = xtensa_irq_mask,
 
113
        .irq_unmask     = xtensa_irq_unmask,
 
114
        .irq_ack        = xtensa_irq_ack,
 
115
        .irq_retrigger  = xtensa_irq_retrigger,
158
116
};
159
117
 
160
118
void __init init_IRQ(void)
165
123
                int mask = 1 << index;
166
124
 
167
125
                if (mask & XCHAL_INTTYPE_MASK_SOFTWARE)
168
 
                        set_irq_chip_and_handler(index, &xtensa_irq_chip,
 
126
                        irq_set_chip_and_handler(index, &xtensa_irq_chip,
169
127
                                                 handle_simple_irq);
170
128
 
171
129
                else if (mask & XCHAL_INTTYPE_MASK_EXTERN_EDGE)
172
 
                        set_irq_chip_and_handler(index, &xtensa_irq_chip,
 
130
                        irq_set_chip_and_handler(index, &xtensa_irq_chip,
173
131
                                                 handle_edge_irq);
174
132
 
175
133
                else if (mask & XCHAL_INTTYPE_MASK_EXTERN_LEVEL)
176
 
                        set_irq_chip_and_handler(index, &xtensa_irq_chip,
 
134
                        irq_set_chip_and_handler(index, &xtensa_irq_chip,
177
135
                                                 handle_level_irq);
178
136
 
179
137
                else if (mask & XCHAL_INTTYPE_MASK_TIMER)
180
 
                        set_irq_chip_and_handler(index, &xtensa_irq_chip,
 
138
                        irq_set_chip_and_handler(index, &xtensa_irq_chip,
181
139
                                                 handle_edge_irq);
182
140
 
183
141
                else    /* XCHAL_INTTYPE_MASK_WRITE_ERROR */
184
142
                        /* XCHAL_INTTYPE_MASK_NMI */
185
143
 
186
 
                        set_irq_chip_and_handler(index, &xtensa_irq_chip,
 
144
                        irq_set_chip_and_handler(index, &xtensa_irq_chip,
187
145
                                                 handle_level_irq);
188
146
        }
189
147