1 /* Blackfin System Interrupt Controller (SIC) model.
3 Copyright (C) 2010-2011 Free Software Foundation, Inc.
4 Contributed by Analog Devices, Inc.
6 This file is part of simulators.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
25 #include "dv-bfin_sic.h"
26 #include "dv-bfin_cec.h"
30 /* We assume first element is the base. */
33 /* Order after here is important -- matches hardware MMR layout. */
34 bu16
BFIN_MMR_16(swrst
);
35 bu16
BFIN_MMR_16(syscr
);
36 bu16
BFIN_MMR_16(rvect
); /* XXX: BF59x has a 32bit AUX_REVID here. */
40 bu32 iar0
, iar1
, iar2
, iar3
;
44 bu32 iar4
, iar5
, iar6
, iar7
;
49 bu32 iar0
, iar1
, iar2
, iar3
;
53 bu32 imask0
, imask1
, imask2
;
54 bu32 isr0
, isr1
, isr2
;
55 bu32 iwr0
, iwr1
, iwr2
;
56 bu32 iar0
, iar1
, iar2
, iar3
;
57 bu32 iar4
, iar5
, iar6
, iar7
;
58 bu32 iar8
, iar9
, iar10
, iar11
;
62 bu32 iar0
, iar1
, iar2
, iar3
;
63 bu32 iar4
, iar5
, iar6
, iar7
;
69 #define mmr_base() offsetof(struct bfin_sic, swrst)
70 #define mmr_offset(mmr) (offsetof(struct bfin_sic, mmr) - mmr_base())
71 #define mmr_idx(mmr) (mmr_offset (mmr) / 4)
73 static const char * const bf52x_mmr_names
[] =
75 "SWRST", "SYSCR", "SIC_RVECT", "SIC_IMASK0", "SIC_IAR0", "SIC_IAR1",
76 "SIC_IAR2", "SIC_IAR3", "SIC_ISR0", "SIC_IWR0",
77 [mmr_idx (bf52x
.imask1
)] = "SIC_IMASK1", "SIC_IAR4", "SIC_IAR5",
78 "SIC_IAR6", "SIC_IAR7", "SIC_ISR1", "SIC_IWR1",
80 static const char * const bf537_mmr_names
[] =
82 "SWRST", "SYSCR", "SIC_RVECT", "SIC_IMASK", "SIC_IAR0", "SIC_IAR1",
83 "SIC_IAR2", "SIC_IAR3", "SIC_ISR", "SIC_IWR",
85 static const char * const bf54x_mmr_names
[] =
87 "SWRST", "SYSCR", "SIC_RVECT", "SIC_IMASK0", "SIC_IMASK1", "SIC_IMASK2",
88 "SIC_ISR0", "SIC_ISR1", "SIC_ISR2", "SIC_IWR0", "SIC_IWR1", "SIC_IWR2",
89 "SIC_IAR0", "SIC_IAR1", "SIC_IAR2", "SIC_IAR3",
90 "SIC_IAR4", "SIC_IAR5", "SIC_IAR6", "SIC_IAR7",
91 "SIC_IAR8", "SIC_IAR9", "SIC_IAR10", "SIC_IAR11",
93 static const char * const bf561_mmr_names
[] =
95 "SWRST", "SYSCR", "SIC_RVECT", "SIC_IMASK0", "SIC_IMASK1",
96 "SIC_IAR0", "SIC_IAR1", "SIC_IAR2", "SIC_IAR3",
97 "SIC_IAR4", "SIC_IAR5", "SIC_IAR6", "SIC_IAR7",
98 "SIC_ISR0", "SIC_ISR1", "SIC_IWR0", "SIC_IWR1",
100 static const char * const *mmr_names
;
101 #define mmr_name(off) (mmr_names[(off) / 4] ? : "<INV>")
104 bfin_sic_forward_interrupts (struct hw
*me
, bu32
*isr
, bu32
*imask
, bu32
*iar
)
109 /* Process pending and unmasked interrupts. */
110 ipend
= *isr
& *imask
;
112 /* Usually none are pending unmasked, so avoid bit twiddling. */
116 for (my_port
= 0; my_port
< 32; ++my_port
)
118 bu32 iar_idx
, iar_off
, iar_val
;
119 bu32 bit
= (1 << my_port
);
121 /* This bit isn't pending, so check next one. */
125 /* The IAR registers map the System input to the Core output.
126 Every 4 bits in the IAR are used to map to IVG{7..15}. */
127 iar_idx
= my_port
/ 8;
128 iar_off
= (my_port
% 8) * 4;
129 iar_val
= (iar
[iar_idx
] & (0xf << iar_off
)) >> iar_off
;
130 hw_port_event (me
, IVG7
+ iar_val
, 1);
135 bfin_sic_52x_forward_interrupts (struct hw
*me
, struct bfin_sic
*sic
)
137 bfin_sic_forward_interrupts (me
, &sic
->bf52x
.isr0
, &sic
->bf52x
.imask0
, &sic
->bf52x
.iar0
);
138 bfin_sic_forward_interrupts (me
, &sic
->bf52x
.isr1
, &sic
->bf52x
.imask1
, &sic
->bf52x
.iar4
);
142 bfin_sic_52x_io_write_buffer (struct hw
*me
, const void *source
, int space
,
143 address_word addr
, unsigned nr_bytes
)
145 struct bfin_sic
*sic
= hw_data (me
);
153 value
= dv_load_4 (source
);
155 value
= dv_load_2 (source
);
157 mmr_off
= addr
- sic
->base
;
158 valuep
= (void *)((unsigned long)sic
+ mmr_base() + mmr_off
);
164 /* XXX: Discard all SIC writes for now. */
167 case mmr_offset(swrst
):
168 /* XXX: This should trigger a software reset ... */
170 case mmr_offset(syscr
):
171 /* XXX: what to do ... */
173 case mmr_offset(bf52x
.imask0
):
174 case mmr_offset(bf52x
.imask1
):
175 bfin_sic_52x_forward_interrupts (me
, sic
);
178 case mmr_offset(bf52x
.iar0
) ... mmr_offset(bf52x
.iar3
):
179 case mmr_offset(bf52x
.iar4
) ... mmr_offset(bf52x
.iar7
):
180 case mmr_offset(bf52x
.iwr0
):
181 case mmr_offset(bf52x
.iwr1
):
184 case mmr_offset(bf52x
.isr0
):
185 case mmr_offset(bf52x
.isr1
):
186 /* ISR is read-only. */
189 /* XXX: Should discard other writes. */
197 bfin_sic_52x_io_read_buffer (struct hw
*me
, void *dest
, int space
,
198 address_word addr
, unsigned nr_bytes
)
200 struct bfin_sic
*sic
= hw_data (me
);
206 mmr_off
= addr
- sic
->base
;
207 valuep
= (void *)((unsigned long)sic
+ mmr_base() + mmr_off
);
215 case mmr_offset(swrst
):
216 case mmr_offset(syscr
):
217 case mmr_offset(rvect
):
218 dv_store_2 (dest
, *value16p
);
220 case mmr_offset(bf52x
.imask0
):
221 case mmr_offset(bf52x
.imask1
):
222 case mmr_offset(bf52x
.iar0
) ... mmr_offset(bf52x
.iar3
):
223 case mmr_offset(bf52x
.iar4
) ... mmr_offset(bf52x
.iar7
):
224 case mmr_offset(bf52x
.iwr0
):
225 case mmr_offset(bf52x
.iwr1
):
226 case mmr_offset(bf52x
.isr0
):
227 case mmr_offset(bf52x
.isr1
):
228 dv_store_4 (dest
, *value32p
);
232 dv_store_2 (dest
, 0);
234 dv_store_4 (dest
, 0);
242 bfin_sic_537_forward_interrupts (struct hw
*me
, struct bfin_sic
*sic
)
244 bfin_sic_forward_interrupts (me
, &sic
->bf537
.isr
, &sic
->bf537
.imask
, &sic
->bf537
.iar0
);
248 bfin_sic_537_io_write_buffer (struct hw
*me
, const void *source
, int space
,
249 address_word addr
, unsigned nr_bytes
)
251 struct bfin_sic
*sic
= hw_data (me
);
259 value
= dv_load_4 (source
);
261 value
= dv_load_2 (source
);
263 mmr_off
= addr
- sic
->base
;
264 valuep
= (void *)((unsigned long)sic
+ mmr_base() + mmr_off
);
270 /* XXX: Discard all SIC writes for now. */
273 case mmr_offset(swrst
):
274 /* XXX: This should trigger a software reset ... */
276 case mmr_offset(syscr
):
277 /* XXX: what to do ... */
279 case mmr_offset(bf537
.imask
):
280 bfin_sic_537_forward_interrupts (me
, sic
);
283 case mmr_offset(bf537
.iar0
):
284 case mmr_offset(bf537
.iar1
):
285 case mmr_offset(bf537
.iar2
):
286 case mmr_offset(bf537
.iar3
):
287 case mmr_offset(bf537
.iwr
):
290 case mmr_offset(bf537
.isr
):
291 /* ISR is read-only. */
294 /* XXX: Should discard other writes. */
302 bfin_sic_537_io_read_buffer (struct hw
*me
, void *dest
, int space
,
303 address_word addr
, unsigned nr_bytes
)
305 struct bfin_sic
*sic
= hw_data (me
);
311 mmr_off
= addr
- sic
->base
;
312 valuep
= (void *)((unsigned long)sic
+ mmr_base() + mmr_off
);
320 case mmr_offset(swrst
):
321 case mmr_offset(syscr
):
322 case mmr_offset(rvect
):
323 dv_store_2 (dest
, *value16p
);
325 case mmr_offset(bf537
.imask
):
326 case mmr_offset(bf537
.iar0
):
327 case mmr_offset(bf537
.iar1
):
328 case mmr_offset(bf537
.iar2
):
329 case mmr_offset(bf537
.iar3
):
330 case mmr_offset(bf537
.isr
):
331 case mmr_offset(bf537
.iwr
):
332 dv_store_4 (dest
, *value32p
);
336 dv_store_2 (dest
, 0);
338 dv_store_4 (dest
, 0);
346 bfin_sic_54x_forward_interrupts (struct hw
*me
, struct bfin_sic
*sic
)
348 bfin_sic_forward_interrupts (me
, &sic
->bf54x
.isr0
, &sic
->bf54x
.imask0
, &sic
->bf54x
.iar0
);
349 bfin_sic_forward_interrupts (me
, &sic
->bf54x
.isr1
, &sic
->bf54x
.imask1
, &sic
->bf54x
.iar4
);
350 bfin_sic_forward_interrupts (me
, &sic
->bf54x
.isr2
, &sic
->bf54x
.imask2
, &sic
->bf54x
.iar8
);
354 bfin_sic_54x_io_write_buffer (struct hw
*me
, const void *source
, int space
,
355 address_word addr
, unsigned nr_bytes
)
357 struct bfin_sic
*sic
= hw_data (me
);
365 value
= dv_load_4 (source
);
367 value
= dv_load_2 (source
);
369 mmr_off
= addr
- sic
->base
;
370 valuep
= (void *)((unsigned long)sic
+ mmr_base() + mmr_off
);
376 /* XXX: Discard all SIC writes for now. */
379 case mmr_offset(swrst
):
380 /* XXX: This should trigger a software reset ... */
382 case mmr_offset(syscr
):
383 /* XXX: what to do ... */
385 case mmr_offset(bf54x
.imask0
) ... mmr_offset(bf54x
.imask2
):
386 bfin_sic_54x_forward_interrupts (me
, sic
);
389 case mmr_offset(bf54x
.iar0
) ... mmr_offset(bf54x
.iar11
):
390 case mmr_offset(bf54x
.iwr0
) ... mmr_offset(bf54x
.iwr2
):
393 case mmr_offset(bf54x
.isr0
) ... mmr_offset(bf54x
.isr2
):
394 /* ISR is read-only. */
397 /* XXX: Should discard other writes. */
405 bfin_sic_54x_io_read_buffer (struct hw
*me
, void *dest
, int space
,
406 address_word addr
, unsigned nr_bytes
)
408 struct bfin_sic
*sic
= hw_data (me
);
414 mmr_off
= addr
- sic
->base
;
415 valuep
= (void *)((unsigned long)sic
+ mmr_base() + mmr_off
);
423 case mmr_offset(swrst
):
424 case mmr_offset(syscr
):
425 case mmr_offset(rvect
):
426 dv_store_2 (dest
, *value16p
);
428 case mmr_offset(bf54x
.imask0
) ... mmr_offset(bf54x
.imask2
):
429 case mmr_offset(bf54x
.iar0
) ... mmr_offset(bf54x
.iar11
):
430 case mmr_offset(bf54x
.iwr0
) ... mmr_offset(bf54x
.iwr2
):
431 case mmr_offset(bf54x
.isr0
) ... mmr_offset(bf54x
.isr2
):
432 dv_store_4 (dest
, *value32p
);
436 dv_store_2 (dest
, 0);
438 dv_store_4 (dest
, 0);
446 bfin_sic_561_forward_interrupts (struct hw
*me
, struct bfin_sic
*sic
)
448 bfin_sic_forward_interrupts (me
, &sic
->bf561
.isr0
, &sic
->bf561
.imask0
, &sic
->bf561
.iar0
);
449 bfin_sic_forward_interrupts (me
, &sic
->bf561
.isr1
, &sic
->bf561
.imask1
, &sic
->bf561
.iar4
);
453 bfin_sic_561_io_write_buffer (struct hw
*me
, const void *source
, int space
,
454 address_word addr
, unsigned nr_bytes
)
456 struct bfin_sic
*sic
= hw_data (me
);
464 value
= dv_load_4 (source
);
466 value
= dv_load_2 (source
);
468 mmr_off
= addr
- sic
->base
;
469 valuep
= (void *)((unsigned long)sic
+ mmr_base() + mmr_off
);
475 /* XXX: Discard all SIC writes for now. */
478 case mmr_offset(swrst
):
479 /* XXX: This should trigger a software reset ... */
481 case mmr_offset(syscr
):
482 /* XXX: what to do ... */
484 case mmr_offset(bf561
.imask0
):
485 case mmr_offset(bf561
.imask1
):
486 bfin_sic_561_forward_interrupts (me
, sic
);
489 case mmr_offset(bf561
.iar0
) ... mmr_offset(bf561
.iar3
):
490 case mmr_offset(bf561
.iar4
) ... mmr_offset(bf561
.iar7
):
491 case mmr_offset(bf561
.iwr0
):
492 case mmr_offset(bf561
.iwr1
):
495 case mmr_offset(bf561
.isr0
):
496 case mmr_offset(bf561
.isr1
):
497 /* ISR is read-only. */
500 /* XXX: Should discard other writes. */
508 bfin_sic_561_io_read_buffer (struct hw
*me
, void *dest
, int space
,
509 address_word addr
, unsigned nr_bytes
)
511 struct bfin_sic
*sic
= hw_data (me
);
517 mmr_off
= addr
- sic
->base
;
518 valuep
= (void *)((unsigned long)sic
+ mmr_base() + mmr_off
);
526 case mmr_offset(swrst
):
527 case mmr_offset(syscr
):
528 case mmr_offset(rvect
):
529 dv_store_2 (dest
, *value16p
);
531 case mmr_offset(bf561
.imask0
):
532 case mmr_offset(bf561
.imask1
):
533 case mmr_offset(bf561
.iar0
) ... mmr_offset(bf561
.iar3
):
534 case mmr_offset(bf561
.iar4
) ... mmr_offset(bf561
.iar7
):
535 case mmr_offset(bf561
.iwr0
):
536 case mmr_offset(bf561
.iwr1
):
537 case mmr_offset(bf561
.isr0
):
538 case mmr_offset(bf561
.isr1
):
539 dv_store_4 (dest
, *value32p
);
543 dv_store_2 (dest
, 0);
545 dv_store_4 (dest
, 0);
552 /* XXX: This doesn't handle DMA<->peripheral mappings. */
553 #define BFIN_SIC_TO_CEC_PORTS \
554 { "ivg7", IVG7, 0, output_port, }, \
555 { "ivg8", IVG8, 0, output_port, }, \
556 { "ivg9", IVG9, 0, output_port, }, \
557 { "ivg10", IVG10, 0, output_port, }, \
558 { "ivg11", IVG11, 0, output_port, }, \
559 { "ivg12", IVG12, 0, output_port, }, \
560 { "ivg13", IVG13, 0, output_port, }, \
561 { "ivg14", IVG14, 0, output_port, }, \
562 { "ivg15", IVG15, 0, output_port, },
564 static const struct hw_port_descriptor bfin_sic_50x_ports
[] =
566 BFIN_SIC_TO_CEC_PORTS
568 { "pll", 0, 0, input_port
, },
569 { "dma_stat", 1, 0, input_port
, },
570 { "ppi@0", 2, 0, input_port
, },
571 { "sport@0_stat", 3, 0, input_port
, },
572 { "sport@1_stat", 4, 0, input_port
, },
573 { "uart2@0_stat", 5, 0, input_port
, },
574 { "uart2@1_stat", 6, 0, input_port
, },
575 { "spi@0", 7, 0, input_port
, },
576 { "spi@1", 8, 0, input_port
, },
577 { "can_stat", 9, 0, input_port
, },
578 { "rsi_int0", 10, 0, input_port
, },
579 /*{ "reserved", 11, 0, input_port, },*/
580 { "counter@0", 12, 0, input_port
, },
581 { "counter@1", 13, 0, input_port
, },
582 { "dma@0", 14, 0, input_port
, },
583 { "dma@1", 15, 0, input_port
, },
584 { "dma@2", 16, 0, input_port
, },
585 { "dma@3", 17, 0, input_port
, },
586 { "dma@4", 18, 0, input_port
, },
587 { "dma@5", 19, 0, input_port
, },
588 { "dma@6", 20, 0, input_port
, },
589 { "dma@7", 21, 0, input_port
, },
590 { "dma@8", 22, 0, input_port
, },
591 { "dma@9", 23, 0, input_port
, },
592 { "dma@10", 24, 0, input_port
, },
593 { "dma@11", 25, 0, input_port
, },
594 { "can_rx", 26, 0, input_port
, },
595 { "can_tx", 27, 0, input_port
, },
596 { "twi@0", 28, 0, input_port
, },
597 { "portf_irq_a", 29, 0, input_port
, },
598 { "portf_irq_b", 30, 0, input_port
, },
599 /*{ "reserved", 31, 0, input_port, },*/
601 { "gptimer@0", 100, 0, input_port
, },
602 { "gptimer@1", 101, 0, input_port
, },
603 { "gptimer@2", 102, 0, input_port
, },
604 { "gptimer@3", 103, 0, input_port
, },
605 { "gptimer@4", 104, 0, input_port
, },
606 { "gptimer@5", 105, 0, input_port
, },
607 { "gptimer@6", 106, 0, input_port
, },
608 { "gptimer@7", 107, 0, input_port
, },
609 { "portg_irq_a", 108, 0, input_port
, },
610 { "portg_irq_b", 109, 0, input_port
, },
611 { "mdma@0", 110, 0, input_port
, },
612 { "mdma@1", 111, 0, input_port
, },
613 { "wdog", 112, 0, input_port
, },
614 { "porth_irq_a", 113, 0, input_port
, },
615 { "porth_irq_b", 114, 0, input_port
, },
616 { "acm_stat", 115, 0, input_port
, },
617 { "acm_int", 116, 0, input_port
, },
618 /*{ "reserved", 117, 0, input_port, },*/
619 /*{ "reserved", 118, 0, input_port, },*/
620 { "pwm@0_trip", 119, 0, input_port
, },
621 { "pwm@0_sync", 120, 0, input_port
, },
622 { "pwm@1_trip", 121, 0, input_port
, },
623 { "pwm@1_sync", 122, 0, input_port
, },
624 { "rsi_int1", 123, 0, input_port
, },
628 static const struct hw_port_descriptor bfin_sic_51x_ports
[] =
630 BFIN_SIC_TO_CEC_PORTS
632 { "pll", 0, 0, input_port
, },
633 { "dma_stat", 1, 0, input_port
, },
634 { "dmar0_block", 2, 0, input_port
, },
635 { "dmar1_block", 3, 0, input_port
, },
636 { "dmar0_over", 4, 0, input_port
, },
637 { "dmar1_over", 5, 0, input_port
, },
638 { "ppi@0", 6, 0, input_port
, },
639 { "emac_stat", 7, 0, input_port
, },
640 { "sport@0_stat", 8, 0, input_port
, },
641 { "sport@1_stat", 9, 0, input_port
, },
642 { "ptp_err", 10, 0, input_port
, },
643 /*{ "reserved", 11, 0, input_port, },*/
644 { "uart@0_stat", 12, 0, input_port
, },
645 { "uart@1_stat", 13, 0, input_port
, },
646 { "rtc", 14, 0, input_port
, },
647 { "dma@0", 15, 0, input_port
, },
648 { "dma@3", 16, 0, input_port
, },
649 { "dma@4", 17, 0, input_port
, },
650 { "dma@5", 18, 0, input_port
, },
651 { "dma@6", 19, 0, input_port
, },
652 { "twi@0", 20, 0, input_port
, },
653 { "dma@7", 21, 0, input_port
, },
654 { "dma@8", 22, 0, input_port
, },
655 { "dma@9", 23, 0, input_port
, },
656 { "dma@10", 24, 0, input_port
, },
657 { "dma@11", 25, 0, input_port
, },
658 { "otp", 26, 0, input_port
, },
659 { "counter", 27, 0, input_port
, },
660 { "dma@1", 28, 0, input_port
, },
661 { "porth_irq_a", 29, 0, input_port
, },
662 { "dma@2", 30, 0, input_port
, },
663 { "porth_irq_b", 31, 0, input_port
, },
665 { "gptimer@0", 100, 0, input_port
, },
666 { "gptimer@1", 101, 0, input_port
, },
667 { "gptimer@2", 102, 0, input_port
, },
668 { "gptimer@3", 103, 0, input_port
, },
669 { "gptimer@4", 104, 0, input_port
, },
670 { "gptimer@5", 105, 0, input_port
, },
671 { "gptimer@6", 106, 0, input_port
, },
672 { "gptimer@7", 107, 0, input_port
, },
673 { "portg_irq_a", 108, 0, input_port
, },
674 { "portg_irq_b", 109, 0, input_port
, },
675 { "mdma@0", 110, 0, input_port
, },
676 { "mdma@1", 111, 0, input_port
, },
677 { "wdog", 112, 0, input_port
, },
678 { "portf_irq_a", 113, 0, input_port
, },
679 { "portf_irq_b", 114, 0, input_port
, },
680 { "spi@0", 115, 0, input_port
, },
681 { "spi@1", 116, 0, input_port
, },
682 /*{ "reserved", 117, 0, input_port, },*/
683 /*{ "reserved", 118, 0, input_port, },*/
684 { "rsi_int0", 119, 0, input_port
, },
685 { "rsi_int1", 120, 0, input_port
, },
686 { "pwm_trip", 121, 0, input_port
, },
687 { "pwm_sync", 122, 0, input_port
, },
688 { "ptp_stat", 123, 0, input_port
, },
692 static const struct hw_port_descriptor bfin_sic_52x_ports
[] =
694 BFIN_SIC_TO_CEC_PORTS
696 { "pll", 0, 0, input_port
, },
697 { "dma_stat", 1, 0, input_port
, },
698 { "dmar0_block", 2, 0, input_port
, },
699 { "dmar1_block", 3, 0, input_port
, },
700 { "dmar0_over", 4, 0, input_port
, },
701 { "dmar1_over", 5, 0, input_port
, },
702 { "ppi@0", 6, 0, input_port
, },
703 { "emac_stat", 7, 0, input_port
, },
704 { "sport@0_stat", 8, 0, input_port
, },
705 { "sport@1_stat", 9, 0, input_port
, },
706 /*{ "reserved", 10, 0, input_port, },*/
707 /*{ "reserved", 11, 0, input_port, },*/
708 { "uart@0_stat", 12, 0, input_port
, },
709 { "uart@1_stat", 13, 0, input_port
, },
710 { "rtc", 14, 0, input_port
, },
711 { "dma@0", 15, 0, input_port
, },
712 { "dma@3", 16, 0, input_port
, },
713 { "dma@4", 17, 0, input_port
, },
714 { "dma@5", 18, 0, input_port
, },
715 { "dma@6", 19, 0, input_port
, },
716 { "twi@0", 20, 0, input_port
, },
717 { "dma@7", 21, 0, input_port
, },
718 { "dma@8", 22, 0, input_port
, },
719 { "dma@9", 23, 0, input_port
, },
720 { "dma@10", 24, 0, input_port
, },
721 { "dma@11", 25, 0, input_port
, },
722 { "otp", 26, 0, input_port
, },
723 { "counter", 27, 0, input_port
, },
724 { "dma@1", 28, 0, input_port
, },
725 { "porth_irq_a", 29, 0, input_port
, },
726 { "dma@2", 30, 0, input_port
, },
727 { "porth_irq_b", 31, 0, input_port
, },
729 { "gptimer@0", 100, 0, input_port
, },
730 { "gptimer@1", 101, 0, input_port
, },
731 { "gptimer@2", 102, 0, input_port
, },
732 { "gptimer@3", 103, 0, input_port
, },
733 { "gptimer@4", 104, 0, input_port
, },
734 { "gptimer@5", 105, 0, input_port
, },
735 { "gptimer@6", 106, 0, input_port
, },
736 { "gptimer@7", 107, 0, input_port
, },
737 { "portg_irq_a", 108, 0, input_port
, },
738 { "portg_irq_b", 109, 0, input_port
, },
739 { "mdma@0", 110, 0, input_port
, },
740 { "mdma@1", 111, 0, input_port
, },
741 { "wdog", 112, 0, input_port
, },
742 { "portf_irq_a", 113, 0, input_port
, },
743 { "portf_irq_b", 114, 0, input_port
, },
744 { "spi@0", 115, 0, input_port
, },
745 { "nfc_stat", 116, 0, input_port
, },
746 { "hostdp_stat", 117, 0, input_port
, },
747 { "hostdp_done", 118, 0, input_port
, },
748 { "usb_int0", 120, 0, input_port
, },
749 { "usb_int1", 121, 0, input_port
, },
750 { "usb_int2", 122, 0, input_port
, },
755 bfin_sic_52x_port_event (struct hw
*me
, int my_port
, struct hw
*source
,
756 int source_port
, int level
)
758 struct bfin_sic
*sic
= hw_data (me
);
759 bu32 idx
= my_port
/ 100;
760 bu32 bit
= (1 << (my_port
& 0x1f));
762 /* SIC only exists to forward interrupts from the system to the CEC. */
765 case 0: sic
->bf52x
.isr0
|= bit
; break;
766 case 1: sic
->bf52x
.isr1
|= bit
; break;
769 /* XXX: Handle SIC wakeup source ?
770 if (sic->bf52x.iwr0 & bit)
772 if (sic->bf52x.iwr1 & bit)
776 bfin_sic_52x_forward_interrupts (me
, sic
);
779 static const struct hw_port_descriptor bfin_sic_533_ports
[] =
781 BFIN_SIC_TO_CEC_PORTS
782 { "pll", 0, 0, input_port
, },
783 { "dma_stat", 1, 0, input_port
, },
784 { "ppi@0", 2, 0, input_port
, },
785 { "sport@0_stat", 3, 0, input_port
, },
786 { "sport@1_stat", 4, 0, input_port
, },
787 { "spi@0", 5, 0, input_port
, },
788 { "uart@0_stat", 6, 0, input_port
, },
789 { "rtc", 7, 0, input_port
, },
790 { "dma@0", 8, 0, input_port
, },
791 { "dma@1", 9, 0, input_port
, },
792 { "dma@2", 10, 0, input_port
, },
793 { "dma@3", 11, 0, input_port
, },
794 { "dma@4", 12, 0, input_port
, },
795 { "dma@5", 13, 0, input_port
, },
796 { "dma@6", 14, 0, input_port
, },
797 { "dma@7", 15, 0, input_port
, },
798 { "gptimer@0", 16, 0, input_port
, },
799 { "gptimer@1", 17, 0, input_port
, },
800 { "gptimer@2", 18, 0, input_port
, },
801 { "portf_irq_a", 19, 0, input_port
, },
802 { "portf_irq_b", 20, 0, input_port
, },
803 { "mdma@0", 21, 0, input_port
, },
804 { "mdma@1", 22, 0, input_port
, },
805 { "wdog", 23, 0, input_port
, },
810 bfin_sic_533_port_event (struct hw
*me
, int my_port
, struct hw
*source
,
811 int source_port
, int level
)
813 struct bfin_sic
*sic
= hw_data (me
);
814 bu32 bit
= (1 << my_port
);
816 /* SIC only exists to forward interrupts from the system to the CEC. */
817 sic
->bf537
.isr
|= bit
;
819 /* XXX: Handle SIC wakeup source ?
820 if (sic->bf537.iwr & bit)
824 bfin_sic_537_forward_interrupts (me
, sic
);
827 static const struct hw_port_descriptor bfin_sic_537_ports
[] =
829 BFIN_SIC_TO_CEC_PORTS
830 { "pll", 0, 0, input_port
, },
831 { "dma_stat", 10, 0, input_port
, },
832 { "dmar0_block", 11, 0, input_port
, },
833 { "dmar1_block", 12, 0, input_port
, },
834 { "dmar0_over", 13, 0, input_port
, },
835 { "dmar1_over", 14, 0, input_port
, },
836 { "can_stat", 20, 0, input_port
, },
837 { "emac_stat", 21, 0, input_port
, },
838 { "sport@0_stat", 22, 0, input_port
, },
839 { "sport@1_stat", 23, 0, input_port
, },
840 { "ppi@0", 24, 0, input_port
, },
841 { "spi@0", 25, 0, input_port
, },
842 { "uart@0_stat", 26, 0, input_port
, },
843 { "uart@1_stat", 27, 0, input_port
, },
844 { "rtc", 30, 0, input_port
, },
845 { "dma@0", 40, 0, input_port
, },
846 { "dma@3", 50, 0, input_port
, },
847 { "dma@4", 60, 0, input_port
, },
848 { "dma@5", 70, 0, input_port
, },
849 { "dma@6", 80, 0, input_port
, },
850 { "twi@0", 90, 0, input_port
, },
851 { "dma@7", 100, 0, input_port
, },
852 { "dma@8", 110, 0, input_port
, },
853 { "dma@9", 120, 0, input_port
, },
854 { "dma@10", 130, 0, input_port
, },
855 { "dma@11", 140, 0, input_port
, },
856 { "can_rx", 150, 0, input_port
, },
857 { "can_tx", 160, 0, input_port
, },
858 { "dma@1", 170, 0, input_port
, },
859 { "porth_irq_a", 171, 0, input_port
, },
860 { "dma@2", 180, 0, input_port
, },
861 { "porth_irq_b", 181, 0, input_port
, },
862 { "gptimer@0", 190, 0, input_port
, },
863 { "gptimer@1", 200, 0, input_port
, },
864 { "gptimer@2", 210, 0, input_port
, },
865 { "gptimer@3", 220, 0, input_port
, },
866 { "gptimer@4", 230, 0, input_port
, },
867 { "gptimer@5", 240, 0, input_port
, },
868 { "gptimer@6", 250, 0, input_port
, },
869 { "gptimer@7", 260, 0, input_port
, },
870 { "portf_irq_a", 270, 0, input_port
, },
871 { "portg_irq_a", 271, 0, input_port
, },
872 { "portg_irq_b", 280, 0, input_port
, },
873 { "mdma@0", 290, 0, input_port
, },
874 { "mdma@1", 300, 0, input_port
, },
875 { "wdog", 310, 0, input_port
, },
876 { "portf_irq_b", 311, 0, input_port
, },
881 bfin_sic_537_port_event (struct hw
*me
, int my_port
, struct hw
*source
,
882 int source_port
, int level
)
884 struct bfin_sic
*sic
= hw_data (me
);
885 bu32 bit
= (1 << (my_port
/ 10));
887 /* SIC only exists to forward interrupts from the system to the CEC. */
888 sic
->bf537
.isr
|= bit
;
890 /* XXX: Handle SIC wakeup source ?
891 if (sic->bf537.iwr & bit)
895 bfin_sic_537_forward_interrupts (me
, sic
);
898 static const struct hw_port_descriptor bfin_sic_538_ports
[] =
900 BFIN_SIC_TO_CEC_PORTS
902 { "pll", 0, 0, input_port
, },
903 { "dmac@0_stat", 1, 0, input_port
, },
904 { "ppi@0", 2, 0, input_port
, },
905 { "sport@0_stat", 3, 0, input_port
, },
906 { "sport@1_stat", 4, 0, input_port
, },
907 { "spi@0", 5, 0, input_port
, },
908 { "uart@0_stat", 6, 0, input_port
, },
909 { "rtc", 7, 0, input_port
, },
910 { "dma@0", 8, 0, input_port
, },
911 { "dma@1", 9, 0, input_port
, },
912 { "dma@2", 10, 0, input_port
, },
913 { "dma@3", 11, 0, input_port
, },
914 { "dma@4", 12, 0, input_port
, },
915 { "dma@5", 13, 0, input_port
, },
916 { "dma@6", 14, 0, input_port
, },
917 { "dma@7", 15, 0, input_port
, },
918 { "gptimer@0", 16, 0, input_port
, },
919 { "gptimer@1", 17, 0, input_port
, },
920 { "gptimer@2", 18, 0, input_port
, },
921 { "portf_irq_a", 19, 0, input_port
, },
922 { "portf_irq_b", 20, 0, input_port
, },
923 { "mdma@0", 21, 0, input_port
, },
924 { "mdma@1", 22, 0, input_port
, },
925 { "wdog", 23, 0, input_port
, },
926 { "dmac@1_stat", 24, 0, input_port
, },
927 { "sport@2_stat", 25, 0, input_port
, },
928 { "sport@3_stat", 26, 0, input_port
, },
929 /*{ "reserved", 27, 0, input_port, },*/
930 { "spi@1", 28, 0, input_port
, },
931 { "spi@2", 29, 0, input_port
, },
932 { "uart@1_stat", 30, 0, input_port
, },
933 { "uart@2_stat", 31, 0, input_port
, },
935 { "can_stat", 100, 0, input_port
, },
936 { "dma@8", 101, 0, input_port
, },
937 { "dma@9", 102, 0, input_port
, },
938 { "dma@10", 103, 0, input_port
, },
939 { "dma@11", 104, 0, input_port
, },
940 { "dma@12", 105, 0, input_port
, },
941 { "dma@13", 106, 0, input_port
, },
942 { "dma@14", 107, 0, input_port
, },
943 { "dma@15", 108, 0, input_port
, },
944 { "dma@16", 109, 0, input_port
, },
945 { "dma@17", 110, 0, input_port
, },
946 { "dma@18", 111, 0, input_port
, },
947 { "dma@19", 112, 0, input_port
, },
948 { "twi@0", 113, 0, input_port
, },
949 { "twi@1", 114, 0, input_port
, },
950 { "can_rx", 115, 0, input_port
, },
951 { "can_tx", 116, 0, input_port
, },
952 { "mdma@2", 117, 0, input_port
, },
953 { "mdma@3", 118, 0, input_port
, },
957 static const struct hw_port_descriptor bfin_sic_54x_ports
[] =
959 BFIN_SIC_TO_CEC_PORTS
961 { "pll", 0, 0, input_port
, },
962 { "dmac@0_stat", 1, 0, input_port
, },
963 { "eppi@0", 2, 0, input_port
, },
964 { "sport@0_stat", 3, 0, input_port
, },
965 { "sport@1_stat", 4, 0, input_port
, },
966 { "spi@0", 5, 0, input_port
, },
967 { "uart2@0_stat", 6, 0, input_port
, },
968 { "rtc", 7, 0, input_port
, },
969 { "dma@12", 8, 0, input_port
, },
970 { "dma@0", 9, 0, input_port
, },
971 { "dma@1", 10, 0, input_port
, },
972 { "dma@2", 11, 0, input_port
, },
973 { "dma@3", 12, 0, input_port
, },
974 { "dma@4", 13, 0, input_port
, },
975 { "dma@6", 14, 0, input_port
, },
976 { "dma@7", 15, 0, input_port
, },
977 { "gptimer@8", 16, 0, input_port
, },
978 { "gptimer@9", 17, 0, input_port
, },
979 { "gptimer@10", 18, 0, input_port
, },
980 { "pint@0", 19, 0, input_port
, },
981 { "pint@1", 20, 0, input_port
, },
982 { "mdma@0", 21, 0, input_port
, },
983 { "mdma@1", 22, 0, input_port
, },
984 { "wdog", 23, 0, input_port
, },
985 { "dmac@1_stat", 24, 0, input_port
, },
986 { "sport@2_stat", 25, 0, input_port
, },
987 { "sport@3_stat", 26, 0, input_port
, },
988 { "mxvr", 27, 0, input_port
, },
989 { "spi@1", 28, 0, input_port
, },
990 { "spi@2", 29, 0, input_port
, },
991 { "uart2@1_stat", 30, 0, input_port
, },
992 { "uart2@2_stat", 31, 0, input_port
, },
994 { "can@0_stat", 32, 0, input_port
, },
995 { "dma@18", 33, 0, input_port
, },
996 { "dma@19", 34, 0, input_port
, },
997 { "dma@20", 35, 0, input_port
, },
998 { "dma@21", 36, 0, input_port
, },
999 { "dma@13", 37, 0, input_port
, },
1000 { "dma@14", 38, 0, input_port
, },
1001 { "dma@5", 39, 0, input_port
, },
1002 { "dma@23", 40, 0, input_port
, },
1003 { "dma@8", 41, 0, input_port
, },
1004 { "dma@9", 42, 0, input_port
, },
1005 { "dma@10", 43, 0, input_port
, },
1006 { "dma@11", 44, 0, input_port
, },
1007 { "twi@0", 45, 0, input_port
, },
1008 { "twi@1", 46, 0, input_port
, },
1009 { "can@0_rx", 47, 0, input_port
, },
1010 { "can@0_tx", 48, 0, input_port
, },
1011 { "mdma@2", 49, 0, input_port
, },
1012 { "mdma@3", 50, 0, input_port
, },
1013 { "mxvr_stat", 51, 0, input_port
, },
1014 { "mxvr_message", 52, 0, input_port
, },
1015 { "mxvr_packet", 53, 0, input_port
, },
1016 { "eppi@1", 54, 0, input_port
, },
1017 { "eppi@2", 55, 0, input_port
, },
1018 { "uart2@3_stat", 56, 0, input_port
, },
1019 { "hostdp", 57, 0, input_port
, },
1020 /*{ "reserved", 58, 0, input_port, },*/
1021 { "pixc_stat", 59, 0, input_port
, },
1022 { "nfc", 60, 0, input_port
, },
1023 { "atapi", 61, 0, input_port
, },
1024 { "can@1_stat", 62, 0, input_port
, },
1025 { "dmar", 63, 0, input_port
, },
1027 { "dma@15", 64, 0, input_port
, },
1028 { "dma@16", 65, 0, input_port
, },
1029 { "dma@17", 66, 0, input_port
, },
1030 { "dma@22", 67, 0, input_port
, },
1031 { "counter", 68, 0, input_port
, },
1032 { "key", 69, 0, input_port
, },
1033 { "can@1_rx", 70, 0, input_port
, },
1034 { "can@1_tx", 71, 0, input_port
, },
1035 { "sdh_mask0", 72, 0, input_port
, },
1036 { "sdh_mask1", 73, 0, input_port
, },
1037 /*{ "reserved", 74, 0, input_port, },*/
1038 { "usb_int0", 75, 0, input_port
, },
1039 { "usb_int1", 76, 0, input_port
, },
1040 { "usb_int2", 77, 0, input_port
, },
1041 { "usb_dma", 78, 0, input_port
, },
1042 { "otpsec", 79, 0, input_port
, },
1043 /*{ "reserved", 80, 0, input_port, },*/
1044 /*{ "reserved", 81, 0, input_port, },*/
1045 /*{ "reserved", 82, 0, input_port, },*/
1046 /*{ "reserved", 83, 0, input_port, },*/
1047 /*{ "reserved", 84, 0, input_port, },*/
1048 /*{ "reserved", 85, 0, input_port, },*/
1049 { "gptimer@0", 86, 0, input_port
, },
1050 { "gptimer@1", 87, 0, input_port
, },
1051 { "gptimer@2", 88, 0, input_port
, },
1052 { "gptimer@3", 89, 0, input_port
, },
1053 { "gptimer@4", 90, 0, input_port
, },
1054 { "gptimer@5", 91, 0, input_port
, },
1055 { "gptimer@6", 92, 0, input_port
, },
1056 { "gptimer@7", 93, 0, input_port
, },
1057 { "pint2", 94, 0, input_port
, },
1058 { "pint3", 95, 0, input_port
, },
1063 bfin_sic_54x_port_event (struct hw
*me
, int my_port
, struct hw
*source
,
1064 int source_port
, int level
)
1066 struct bfin_sic
*sic
= hw_data (me
);
1067 bu32 idx
= my_port
/ 100;
1068 bu32 bit
= (1 << (my_port
& 0x1f));
1070 /* SIC only exists to forward interrupts from the system to the CEC. */
1073 case 0: sic
->bf54x
.isr0
|= bit
; break;
1074 case 1: sic
->bf54x
.isr1
|= bit
; break;
1075 case 2: sic
->bf54x
.isr2
|= bit
; break;
1078 /* XXX: Handle SIC wakeup source ?
1079 if (sic->bf54x.iwr0 & bit)
1081 if (sic->bf54x.iwr1 & bit)
1083 if (sic->bf54x.iwr2 & bit)
1087 bfin_sic_54x_forward_interrupts (me
, sic
);
1090 static const struct hw_port_descriptor bfin_sic_561_ports
[] =
1092 BFIN_SIC_TO_CEC_PORTS
1094 { "pll", 0, 0, input_port
, },
1095 { "dmac@0_stat", 1, 0, input_port
, },
1096 { "dmac@1_stat", 2, 0, input_port
, },
1097 { "imdma_stat", 3, 0, input_port
, },
1098 { "ppi@0", 4, 0, input_port
, },
1099 { "ppi@1", 5, 0, input_port
, },
1100 { "sport@0_stat", 6, 0, input_port
, },
1101 { "sport@1_stat", 7, 0, input_port
, },
1102 { "spi@0", 8, 0, input_port
, },
1103 { "uart@0_stat", 9, 0, input_port
, },
1104 /*{ "reserved", 10, 0, input_port, },*/
1105 { "dma@12", 11, 0, input_port
, },
1106 { "dma@13", 12, 0, input_port
, },
1107 { "dma@14", 13, 0, input_port
, },
1108 { "dma@15", 14, 0, input_port
, },
1109 { "dma@16", 15, 0, input_port
, },
1110 { "dma@17", 16, 0, input_port
, },
1111 { "dma@18", 17, 0, input_port
, },
1112 { "dma@19", 18, 0, input_port
, },
1113 { "dma@20", 19, 0, input_port
, },
1114 { "dma@21", 20, 0, input_port
, },
1115 { "dma@22", 21, 0, input_port
, },
1116 { "dma@23", 22, 0, input_port
, },
1117 { "dma@0", 23, 0, input_port
, },
1118 { "dma@1", 24, 0, input_port
, },
1119 { "dma@2", 25, 0, input_port
, },
1120 { "dma@3", 26, 0, input_port
, },
1121 { "dma@4", 27, 0, input_port
, },
1122 { "dma@5", 28, 0, input_port
, },
1123 { "dma@6", 29, 0, input_port
, },
1124 { "dma@7", 30, 0, input_port
, },
1125 { "dma@8", 31, 0, input_port
, },
1127 { "dma@9", 100, 0, input_port
, },
1128 { "dma@10", 101, 0, input_port
, },
1129 { "dma@11", 102, 0, input_port
, },
1130 { "gptimer@0", 103, 0, input_port
, },
1131 { "gptimer@1", 104, 0, input_port
, },
1132 { "gptimer@2", 105, 0, input_port
, },
1133 { "gptimer@3", 106, 0, input_port
, },
1134 { "gptimer@4", 107, 0, input_port
, },
1135 { "gptimer@5", 108, 0, input_port
, },
1136 { "gptimer@6", 109, 0, input_port
, },
1137 { "gptimer@7", 110, 0, input_port
, },
1138 { "gptimer@8", 111, 0, input_port
, },
1139 { "gptimer@9", 112, 0, input_port
, },
1140 { "gptimer@10", 113, 0, input_port
, },
1141 { "gptimer@11", 114, 0, input_port
, },
1142 { "portf_irq_a", 115, 0, input_port
, },
1143 { "portf_irq_b", 116, 0, input_port
, },
1144 { "portg_irq_a", 117, 0, input_port
, },
1145 { "portg_irq_b", 118, 0, input_port
, },
1146 { "porth_irq_a", 119, 0, input_port
, },
1147 { "porth_irq_b", 120, 0, input_port
, },
1148 { "mdma@0", 121, 0, input_port
, },
1149 { "mdma@1", 122, 0, input_port
, },
1150 { "mdma@2", 123, 0, input_port
, },
1151 { "mdma@3", 124, 0, input_port
, },
1152 { "imdma@0", 125, 0, input_port
, },
1153 { "imdma@1", 126, 0, input_port
, },
1154 { "wdog", 127, 0, input_port
, },
1155 /*{ "reserved", 128, 0, input_port, },*/
1156 /*{ "reserved", 129, 0, input_port, },*/
1157 { "sup_irq_0", 130, 0, input_port
, },
1158 { "sup_irq_1", 131, 0, input_port
, },
1163 bfin_sic_561_port_event (struct hw
*me
, int my_port
, struct hw
*source
,
1164 int source_port
, int level
)
1166 struct bfin_sic
*sic
= hw_data (me
);
1167 bu32 idx
= my_port
/ 100;
1168 bu32 bit
= (1 << (my_port
& 0x1f));
1170 /* SIC only exists to forward interrupts from the system to the CEC. */
1173 case 0: sic
->bf561
.isr0
|= bit
; break;
1174 case 1: sic
->bf561
.isr1
|= bit
; break;
1177 /* XXX: Handle SIC wakeup source ?
1178 if (sic->bf561.iwr0 & bit)
1180 if (sic->bf561.iwr1 & bit)
1184 bfin_sic_561_forward_interrupts (me
, sic
);
1187 static const struct hw_port_descriptor bfin_sic_59x_ports
[] =
1189 BFIN_SIC_TO_CEC_PORTS
1190 { "pll", 0, 0, input_port
, },
1191 { "dma_stat", 1, 0, input_port
, },
1192 { "ppi@0", 2, 0, input_port
, },
1193 { "sport@0_stat", 3, 0, input_port
, },
1194 { "sport@1_stat", 4, 0, input_port
, },
1195 { "spi@0", 5, 0, input_port
, },
1196 { "spi@1", 6, 0, input_port
, },
1197 { "uart@0_stat", 7, 0, input_port
, },
1198 { "dma@0", 8, 0, input_port
, },
1199 { "dma@1", 9, 0, input_port
, },
1200 { "dma@2", 10, 0, input_port
, },
1201 { "dma@3", 11, 0, input_port
, },
1202 { "dma@4", 12, 0, input_port
, },
1203 { "dma@5", 13, 0, input_port
, },
1204 { "dma@6", 14, 0, input_port
, },
1205 { "dma@7", 15, 0, input_port
, },
1206 { "dma@8", 16, 0, input_port
, },
1207 { "portf_irq_a", 17, 0, input_port
, },
1208 { "portf_irq_b", 18, 0, input_port
, },
1209 { "gptimer@0", 19, 0, input_port
, },
1210 { "gptimer@1", 20, 0, input_port
, },
1211 { "gptimer@2", 21, 0, input_port
, },
1212 { "portg_irq_a", 22, 0, input_port
, },
1213 { "portg_irq_b", 23, 0, input_port
, },
1214 { "twi@0", 24, 0, input_port
, },
1215 /* XXX: 25 - 28 are supposed to be reserved; see comment in machs.c:bf592_dmac[] */
1216 { "dma@9", 25, 0, input_port
, },
1217 { "dma@10", 26, 0, input_port
, },
1218 { "dma@11", 27, 0, input_port
, },
1219 { "dma@12", 28, 0, input_port
, },
1220 /*{ "reserved", 25, 0, input_port, },*/
1221 /*{ "reserved", 26, 0, input_port, },*/
1222 /*{ "reserved", 27, 0, input_port, },*/
1223 /*{ "reserved", 28, 0, input_port, },*/
1224 { "mdma@0", 29, 0, input_port
, },
1225 { "mdma@1", 30, 0, input_port
, },
1226 { "wdog", 31, 0, input_port
, },
1231 attach_bfin_sic_regs (struct hw
*me
, struct bfin_sic
*sic
)
1233 address_word attach_address
;
1235 unsigned attach_size
;
1236 reg_property_spec reg
;
1238 if (hw_find_property (me
, "reg") == NULL
)
1239 hw_abort (me
, "Missing \"reg\" property");
1241 if (!hw_find_reg_array_property (me
, "reg", 0, ®
))
1242 hw_abort (me
, "\"reg\" property must contain three addr/size entries");
1244 hw_unit_address_to_attach_address (hw_parent (me
),
1246 &attach_space
, &attach_address
, me
);
1247 hw_unit_size_to_attach_size (hw_parent (me
), ®
.size
, &attach_size
, me
);
1249 if (attach_size
!= BFIN_MMR_SIC_SIZE
)
1250 hw_abort (me
, "\"reg\" size must be %#x", BFIN_MMR_SIC_SIZE
);
1252 hw_attach_address (hw_parent (me
),
1253 0, attach_space
, attach_address
, attach_size
, me
);
1255 sic
->base
= attach_address
;
1259 bfin_sic_finish (struct hw
*me
)
1261 struct bfin_sic
*sic
;
1263 sic
= HW_ZALLOC (me
, struct bfin_sic
);
1265 set_hw_data (me
, sic
);
1266 attach_bfin_sic_regs (me
, sic
);
1268 switch (hw_find_integer_property (me
, "type"))
1271 set_hw_io_read_buffer (me
, bfin_sic_52x_io_read_buffer
);
1272 set_hw_io_write_buffer (me
, bfin_sic_52x_io_write_buffer
);
1273 set_hw_ports (me
, bfin_sic_50x_ports
);
1274 set_hw_port_event (me
, bfin_sic_52x_port_event
);
1275 mmr_names
= bf52x_mmr_names
;
1277 /* Initialize the SIC. */
1278 sic
->bf52x
.imask0
= sic
->bf52x
.imask1
= 0;
1279 sic
->bf52x
.isr0
= sic
->bf52x
.isr1
= 0;
1280 sic
->bf52x
.iwr0
= sic
->bf52x
.iwr1
= 0xFFFFFFFF;
1281 sic
->bf52x
.iar0
= 0x00000000;
1282 sic
->bf52x
.iar1
= 0x22111000;
1283 sic
->bf52x
.iar2
= 0x33332222;
1284 sic
->bf52x
.iar3
= 0x44444433;
1285 sic
->bf52x
.iar4
= 0x55555555;
1286 sic
->bf52x
.iar5
= 0x06666655;
1287 sic
->bf52x
.iar6
= 0x33333003;
1288 sic
->bf52x
.iar7
= 0x00000000; /* XXX: Find and fix */
1291 set_hw_io_read_buffer (me
, bfin_sic_52x_io_read_buffer
);
1292 set_hw_io_write_buffer (me
, bfin_sic_52x_io_write_buffer
);
1293 set_hw_ports (me
, bfin_sic_51x_ports
);
1294 set_hw_port_event (me
, bfin_sic_52x_port_event
);
1295 mmr_names
= bf52x_mmr_names
;
1297 /* Initialize the SIC. */
1298 sic
->bf52x
.imask0
= sic
->bf52x
.imask1
= 0;
1299 sic
->bf52x
.isr0
= sic
->bf52x
.isr1
= 0;
1300 sic
->bf52x
.iwr0
= sic
->bf52x
.iwr1
= 0xFFFFFFFF;
1301 sic
->bf52x
.iar0
= 0x00000000;
1302 sic
->bf52x
.iar1
= 0x11000000;
1303 sic
->bf52x
.iar2
= 0x33332222;
1304 sic
->bf52x
.iar3
= 0x44444433;
1305 sic
->bf52x
.iar4
= 0x55555555;
1306 sic
->bf52x
.iar5
= 0x06666655;
1307 sic
->bf52x
.iar6
= 0x33333000;
1308 sic
->bf52x
.iar7
= 0x00000000; /* XXX: Find and fix */
1311 set_hw_io_read_buffer (me
, bfin_sic_52x_io_read_buffer
);
1312 set_hw_io_write_buffer (me
, bfin_sic_52x_io_write_buffer
);
1313 set_hw_ports (me
, bfin_sic_52x_ports
);
1314 set_hw_port_event (me
, bfin_sic_52x_port_event
);
1315 mmr_names
= bf52x_mmr_names
;
1317 /* Initialize the SIC. */
1318 sic
->bf52x
.imask0
= sic
->bf52x
.imask1
= 0;
1319 sic
->bf52x
.isr0
= sic
->bf52x
.isr1
= 0;
1320 sic
->bf52x
.iwr0
= sic
->bf52x
.iwr1
= 0xFFFFFFFF;
1321 sic
->bf52x
.iar0
= 0x00000000;
1322 sic
->bf52x
.iar1
= 0x11000000;
1323 sic
->bf52x
.iar2
= 0x33332222;
1324 sic
->bf52x
.iar3
= 0x44444433;
1325 sic
->bf52x
.iar4
= 0x55555555;
1326 sic
->bf52x
.iar5
= 0x06666655;
1327 sic
->bf52x
.iar6
= 0x33333000;
1328 sic
->bf52x
.iar7
= 0x00000000; /* XXX: Find and fix */
1331 set_hw_io_read_buffer (me
, bfin_sic_537_io_read_buffer
);
1332 set_hw_io_write_buffer (me
, bfin_sic_537_io_write_buffer
);
1333 set_hw_ports (me
, bfin_sic_533_ports
);
1334 set_hw_port_event (me
, bfin_sic_533_port_event
);
1335 mmr_names
= bf537_mmr_names
;
1337 /* Initialize the SIC. */
1338 sic
->bf537
.imask
= 0;
1340 sic
->bf537
.iwr
= 0xFFFFFFFF;
1341 sic
->bf537
.iar0
= 0x10000000;
1342 sic
->bf537
.iar1
= 0x33322221;
1343 sic
->bf537
.iar2
= 0x66655444;
1344 sic
->bf537
.iar3
= 0; /* XXX: fix this */
1349 set_hw_io_read_buffer (me
, bfin_sic_537_io_read_buffer
);
1350 set_hw_io_write_buffer (me
, bfin_sic_537_io_write_buffer
);
1351 set_hw_ports (me
, bfin_sic_537_ports
);
1352 set_hw_port_event (me
, bfin_sic_537_port_event
);
1353 mmr_names
= bf537_mmr_names
;
1355 /* Initialize the SIC. */
1356 sic
->bf537
.imask
= 0;
1358 sic
->bf537
.iwr
= 0xFFFFFFFF;
1359 sic
->bf537
.iar0
= 0x22211000;
1360 sic
->bf537
.iar1
= 0x43333332;
1361 sic
->bf537
.iar2
= 0x55555444;
1362 sic
->bf537
.iar3
= 0x66655555;
1365 set_hw_io_read_buffer (me
, bfin_sic_52x_io_read_buffer
);
1366 set_hw_io_write_buffer (me
, bfin_sic_52x_io_write_buffer
);
1367 set_hw_ports (me
, bfin_sic_538_ports
);
1368 set_hw_port_event (me
, bfin_sic_52x_port_event
);
1369 mmr_names
= bf52x_mmr_names
;
1371 /* Initialize the SIC. */
1372 sic
->bf52x
.imask0
= sic
->bf52x
.imask1
= 0;
1373 sic
->bf52x
.isr0
= sic
->bf52x
.isr1
= 0;
1374 sic
->bf52x
.iwr0
= sic
->bf52x
.iwr1
= 0xFFFFFFFF;
1375 sic
->bf52x
.iar0
= 0x10000000;
1376 sic
->bf52x
.iar1
= 0x33322221;
1377 sic
->bf52x
.iar2
= 0x66655444;
1378 sic
->bf52x
.iar3
= 0x00000000;
1379 sic
->bf52x
.iar4
= 0x32222220;
1380 sic
->bf52x
.iar5
= 0x44433333;
1381 sic
->bf52x
.iar6
= 0x00444664;
1382 sic
->bf52x
.iar7
= 0x00000000; /* XXX: Find and fix */
1385 set_hw_io_read_buffer (me
, bfin_sic_54x_io_read_buffer
);
1386 set_hw_io_write_buffer (me
, bfin_sic_54x_io_write_buffer
);
1387 set_hw_ports (me
, bfin_sic_54x_ports
);
1388 set_hw_port_event (me
, bfin_sic_54x_port_event
);
1389 mmr_names
= bf54x_mmr_names
;
1391 /* Initialize the SIC. */
1392 sic
->bf54x
.imask0
= sic
->bf54x
.imask1
= sic
->bf54x
.imask2
= 0;
1393 sic
->bf54x
.isr0
= sic
->bf54x
.isr1
= sic
->bf54x
.isr2
= 0;
1394 sic
->bf54x
.iwr0
= sic
->bf54x
.iwr1
= sic
->bf54x
.iwr1
= 0xFFFFFFFF;
1395 sic
->bf54x
.iar0
= 0x10000000;
1396 sic
->bf54x
.iar1
= 0x33322221;
1397 sic
->bf54x
.iar2
= 0x66655444;
1398 sic
->bf54x
.iar3
= 0x00000000;
1399 sic
->bf54x
.iar4
= 0x32222220;
1400 sic
->bf54x
.iar5
= 0x44433333;
1401 sic
->bf54x
.iar6
= 0x00444664;
1402 sic
->bf54x
.iar7
= 0x00000000;
1403 sic
->bf54x
.iar8
= 0x44111111;
1404 sic
->bf54x
.iar9
= 0x44444444;
1405 sic
->bf54x
.iar10
= 0x44444444;
1406 sic
->bf54x
.iar11
= 0x55444444;
1409 set_hw_io_read_buffer (me
, bfin_sic_561_io_read_buffer
);
1410 set_hw_io_write_buffer (me
, bfin_sic_561_io_write_buffer
);
1411 set_hw_ports (me
, bfin_sic_561_ports
);
1412 set_hw_port_event (me
, bfin_sic_561_port_event
);
1413 mmr_names
= bf561_mmr_names
;
1415 /* Initialize the SIC. */
1416 sic
->bf561
.imask0
= sic
->bf561
.imask1
= 0;
1417 sic
->bf561
.isr0
= sic
->bf561
.isr1
= 0;
1418 sic
->bf561
.iwr0
= sic
->bf561
.iwr1
= 0xFFFFFFFF;
1419 sic
->bf561
.iar0
= 0x00000000;
1420 sic
->bf561
.iar1
= 0x11111000;
1421 sic
->bf561
.iar2
= 0x21111111;
1422 sic
->bf561
.iar3
= 0x22222222;
1423 sic
->bf561
.iar4
= 0x33333222;
1424 sic
->bf561
.iar5
= 0x43333333;
1425 sic
->bf561
.iar6
= 0x21144444;
1426 sic
->bf561
.iar7
= 0x00006552;
1429 set_hw_io_read_buffer (me
, bfin_sic_537_io_read_buffer
);
1430 set_hw_io_write_buffer (me
, bfin_sic_537_io_write_buffer
);
1431 set_hw_ports (me
, bfin_sic_59x_ports
);
1432 set_hw_port_event (me
, bfin_sic_533_port_event
);
1433 mmr_names
= bf537_mmr_names
;
1435 /* Initialize the SIC. */
1436 sic
->bf537
.imask
= 0;
1438 sic
->bf537
.iwr
= 0xFFFFFFFF;
1439 sic
->bf537
.iar0
= 0x00000000;
1440 sic
->bf537
.iar1
= 0x33322221;
1441 sic
->bf537
.iar2
= 0x55444443;
1442 sic
->bf537
.iar3
= 0x66600005;
1445 hw_abort (me
, "no support for SIC on this Blackfin model yet");
1449 const struct hw_descriptor dv_bfin_sic_descriptor
[] = {
1450 {"bfin_sic", bfin_sic_finish
,},