1 INTERFACE [arm && pxa]: // -------------------------------------
18 INTERFACE [arm && sa1100]: // ----------------------------------
35 // -------------------------------------------------------------
36 IMPLEMENTATION [arm && (sa1100 || pxa)]:
39 #include "initcalls.h"
41 #include "irq_chip_generic.h"
43 #include "mmio_register_block.h"
45 class Chip : public Irq_chip_gen, private Mmio_register_block
48 unsigned set_mode(Mword, unsigned) { return Irq_base::Trigger_level; }
49 void set_cpu(Mword, Cpu_number) {}
50 void ack(Mword) { /* ack is empty */ }
56 Mmio_register_block(Kmem::mmio_remap(Mem_layout::Pic_phys_base))
58 // only unmasked interrupts wakeup from idle
59 write<Mword>(0x01, Pic::ICCR);
60 // mask all interrupts
61 write<Mword>(0x00, Pic::ICMR);
62 // all interrupts are IRQ's (no FIQ)
63 write<Mword>(0x00, Pic::ICLR);
70 assert(cpu_lock.test());
71 modify<Mword>(0, 1 << irq, Pic::ICMR);
76 Chip::mask_and_ack(Mword irq)
78 assert (cpu_lock.test());
79 modify<Mword>(0, 1 << irq, Pic::ICMR);
85 Chip::unmask(Mword irq)
87 modify<Mword>(1 << irq, 0, Pic::ICMR);
93 Chip::disable_all_save()
95 Mword s = read<Mword>(Pic::ICMR);
96 write<Mword>(0, Pic::ICMR);
103 Chip::restore_all(Mword s)
109 static Static_object<Irq_mgr_single_chip<Chip> > mgr;
111 IMPLEMENT FIASCO_INIT
114 Irq_mgr::mgr = mgr.construct();
119 Pic::Status Pic::disable_all_save()
120 { return mgr->c.disable_all_save(); }
124 Pic::restore_all(Status s)
126 mgr->c.restore_all(s);
130 Unsigned32 Chip::pending()
132 return read<Unsigned32>(Pic::ICIP);
138 Unsigned32 i = mgr->c.pending();
140 mgr->c.handle_irq<Chip>(i, 0);
143 // -------------------------------------------------------------
144 IMPLEMENTATION [arm && debug && (sa1100 || pxa)]:
148 Chip::chip_type() const
149 { return "HW PXA/SA IRQ"; }