layerscape: add patches-5.4
[openwrt/staging/dedeckeh.git] / target / linux / layerscape / patches-5.4 / 814-qe-0001-irqchip-qeic-move-qeic-driver-from-drivers-soc-fsl-q.patch
1 From 0172b31512827b9fd735df47751c7aa88b6aa5f6 Mon Sep 17 00:00:00 2001
2 From: Zhao Qiang <qiang.zhao@nxp.com>
3 Date: Thu, 27 Apr 2017 09:52:54 +0800
4 Subject: [PATCH] irqchip/qeic: move qeic driver from drivers/soc/fsl/qe
5
6 move the driver from drivers/soc/fsl/qe to drivers/irqchip,
7 merge qe_ic.h and qe_ic.c into irq-qeic.c.
8
9 Signed-off-by: Zhao Qiang <qiang.zhao@nxp.com>
10 ---
11 drivers/irqchip/irq-qeic.c | 597 ++++++++++++++++++++++++++++++++++++++++++++
12 drivers/soc/fsl/qe/Makefile | 2 +-
13 drivers/soc/fsl/qe/qe_ic.c | 508 -------------------------------------
14 drivers/soc/fsl/qe/qe_ic.h | 99 --------
15 4 files changed, 598 insertions(+), 608 deletions(-)
16 create mode 100644 drivers/irqchip/irq-qeic.c
17 delete mode 100644 drivers/soc/fsl/qe/qe_ic.c
18 delete mode 100644 drivers/soc/fsl/qe/qe_ic.h
19
20 --- /dev/null
21 +++ b/drivers/irqchip/irq-qeic.c
22 @@ -0,0 +1,597 @@
23 +// SPDX-License-Identifier: GPL-2.0-or-later
24 +/*
25 + * drivers/irqchip/irq-qeic.c
26 + *
27 + * Copyright (C) 2016 Freescale Semiconductor, Inc. All rights reserved.
28 + *
29 + * Author: Li Yang <leoli@freescale.com>
30 + * Based on code from Shlomi Gridish <gridish@freescale.com>
31 + *
32 + * QUICC ENGINE Interrupt Controller
33 + */
34 +
35 +#include <linux/of_irq.h>
36 +#include <linux/of_address.h>
37 +#include <linux/kernel.h>
38 +#include <linux/init.h>
39 +#include <linux/errno.h>
40 +#include <linux/reboot.h>
41 +#include <linux/slab.h>
42 +#include <linux/stddef.h>
43 +#include <linux/sched.h>
44 +#include <linux/signal.h>
45 +#include <linux/device.h>
46 +#include <linux/spinlock.h>
47 +#include <asm/irq.h>
48 +#include <asm/io.h>
49 +#include <soc/fsl/qe/qe_ic.h>
50 +
51 +#define NR_QE_IC_INTS 64
52 +
53 +/* QE IC registers offset */
54 +#define QEIC_CICR 0x00
55 +#define QEIC_CIVEC 0x04
56 +#define QEIC_CRIPNR 0x08
57 +#define QEIC_CIPNR 0x0c
58 +#define QEIC_CIPXCC 0x10
59 +#define QEIC_CIPYCC 0x14
60 +#define QEIC_CIPWCC 0x18
61 +#define QEIC_CIPZCC 0x1c
62 +#define QEIC_CIMR 0x20
63 +#define QEIC_CRIMR 0x24
64 +#define QEIC_CICNR 0x28
65 +#define QEIC_CIPRTA 0x30
66 +#define QEIC_CIPRTB 0x34
67 +#define QEIC_CRICR 0x3c
68 +#define QEIC_CHIVEC 0x60
69 +
70 +/* Interrupt priority registers */
71 +#define CIPCC_SHIFT_PRI0 29
72 +#define CIPCC_SHIFT_PRI1 26
73 +#define CIPCC_SHIFT_PRI2 23
74 +#define CIPCC_SHIFT_PRI3 20
75 +#define CIPCC_SHIFT_PRI4 13
76 +#define CIPCC_SHIFT_PRI5 10
77 +#define CIPCC_SHIFT_PRI6 7
78 +#define CIPCC_SHIFT_PRI7 4
79 +
80 +/* CICR priority modes */
81 +#define CICR_GWCC 0x00040000
82 +#define CICR_GXCC 0x00020000
83 +#define CICR_GYCC 0x00010000
84 +#define CICR_GZCC 0x00080000
85 +#define CICR_GRTA 0x00200000
86 +#define CICR_GRTB 0x00400000
87 +#define CICR_HPIT_SHIFT 8
88 +#define CICR_HPIT_MASK 0x00000300
89 +#define CICR_HP_SHIFT 24
90 +#define CICR_HP_MASK 0x3f000000
91 +
92 +/* CICNR */
93 +#define CICNR_WCC1T_SHIFT 20
94 +#define CICNR_ZCC1T_SHIFT 28
95 +#define CICNR_YCC1T_SHIFT 12
96 +#define CICNR_XCC1T_SHIFT 4
97 +
98 +/* CRICR */
99 +#define CRICR_RTA1T_SHIFT 20
100 +#define CRICR_RTB1T_SHIFT 28
101 +
102 +/* Signal indicator */
103 +#define SIGNAL_MASK 3
104 +#define SIGNAL_HIGH 2
105 +#define SIGNAL_LOW 0
106 +
107 +struct qe_ic {
108 + /* Control registers offset */
109 + u32 __iomem *regs;
110 +
111 + /* The remapper for this QEIC */
112 + struct irq_domain *irqhost;
113 +
114 + /* The "linux" controller struct */
115 + struct irq_chip hc_irq;
116 +
117 + /* VIRQ numbers of QE high/low irqs */
118 + unsigned int virq_high;
119 + unsigned int virq_low;
120 +};
121 +
122 +/*
123 + * QE interrupt controller internal structure
124 + */
125 +struct qe_ic_info {
126 + /* location of this source at the QIMR register. */
127 + u32 mask;
128 +
129 + /* Mask register offset */
130 + u32 mask_reg;
131 +
132 + /*
133 + * for grouped interrupts sources - the interrupt
134 + * code as appears at the group priority register
135 + */
136 + u8 pri_code;
137 +
138 + /* Group priority register offset */
139 + u32 pri_reg;
140 +};
141 +
142 +static DEFINE_RAW_SPINLOCK(qe_ic_lock);
143 +
144 +static struct qe_ic_info qe_ic_info[] = {
145 + [1] = {
146 + .mask = 0x00008000,
147 + .mask_reg = QEIC_CIMR,
148 + .pri_code = 0,
149 + .pri_reg = QEIC_CIPWCC,
150 + },
151 + [2] = {
152 + .mask = 0x00004000,
153 + .mask_reg = QEIC_CIMR,
154 + .pri_code = 1,
155 + .pri_reg = QEIC_CIPWCC,
156 + },
157 + [3] = {
158 + .mask = 0x00002000,
159 + .mask_reg = QEIC_CIMR,
160 + .pri_code = 2,
161 + .pri_reg = QEIC_CIPWCC,
162 + },
163 + [10] = {
164 + .mask = 0x00000040,
165 + .mask_reg = QEIC_CIMR,
166 + .pri_code = 1,
167 + .pri_reg = QEIC_CIPZCC,
168 + },
169 + [11] = {
170 + .mask = 0x00000020,
171 + .mask_reg = QEIC_CIMR,
172 + .pri_code = 2,
173 + .pri_reg = QEIC_CIPZCC,
174 + },
175 + [12] = {
176 + .mask = 0x00000010,
177 + .mask_reg = QEIC_CIMR,
178 + .pri_code = 3,
179 + .pri_reg = QEIC_CIPZCC,
180 + },
181 + [13] = {
182 + .mask = 0x00000008,
183 + .mask_reg = QEIC_CIMR,
184 + .pri_code = 4,
185 + .pri_reg = QEIC_CIPZCC,
186 + },
187 + [14] = {
188 + .mask = 0x00000004,
189 + .mask_reg = QEIC_CIMR,
190 + .pri_code = 5,
191 + .pri_reg = QEIC_CIPZCC,
192 + },
193 + [15] = {
194 + .mask = 0x00000002,
195 + .mask_reg = QEIC_CIMR,
196 + .pri_code = 6,
197 + .pri_reg = QEIC_CIPZCC,
198 + },
199 + [20] = {
200 + .mask = 0x10000000,
201 + .mask_reg = QEIC_CRIMR,
202 + .pri_code = 3,
203 + .pri_reg = QEIC_CIPRTA,
204 + },
205 + [25] = {
206 + .mask = 0x00800000,
207 + .mask_reg = QEIC_CRIMR,
208 + .pri_code = 0,
209 + .pri_reg = QEIC_CIPRTB,
210 + },
211 + [26] = {
212 + .mask = 0x00400000,
213 + .mask_reg = QEIC_CRIMR,
214 + .pri_code = 1,
215 + .pri_reg = QEIC_CIPRTB,
216 + },
217 + [27] = {
218 + .mask = 0x00200000,
219 + .mask_reg = QEIC_CRIMR,
220 + .pri_code = 2,
221 + .pri_reg = QEIC_CIPRTB,
222 + },
223 + [28] = {
224 + .mask = 0x00100000,
225 + .mask_reg = QEIC_CRIMR,
226 + .pri_code = 3,
227 + .pri_reg = QEIC_CIPRTB,
228 + },
229 + [32] = {
230 + .mask = 0x80000000,
231 + .mask_reg = QEIC_CIMR,
232 + .pri_code = 0,
233 + .pri_reg = QEIC_CIPXCC,
234 + },
235 + [33] = {
236 + .mask = 0x40000000,
237 + .mask_reg = QEIC_CIMR,
238 + .pri_code = 1,
239 + .pri_reg = QEIC_CIPXCC,
240 + },
241 + [34] = {
242 + .mask = 0x20000000,
243 + .mask_reg = QEIC_CIMR,
244 + .pri_code = 2,
245 + .pri_reg = QEIC_CIPXCC,
246 + },
247 + [35] = {
248 + .mask = 0x10000000,
249 + .mask_reg = QEIC_CIMR,
250 + .pri_code = 3,
251 + .pri_reg = QEIC_CIPXCC,
252 + },
253 + [36] = {
254 + .mask = 0x08000000,
255 + .mask_reg = QEIC_CIMR,
256 + .pri_code = 4,
257 + .pri_reg = QEIC_CIPXCC,
258 + },
259 + [40] = {
260 + .mask = 0x00800000,
261 + .mask_reg = QEIC_CIMR,
262 + .pri_code = 0,
263 + .pri_reg = QEIC_CIPYCC,
264 + },
265 + [41] = {
266 + .mask = 0x00400000,
267 + .mask_reg = QEIC_CIMR,
268 + .pri_code = 1,
269 + .pri_reg = QEIC_CIPYCC,
270 + },
271 + [42] = {
272 + .mask = 0x00200000,
273 + .mask_reg = QEIC_CIMR,
274 + .pri_code = 2,
275 + .pri_reg = QEIC_CIPYCC,
276 + },
277 + [43] = {
278 + .mask = 0x00100000,
279 + .mask_reg = QEIC_CIMR,
280 + .pri_code = 3,
281 + .pri_reg = QEIC_CIPYCC,
282 + },
283 +};
284 +
285 +static inline u32 qe_ic_read(volatile __be32 __iomem * base, unsigned int reg)
286 +{
287 + return in_be32(base + (reg >> 2));
288 +}
289 +
290 +static inline void qe_ic_write(volatile __be32 __iomem * base, unsigned int reg,
291 + u32 value)
292 +{
293 + out_be32(base + (reg >> 2), value);
294 +}
295 +
296 +static inline struct qe_ic *qe_ic_from_irq(unsigned int virq)
297 +{
298 + return irq_get_chip_data(virq);
299 +}
300 +
301 +static inline struct qe_ic *qe_ic_from_irq_data(struct irq_data *d)
302 +{
303 + return irq_data_get_irq_chip_data(d);
304 +}
305 +
306 +static void qe_ic_unmask_irq(struct irq_data *d)
307 +{
308 + struct qe_ic *qe_ic = qe_ic_from_irq_data(d);
309 + unsigned int src = irqd_to_hwirq(d);
310 + unsigned long flags;
311 + u32 temp;
312 +
313 + raw_spin_lock_irqsave(&qe_ic_lock, flags);
314 +
315 + temp = qe_ic_read(qe_ic->regs, qe_ic_info[src].mask_reg);
316 + qe_ic_write(qe_ic->regs, qe_ic_info[src].mask_reg,
317 + temp | qe_ic_info[src].mask);
318 +
319 + raw_spin_unlock_irqrestore(&qe_ic_lock, flags);
320 +}
321 +
322 +static void qe_ic_mask_irq(struct irq_data *d)
323 +{
324 + struct qe_ic *qe_ic = qe_ic_from_irq_data(d);
325 + unsigned int src = irqd_to_hwirq(d);
326 + unsigned long flags;
327 + u32 temp;
328 +
329 + raw_spin_lock_irqsave(&qe_ic_lock, flags);
330 +
331 + temp = qe_ic_read(qe_ic->regs, qe_ic_info[src].mask_reg);
332 + qe_ic_write(qe_ic->regs, qe_ic_info[src].mask_reg,
333 + temp & ~qe_ic_info[src].mask);
334 +
335 + /* Flush the above write before enabling interrupts; otherwise,
336 + * spurious interrupts will sometimes happen. To be 100% sure
337 + * that the write has reached the device before interrupts are
338 + * enabled, the mask register would have to be read back; however,
339 + * this is not required for correctness, only to avoid wasting
340 + * time on a large number of spurious interrupts. In testing,
341 + * a sync reduced the observed spurious interrupts to zero.
342 + */
343 + mb();
344 +
345 + raw_spin_unlock_irqrestore(&qe_ic_lock, flags);
346 +}
347 +
348 +static struct irq_chip qe_ic_irq_chip = {
349 + .name = "QEIC",
350 + .irq_unmask = qe_ic_unmask_irq,
351 + .irq_mask = qe_ic_mask_irq,
352 + .irq_mask_ack = qe_ic_mask_irq,
353 +};
354 +
355 +static int qe_ic_host_match(struct irq_domain *h, struct device_node *node,
356 + enum irq_domain_bus_token bus_token)
357 +{
358 + /* Exact match, unless qe_ic node is NULL */
359 + struct device_node *of_node = irq_domain_get_of_node(h);
360 + return of_node == NULL || of_node == node;
361 +}
362 +
363 +static int qe_ic_host_map(struct irq_domain *h, unsigned int virq,
364 + irq_hw_number_t hw)
365 +{
366 + struct qe_ic *qe_ic = h->host_data;
367 + struct irq_chip *chip;
368 +
369 + if (hw >= ARRAY_SIZE(qe_ic_info)) {
370 + pr_err("%s: Invalid hw irq number for QEIC\n", __func__);
371 + return -EINVAL;
372 + }
373 +
374 + if (qe_ic_info[hw].mask == 0) {
375 + printk(KERN_ERR "Can't map reserved IRQ\n");
376 + return -EINVAL;
377 + }
378 + /* Default chip */
379 + chip = &qe_ic->hc_irq;
380 +
381 + irq_set_chip_data(virq, qe_ic);
382 + irq_set_status_flags(virq, IRQ_LEVEL);
383 +
384 + irq_set_chip_and_handler(virq, chip, handle_level_irq);
385 +
386 + return 0;
387 +}
388 +
389 +static const struct irq_domain_ops qe_ic_host_ops = {
390 + .match = qe_ic_host_match,
391 + .map = qe_ic_host_map,
392 + .xlate = irq_domain_xlate_onetwocell,
393 +};
394 +
395 +/* Return an interrupt vector or NO_IRQ if no interrupt is pending. */
396 +unsigned int qe_ic_get_low_irq(struct qe_ic *qe_ic)
397 +{
398 + int irq;
399 +
400 + BUG_ON(qe_ic == NULL);
401 +
402 + /* get the interrupt source vector. */
403 + irq = qe_ic_read(qe_ic->regs, QEIC_CIVEC) >> 26;
404 +
405 + if (irq == 0)
406 + return NO_IRQ;
407 +
408 + return irq_linear_revmap(qe_ic->irqhost, irq);
409 +}
410 +
411 +/* Return an interrupt vector or NO_IRQ if no interrupt is pending. */
412 +unsigned int qe_ic_get_high_irq(struct qe_ic *qe_ic)
413 +{
414 + int irq;
415 +
416 + BUG_ON(qe_ic == NULL);
417 +
418 + /* get the interrupt source vector. */
419 + irq = qe_ic_read(qe_ic->regs, QEIC_CHIVEC) >> 26;
420 +
421 + if (irq == 0)
422 + return NO_IRQ;
423 +
424 + return irq_linear_revmap(qe_ic->irqhost, irq);
425 +}
426 +
427 +void __init qe_ic_init(struct device_node *node, unsigned int flags,
428 + void (*low_handler)(struct irq_desc *desc),
429 + void (*high_handler)(struct irq_desc *desc))
430 +{
431 + struct qe_ic *qe_ic;
432 + struct resource res;
433 + u32 temp = 0, ret, high_active = 0;
434 +
435 + ret = of_address_to_resource(node, 0, &res);
436 + if (ret)
437 + return;
438 +
439 + qe_ic = kzalloc(sizeof(*qe_ic), GFP_KERNEL);
440 + if (qe_ic == NULL)
441 + return;
442 +
443 + qe_ic->irqhost = irq_domain_add_linear(node, NR_QE_IC_INTS,
444 + &qe_ic_host_ops, qe_ic);
445 + if (qe_ic->irqhost == NULL) {
446 + kfree(qe_ic);
447 + return;
448 + }
449 +
450 + qe_ic->regs = ioremap(res.start, resource_size(&res));
451 +
452 + qe_ic->hc_irq = qe_ic_irq_chip;
453 +
454 + qe_ic->virq_high = irq_of_parse_and_map(node, 0);
455 + qe_ic->virq_low = irq_of_parse_and_map(node, 1);
456 +
457 + if (qe_ic->virq_low == NO_IRQ) {
458 + printk(KERN_ERR "Failed to map QE_IC low IRQ\n");
459 + kfree(qe_ic);
460 + return;
461 + }
462 +
463 + /* default priority scheme is grouped. If spread mode is */
464 + /* required, configure cicr accordingly. */
465 + if (flags & QE_IC_SPREADMODE_GRP_W)
466 + temp |= CICR_GWCC;
467 + if (flags & QE_IC_SPREADMODE_GRP_X)
468 + temp |= CICR_GXCC;
469 + if (flags & QE_IC_SPREADMODE_GRP_Y)
470 + temp |= CICR_GYCC;
471 + if (flags & QE_IC_SPREADMODE_GRP_Z)
472 + temp |= CICR_GZCC;
473 + if (flags & QE_IC_SPREADMODE_GRP_RISCA)
474 + temp |= CICR_GRTA;
475 + if (flags & QE_IC_SPREADMODE_GRP_RISCB)
476 + temp |= CICR_GRTB;
477 +
478 + /* choose destination signal for highest priority interrupt */
479 + if (flags & QE_IC_HIGH_SIGNAL) {
480 + temp |= (SIGNAL_HIGH << CICR_HPIT_SHIFT);
481 + high_active = 1;
482 + }
483 +
484 + qe_ic_write(qe_ic->regs, QEIC_CICR, temp);
485 +
486 + irq_set_handler_data(qe_ic->virq_low, qe_ic);
487 + irq_set_chained_handler(qe_ic->virq_low, low_handler);
488 +
489 + if (qe_ic->virq_high != NO_IRQ &&
490 + qe_ic->virq_high != qe_ic->virq_low) {
491 + irq_set_handler_data(qe_ic->virq_high, qe_ic);
492 + irq_set_chained_handler(qe_ic->virq_high, high_handler);
493 + }
494 +}
495 +
496 +void qe_ic_set_highest_priority(unsigned int virq, int high)
497 +{
498 + struct qe_ic *qe_ic = qe_ic_from_irq(virq);
499 + unsigned int src = virq_to_hw(virq);
500 + u32 temp = 0;
501 +
502 + temp = qe_ic_read(qe_ic->regs, QEIC_CICR);
503 +
504 + temp &= ~CICR_HP_MASK;
505 + temp |= src << CICR_HP_SHIFT;
506 +
507 + temp &= ~CICR_HPIT_MASK;
508 + temp |= (high ? SIGNAL_HIGH : SIGNAL_LOW) << CICR_HPIT_SHIFT;
509 +
510 + qe_ic_write(qe_ic->regs, QEIC_CICR, temp);
511 +}
512 +
513 +/* Set Priority level within its group, from 1 to 8 */
514 +int qe_ic_set_priority(unsigned int virq, unsigned int priority)
515 +{
516 + struct qe_ic *qe_ic = qe_ic_from_irq(virq);
517 + unsigned int src = virq_to_hw(virq);
518 + u32 temp;
519 +
520 + if (priority > 8 || priority == 0)
521 + return -EINVAL;
522 + if (WARN_ONCE(src >= ARRAY_SIZE(qe_ic_info),
523 + "%s: Invalid hw irq number for QEIC\n", __func__))
524 + return -EINVAL;
525 + if (qe_ic_info[src].pri_reg == 0)
526 + return -EINVAL;
527 +
528 + temp = qe_ic_read(qe_ic->regs, qe_ic_info[src].pri_reg);
529 +
530 + if (priority < 4) {
531 + temp &= ~(0x7 << (32 - priority * 3));
532 + temp |= qe_ic_info[src].pri_code << (32 - priority * 3);
533 + } else {
534 + temp &= ~(0x7 << (24 - priority * 3));
535 + temp |= qe_ic_info[src].pri_code << (24 - priority * 3);
536 + }
537 +
538 + qe_ic_write(qe_ic->regs, qe_ic_info[src].pri_reg, temp);
539 +
540 + return 0;
541 +}
542 +
543 +/* Set a QE priority to use high irq, only priority 1~2 can use high irq */
544 +int qe_ic_set_high_priority(unsigned int virq, unsigned int priority, int high)
545 +{
546 + struct qe_ic *qe_ic = qe_ic_from_irq(virq);
547 + unsigned int src = virq_to_hw(virq);
548 + u32 temp, control_reg = QEIC_CICNR, shift = 0;
549 +
550 + if (priority > 2 || priority == 0)
551 + return -EINVAL;
552 + if (WARN_ONCE(src >= ARRAY_SIZE(qe_ic_info),
553 + "%s: Invalid hw irq number for QEIC\n", __func__))
554 + return -EINVAL;
555 +
556 + switch (qe_ic_info[src].pri_reg) {
557 + case QEIC_CIPZCC:
558 + shift = CICNR_ZCC1T_SHIFT;
559 + break;
560 + case QEIC_CIPWCC:
561 + shift = CICNR_WCC1T_SHIFT;
562 + break;
563 + case QEIC_CIPYCC:
564 + shift = CICNR_YCC1T_SHIFT;
565 + break;
566 + case QEIC_CIPXCC:
567 + shift = CICNR_XCC1T_SHIFT;
568 + break;
569 + case QEIC_CIPRTA:
570 + shift = CRICR_RTA1T_SHIFT;
571 + control_reg = QEIC_CRICR;
572 + break;
573 + case QEIC_CIPRTB:
574 + shift = CRICR_RTB1T_SHIFT;
575 + control_reg = QEIC_CRICR;
576 + break;
577 + default:
578 + return -EINVAL;
579 + }
580 +
581 + shift += (2 - priority) * 2;
582 + temp = qe_ic_read(qe_ic->regs, control_reg);
583 + temp &= ~(SIGNAL_MASK << shift);
584 + temp |= (high ? SIGNAL_HIGH : SIGNAL_LOW) << shift;
585 + qe_ic_write(qe_ic->regs, control_reg, temp);
586 +
587 + return 0;
588 +}
589 +
590 +static struct bus_type qe_ic_subsys = {
591 + .name = "qe_ic",
592 + .dev_name = "qe_ic",
593 +};
594 +
595 +static struct device device_qe_ic = {
596 + .id = 0,
597 + .bus = &qe_ic_subsys,
598 +};
599 +
600 +static int __init init_qe_ic_sysfs(void)
601 +{
602 + int rc;
603 +
604 + printk(KERN_DEBUG "Registering qe_ic with sysfs...\n");
605 +
606 + rc = subsys_system_register(&qe_ic_subsys, NULL);
607 + if (rc) {
608 + printk(KERN_ERR "Failed registering qe_ic sys class\n");
609 + return -ENODEV;
610 + }
611 + rc = device_register(&device_qe_ic);
612 + if (rc) {
613 + printk(KERN_ERR "Failed registering qe_ic sys device\n");
614 + return -ENODEV;
615 + }
616 + return 0;
617 +}
618 +
619 +subsys_initcall(init_qe_ic_sysfs);
620 --- a/drivers/soc/fsl/qe/Makefile
621 +++ b/drivers/soc/fsl/qe/Makefile
622 @@ -2,7 +2,7 @@
623 #
624 # Makefile for the linux ppc-specific parts of QE
625 #
626 -obj-$(CONFIG_QUICC_ENGINE)+= qe.o qe_common.o qe_ic.o qe_io.o
627 +obj-$(CONFIG_QUICC_ENGINE)+= qe.o qe_common.o qe_io.o
628 obj-$(CONFIG_CPM) += qe_common.o
629 obj-$(CONFIG_UCC) += ucc.o
630 obj-$(CONFIG_UCC_SLOW) += ucc_slow.o
631 --- a/drivers/soc/fsl/qe/qe_ic.c
632 +++ /dev/null
633 @@ -1,508 +0,0 @@
634 -// SPDX-License-Identifier: GPL-2.0-or-later
635 -/*
636 - * arch/powerpc/sysdev/qe_lib/qe_ic.c
637 - *
638 - * Copyright (C) 2006 Freescale Semiconductor, Inc. All rights reserved.
639 - *
640 - * Author: Li Yang <leoli@freescale.com>
641 - * Based on code from Shlomi Gridish <gridish@freescale.com>
642 - *
643 - * QUICC ENGINE Interrupt Controller
644 - */
645 -
646 -#include <linux/of_irq.h>
647 -#include <linux/of_address.h>
648 -#include <linux/kernel.h>
649 -#include <linux/init.h>
650 -#include <linux/errno.h>
651 -#include <linux/reboot.h>
652 -#include <linux/slab.h>
653 -#include <linux/stddef.h>
654 -#include <linux/sched.h>
655 -#include <linux/signal.h>
656 -#include <linux/device.h>
657 -#include <linux/spinlock.h>
658 -#include <asm/irq.h>
659 -#include <asm/io.h>
660 -#include <soc/fsl/qe/qe_ic.h>
661 -
662 -#include "qe_ic.h"
663 -
664 -static DEFINE_RAW_SPINLOCK(qe_ic_lock);
665 -
666 -static struct qe_ic_info qe_ic_info[] = {
667 - [1] = {
668 - .mask = 0x00008000,
669 - .mask_reg = QEIC_CIMR,
670 - .pri_code = 0,
671 - .pri_reg = QEIC_CIPWCC,
672 - },
673 - [2] = {
674 - .mask = 0x00004000,
675 - .mask_reg = QEIC_CIMR,
676 - .pri_code = 1,
677 - .pri_reg = QEIC_CIPWCC,
678 - },
679 - [3] = {
680 - .mask = 0x00002000,
681 - .mask_reg = QEIC_CIMR,
682 - .pri_code = 2,
683 - .pri_reg = QEIC_CIPWCC,
684 - },
685 - [10] = {
686 - .mask = 0x00000040,
687 - .mask_reg = QEIC_CIMR,
688 - .pri_code = 1,
689 - .pri_reg = QEIC_CIPZCC,
690 - },
691 - [11] = {
692 - .mask = 0x00000020,
693 - .mask_reg = QEIC_CIMR,
694 - .pri_code = 2,
695 - .pri_reg = QEIC_CIPZCC,
696 - },
697 - [12] = {
698 - .mask = 0x00000010,
699 - .mask_reg = QEIC_CIMR,
700 - .pri_code = 3,
701 - .pri_reg = QEIC_CIPZCC,
702 - },
703 - [13] = {
704 - .mask = 0x00000008,
705 - .mask_reg = QEIC_CIMR,
706 - .pri_code = 4,
707 - .pri_reg = QEIC_CIPZCC,
708 - },
709 - [14] = {
710 - .mask = 0x00000004,
711 - .mask_reg = QEIC_CIMR,
712 - .pri_code = 5,
713 - .pri_reg = QEIC_CIPZCC,
714 - },
715 - [15] = {
716 - .mask = 0x00000002,
717 - .mask_reg = QEIC_CIMR,
718 - .pri_code = 6,
719 - .pri_reg = QEIC_CIPZCC,
720 - },
721 - [20] = {
722 - .mask = 0x10000000,
723 - .mask_reg = QEIC_CRIMR,
724 - .pri_code = 3,
725 - .pri_reg = QEIC_CIPRTA,
726 - },
727 - [25] = {
728 - .mask = 0x00800000,
729 - .mask_reg = QEIC_CRIMR,
730 - .pri_code = 0,
731 - .pri_reg = QEIC_CIPRTB,
732 - },
733 - [26] = {
734 - .mask = 0x00400000,
735 - .mask_reg = QEIC_CRIMR,
736 - .pri_code = 1,
737 - .pri_reg = QEIC_CIPRTB,
738 - },
739 - [27] = {
740 - .mask = 0x00200000,
741 - .mask_reg = QEIC_CRIMR,
742 - .pri_code = 2,
743 - .pri_reg = QEIC_CIPRTB,
744 - },
745 - [28] = {
746 - .mask = 0x00100000,
747 - .mask_reg = QEIC_CRIMR,
748 - .pri_code = 3,
749 - .pri_reg = QEIC_CIPRTB,
750 - },
751 - [32] = {
752 - .mask = 0x80000000,
753 - .mask_reg = QEIC_CIMR,
754 - .pri_code = 0,
755 - .pri_reg = QEIC_CIPXCC,
756 - },
757 - [33] = {
758 - .mask = 0x40000000,
759 - .mask_reg = QEIC_CIMR,
760 - .pri_code = 1,
761 - .pri_reg = QEIC_CIPXCC,
762 - },
763 - [34] = {
764 - .mask = 0x20000000,
765 - .mask_reg = QEIC_CIMR,
766 - .pri_code = 2,
767 - .pri_reg = QEIC_CIPXCC,
768 - },
769 - [35] = {
770 - .mask = 0x10000000,
771 - .mask_reg = QEIC_CIMR,
772 - .pri_code = 3,
773 - .pri_reg = QEIC_CIPXCC,
774 - },
775 - [36] = {
776 - .mask = 0x08000000,
777 - .mask_reg = QEIC_CIMR,
778 - .pri_code = 4,
779 - .pri_reg = QEIC_CIPXCC,
780 - },
781 - [40] = {
782 - .mask = 0x00800000,
783 - .mask_reg = QEIC_CIMR,
784 - .pri_code = 0,
785 - .pri_reg = QEIC_CIPYCC,
786 - },
787 - [41] = {
788 - .mask = 0x00400000,
789 - .mask_reg = QEIC_CIMR,
790 - .pri_code = 1,
791 - .pri_reg = QEIC_CIPYCC,
792 - },
793 - [42] = {
794 - .mask = 0x00200000,
795 - .mask_reg = QEIC_CIMR,
796 - .pri_code = 2,
797 - .pri_reg = QEIC_CIPYCC,
798 - },
799 - [43] = {
800 - .mask = 0x00100000,
801 - .mask_reg = QEIC_CIMR,
802 - .pri_code = 3,
803 - .pri_reg = QEIC_CIPYCC,
804 - },
805 -};
806 -
807 -static inline u32 qe_ic_read(volatile __be32 __iomem * base, unsigned int reg)
808 -{
809 - return in_be32(base + (reg >> 2));
810 -}
811 -
812 -static inline void qe_ic_write(volatile __be32 __iomem * base, unsigned int reg,
813 - u32 value)
814 -{
815 - out_be32(base + (reg >> 2), value);
816 -}
817 -
818 -static inline struct qe_ic *qe_ic_from_irq(unsigned int virq)
819 -{
820 - return irq_get_chip_data(virq);
821 -}
822 -
823 -static inline struct qe_ic *qe_ic_from_irq_data(struct irq_data *d)
824 -{
825 - return irq_data_get_irq_chip_data(d);
826 -}
827 -
828 -static void qe_ic_unmask_irq(struct irq_data *d)
829 -{
830 - struct qe_ic *qe_ic = qe_ic_from_irq_data(d);
831 - unsigned int src = irqd_to_hwirq(d);
832 - unsigned long flags;
833 - u32 temp;
834 -
835 - raw_spin_lock_irqsave(&qe_ic_lock, flags);
836 -
837 - temp = qe_ic_read(qe_ic->regs, qe_ic_info[src].mask_reg);
838 - qe_ic_write(qe_ic->regs, qe_ic_info[src].mask_reg,
839 - temp | qe_ic_info[src].mask);
840 -
841 - raw_spin_unlock_irqrestore(&qe_ic_lock, flags);
842 -}
843 -
844 -static void qe_ic_mask_irq(struct irq_data *d)
845 -{
846 - struct qe_ic *qe_ic = qe_ic_from_irq_data(d);
847 - unsigned int src = irqd_to_hwirq(d);
848 - unsigned long flags;
849 - u32 temp;
850 -
851 - raw_spin_lock_irqsave(&qe_ic_lock, flags);
852 -
853 - temp = qe_ic_read(qe_ic->regs, qe_ic_info[src].mask_reg);
854 - qe_ic_write(qe_ic->regs, qe_ic_info[src].mask_reg,
855 - temp & ~qe_ic_info[src].mask);
856 -
857 - /* Flush the above write before enabling interrupts; otherwise,
858 - * spurious interrupts will sometimes happen. To be 100% sure
859 - * that the write has reached the device before interrupts are
860 - * enabled, the mask register would have to be read back; however,
861 - * this is not required for correctness, only to avoid wasting
862 - * time on a large number of spurious interrupts. In testing,
863 - * a sync reduced the observed spurious interrupts to zero.
864 - */
865 - mb();
866 -
867 - raw_spin_unlock_irqrestore(&qe_ic_lock, flags);
868 -}
869 -
870 -static struct irq_chip qe_ic_irq_chip = {
871 - .name = "QEIC",
872 - .irq_unmask = qe_ic_unmask_irq,
873 - .irq_mask = qe_ic_mask_irq,
874 - .irq_mask_ack = qe_ic_mask_irq,
875 -};
876 -
877 -static int qe_ic_host_match(struct irq_domain *h, struct device_node *node,
878 - enum irq_domain_bus_token bus_token)
879 -{
880 - /* Exact match, unless qe_ic node is NULL */
881 - struct device_node *of_node = irq_domain_get_of_node(h);
882 - return of_node == NULL || of_node == node;
883 -}
884 -
885 -static int qe_ic_host_map(struct irq_domain *h, unsigned int virq,
886 - irq_hw_number_t hw)
887 -{
888 - struct qe_ic *qe_ic = h->host_data;
889 - struct irq_chip *chip;
890 -
891 - if (hw >= ARRAY_SIZE(qe_ic_info)) {
892 - pr_err("%s: Invalid hw irq number for QEIC\n", __func__);
893 - return -EINVAL;
894 - }
895 -
896 - if (qe_ic_info[hw].mask == 0) {
897 - printk(KERN_ERR "Can't map reserved IRQ\n");
898 - return -EINVAL;
899 - }
900 - /* Default chip */
901 - chip = &qe_ic->hc_irq;
902 -
903 - irq_set_chip_data(virq, qe_ic);
904 - irq_set_status_flags(virq, IRQ_LEVEL);
905 -
906 - irq_set_chip_and_handler(virq, chip, handle_level_irq);
907 -
908 - return 0;
909 -}
910 -
911 -static const struct irq_domain_ops qe_ic_host_ops = {
912 - .match = qe_ic_host_match,
913 - .map = qe_ic_host_map,
914 - .xlate = irq_domain_xlate_onetwocell,
915 -};
916 -
917 -/* Return an interrupt vector or NO_IRQ if no interrupt is pending. */
918 -unsigned int qe_ic_get_low_irq(struct qe_ic *qe_ic)
919 -{
920 - int irq;
921 -
922 - BUG_ON(qe_ic == NULL);
923 -
924 - /* get the interrupt source vector. */
925 - irq = qe_ic_read(qe_ic->regs, QEIC_CIVEC) >> 26;
926 -
927 - if (irq == 0)
928 - return NO_IRQ;
929 -
930 - return irq_linear_revmap(qe_ic->irqhost, irq);
931 -}
932 -
933 -/* Return an interrupt vector or NO_IRQ if no interrupt is pending. */
934 -unsigned int qe_ic_get_high_irq(struct qe_ic *qe_ic)
935 -{
936 - int irq;
937 -
938 - BUG_ON(qe_ic == NULL);
939 -
940 - /* get the interrupt source vector. */
941 - irq = qe_ic_read(qe_ic->regs, QEIC_CHIVEC) >> 26;
942 -
943 - if (irq == 0)
944 - return NO_IRQ;
945 -
946 - return irq_linear_revmap(qe_ic->irqhost, irq);
947 -}
948 -
949 -void __init qe_ic_init(struct device_node *node, unsigned int flags,
950 - void (*low_handler)(struct irq_desc *desc),
951 - void (*high_handler)(struct irq_desc *desc))
952 -{
953 - struct qe_ic *qe_ic;
954 - struct resource res;
955 - u32 temp = 0, ret, high_active = 0;
956 -
957 - ret = of_address_to_resource(node, 0, &res);
958 - if (ret)
959 - return;
960 -
961 - qe_ic = kzalloc(sizeof(*qe_ic), GFP_KERNEL);
962 - if (qe_ic == NULL)
963 - return;
964 -
965 - qe_ic->irqhost = irq_domain_add_linear(node, NR_QE_IC_INTS,
966 - &qe_ic_host_ops, qe_ic);
967 - if (qe_ic->irqhost == NULL) {
968 - kfree(qe_ic);
969 - return;
970 - }
971 -
972 - qe_ic->regs = ioremap(res.start, resource_size(&res));
973 -
974 - qe_ic->hc_irq = qe_ic_irq_chip;
975 -
976 - qe_ic->virq_high = irq_of_parse_and_map(node, 0);
977 - qe_ic->virq_low = irq_of_parse_and_map(node, 1);
978 -
979 - if (qe_ic->virq_low == NO_IRQ) {
980 - printk(KERN_ERR "Failed to map QE_IC low IRQ\n");
981 - kfree(qe_ic);
982 - return;
983 - }
984 -
985 - /* default priority scheme is grouped. If spread mode is */
986 - /* required, configure cicr accordingly. */
987 - if (flags & QE_IC_SPREADMODE_GRP_W)
988 - temp |= CICR_GWCC;
989 - if (flags & QE_IC_SPREADMODE_GRP_X)
990 - temp |= CICR_GXCC;
991 - if (flags & QE_IC_SPREADMODE_GRP_Y)
992 - temp |= CICR_GYCC;
993 - if (flags & QE_IC_SPREADMODE_GRP_Z)
994 - temp |= CICR_GZCC;
995 - if (flags & QE_IC_SPREADMODE_GRP_RISCA)
996 - temp |= CICR_GRTA;
997 - if (flags & QE_IC_SPREADMODE_GRP_RISCB)
998 - temp |= CICR_GRTB;
999 -
1000 - /* choose destination signal for highest priority interrupt */
1001 - if (flags & QE_IC_HIGH_SIGNAL) {
1002 - temp |= (SIGNAL_HIGH << CICR_HPIT_SHIFT);
1003 - high_active = 1;
1004 - }
1005 -
1006 - qe_ic_write(qe_ic->regs, QEIC_CICR, temp);
1007 -
1008 - irq_set_handler_data(qe_ic->virq_low, qe_ic);
1009 - irq_set_chained_handler(qe_ic->virq_low, low_handler);
1010 -
1011 - if (qe_ic->virq_high != NO_IRQ &&
1012 - qe_ic->virq_high != qe_ic->virq_low) {
1013 - irq_set_handler_data(qe_ic->virq_high, qe_ic);
1014 - irq_set_chained_handler(qe_ic->virq_high, high_handler);
1015 - }
1016 -}
1017 -
1018 -void qe_ic_set_highest_priority(unsigned int virq, int high)
1019 -{
1020 - struct qe_ic *qe_ic = qe_ic_from_irq(virq);
1021 - unsigned int src = virq_to_hw(virq);
1022 - u32 temp = 0;
1023 -
1024 - temp = qe_ic_read(qe_ic->regs, QEIC_CICR);
1025 -
1026 - temp &= ~CICR_HP_MASK;
1027 - temp |= src << CICR_HP_SHIFT;
1028 -
1029 - temp &= ~CICR_HPIT_MASK;
1030 - temp |= (high ? SIGNAL_HIGH : SIGNAL_LOW) << CICR_HPIT_SHIFT;
1031 -
1032 - qe_ic_write(qe_ic->regs, QEIC_CICR, temp);
1033 -}
1034 -
1035 -/* Set Priority level within its group, from 1 to 8 */
1036 -int qe_ic_set_priority(unsigned int virq, unsigned int priority)
1037 -{
1038 - struct qe_ic *qe_ic = qe_ic_from_irq(virq);
1039 - unsigned int src = virq_to_hw(virq);
1040 - u32 temp;
1041 -
1042 - if (priority > 8 || priority == 0)
1043 - return -EINVAL;
1044 - if (WARN_ONCE(src >= ARRAY_SIZE(qe_ic_info),
1045 - "%s: Invalid hw irq number for QEIC\n", __func__))
1046 - return -EINVAL;
1047 - if (qe_ic_info[src].pri_reg == 0)
1048 - return -EINVAL;
1049 -
1050 - temp = qe_ic_read(qe_ic->regs, qe_ic_info[src].pri_reg);
1051 -
1052 - if (priority < 4) {
1053 - temp &= ~(0x7 << (32 - priority * 3));
1054 - temp |= qe_ic_info[src].pri_code << (32 - priority * 3);
1055 - } else {
1056 - temp &= ~(0x7 << (24 - priority * 3));
1057 - temp |= qe_ic_info[src].pri_code << (24 - priority * 3);
1058 - }
1059 -
1060 - qe_ic_write(qe_ic->regs, qe_ic_info[src].pri_reg, temp);
1061 -
1062 - return 0;
1063 -}
1064 -
1065 -/* Set a QE priority to use high irq, only priority 1~2 can use high irq */
1066 -int qe_ic_set_high_priority(unsigned int virq, unsigned int priority, int high)
1067 -{
1068 - struct qe_ic *qe_ic = qe_ic_from_irq(virq);
1069 - unsigned int src = virq_to_hw(virq);
1070 - u32 temp, control_reg = QEIC_CICNR, shift = 0;
1071 -
1072 - if (priority > 2 || priority == 0)
1073 - return -EINVAL;
1074 - if (WARN_ONCE(src >= ARRAY_SIZE(qe_ic_info),
1075 - "%s: Invalid hw irq number for QEIC\n", __func__))
1076 - return -EINVAL;
1077 -
1078 - switch (qe_ic_info[src].pri_reg) {
1079 - case QEIC_CIPZCC:
1080 - shift = CICNR_ZCC1T_SHIFT;
1081 - break;
1082 - case QEIC_CIPWCC:
1083 - shift = CICNR_WCC1T_SHIFT;
1084 - break;
1085 - case QEIC_CIPYCC:
1086 - shift = CICNR_YCC1T_SHIFT;
1087 - break;
1088 - case QEIC_CIPXCC:
1089 - shift = CICNR_XCC1T_SHIFT;
1090 - break;
1091 - case QEIC_CIPRTA:
1092 - shift = CRICR_RTA1T_SHIFT;
1093 - control_reg = QEIC_CRICR;
1094 - break;
1095 - case QEIC_CIPRTB:
1096 - shift = CRICR_RTB1T_SHIFT;
1097 - control_reg = QEIC_CRICR;
1098 - break;
1099 - default:
1100 - return -EINVAL;
1101 - }
1102 -
1103 - shift += (2 - priority) * 2;
1104 - temp = qe_ic_read(qe_ic->regs, control_reg);
1105 - temp &= ~(SIGNAL_MASK << shift);
1106 - temp |= (high ? SIGNAL_HIGH : SIGNAL_LOW) << shift;
1107 - qe_ic_write(qe_ic->regs, control_reg, temp);
1108 -
1109 - return 0;
1110 -}
1111 -
1112 -static struct bus_type qe_ic_subsys = {
1113 - .name = "qe_ic",
1114 - .dev_name = "qe_ic",
1115 -};
1116 -
1117 -static struct device device_qe_ic = {
1118 - .id = 0,
1119 - .bus = &qe_ic_subsys,
1120 -};
1121 -
1122 -static int __init init_qe_ic_sysfs(void)
1123 -{
1124 - int rc;
1125 -
1126 - printk(KERN_DEBUG "Registering qe_ic with sysfs...\n");
1127 -
1128 - rc = subsys_system_register(&qe_ic_subsys, NULL);
1129 - if (rc) {
1130 - printk(KERN_ERR "Failed registering qe_ic sys class\n");
1131 - return -ENODEV;
1132 - }
1133 - rc = device_register(&device_qe_ic);
1134 - if (rc) {
1135 - printk(KERN_ERR "Failed registering qe_ic sys device\n");
1136 - return -ENODEV;
1137 - }
1138 - return 0;
1139 -}
1140 -
1141 -subsys_initcall(init_qe_ic_sysfs);
1142 --- a/drivers/soc/fsl/qe/qe_ic.h
1143 +++ /dev/null
1144 @@ -1,99 +0,0 @@
1145 -/* SPDX-License-Identifier: GPL-2.0-or-later */
1146 -/*
1147 - * drivers/soc/fsl/qe/qe_ic.h
1148 - *
1149 - * QUICC ENGINE Interrupt Controller Header
1150 - *
1151 - * Copyright (C) 2006 Freescale Semiconductor, Inc. All rights reserved.
1152 - *
1153 - * Author: Li Yang <leoli@freescale.com>
1154 - * Based on code from Shlomi Gridish <gridish@freescale.com>
1155 - */
1156 -#ifndef _POWERPC_SYSDEV_QE_IC_H
1157 -#define _POWERPC_SYSDEV_QE_IC_H
1158 -
1159 -#include <soc/fsl/qe/qe_ic.h>
1160 -
1161 -#define NR_QE_IC_INTS 64
1162 -
1163 -/* QE IC registers offset */
1164 -#define QEIC_CICR 0x00
1165 -#define QEIC_CIVEC 0x04
1166 -#define QEIC_CRIPNR 0x08
1167 -#define QEIC_CIPNR 0x0c
1168 -#define QEIC_CIPXCC 0x10
1169 -#define QEIC_CIPYCC 0x14
1170 -#define QEIC_CIPWCC 0x18
1171 -#define QEIC_CIPZCC 0x1c
1172 -#define QEIC_CIMR 0x20
1173 -#define QEIC_CRIMR 0x24
1174 -#define QEIC_CICNR 0x28
1175 -#define QEIC_CIPRTA 0x30
1176 -#define QEIC_CIPRTB 0x34
1177 -#define QEIC_CRICR 0x3c
1178 -#define QEIC_CHIVEC 0x60
1179 -
1180 -/* Interrupt priority registers */
1181 -#define CIPCC_SHIFT_PRI0 29
1182 -#define CIPCC_SHIFT_PRI1 26
1183 -#define CIPCC_SHIFT_PRI2 23
1184 -#define CIPCC_SHIFT_PRI3 20
1185 -#define CIPCC_SHIFT_PRI4 13
1186 -#define CIPCC_SHIFT_PRI5 10
1187 -#define CIPCC_SHIFT_PRI6 7
1188 -#define CIPCC_SHIFT_PRI7 4
1189 -
1190 -/* CICR priority modes */
1191 -#define CICR_GWCC 0x00040000
1192 -#define CICR_GXCC 0x00020000
1193 -#define CICR_GYCC 0x00010000
1194 -#define CICR_GZCC 0x00080000
1195 -#define CICR_GRTA 0x00200000
1196 -#define CICR_GRTB 0x00400000
1197 -#define CICR_HPIT_SHIFT 8
1198 -#define CICR_HPIT_MASK 0x00000300
1199 -#define CICR_HP_SHIFT 24
1200 -#define CICR_HP_MASK 0x3f000000
1201 -
1202 -/* CICNR */
1203 -#define CICNR_WCC1T_SHIFT 20
1204 -#define CICNR_ZCC1T_SHIFT 28
1205 -#define CICNR_YCC1T_SHIFT 12
1206 -#define CICNR_XCC1T_SHIFT 4
1207 -
1208 -/* CRICR */
1209 -#define CRICR_RTA1T_SHIFT 20
1210 -#define CRICR_RTB1T_SHIFT 28
1211 -
1212 -/* Signal indicator */
1213 -#define SIGNAL_MASK 3
1214 -#define SIGNAL_HIGH 2
1215 -#define SIGNAL_LOW 0
1216 -
1217 -struct qe_ic {
1218 - /* Control registers offset */
1219 - volatile u32 __iomem *regs;
1220 -
1221 - /* The remapper for this QEIC */
1222 - struct irq_domain *irqhost;
1223 -
1224 - /* The "linux" controller struct */
1225 - struct irq_chip hc_irq;
1226 -
1227 - /* VIRQ numbers of QE high/low irqs */
1228 - unsigned int virq_high;
1229 - unsigned int virq_low;
1230 -};
1231 -
1232 -/*
1233 - * QE interrupt controller internal structure
1234 - */
1235 -struct qe_ic_info {
1236 - u32 mask; /* location of this source at the QIMR register. */
1237 - u32 mask_reg; /* Mask register offset */
1238 - u8 pri_code; /* for grouped interrupts sources - the interrupt
1239 - code as appears at the group priority register */
1240 - u32 pri_reg; /* Group priority register offset */
1241 -};
1242 -
1243 -#endif /* _POWERPC_SYSDEV_QE_IC_H */