1 INTERFACE [arm && pxa]: // -------------------------------------
9 ICIP = Kmem::Pic_map_base + 0x000000,
10 ICMR = Kmem::Pic_map_base + 0x000004,
11 ICLR = Kmem::Pic_map_base + 0x000008,
12 ICCR = Kmem::Pic_map_base + 0x000014,
13 ICFP = Kmem::Pic_map_base + 0x00000c,
14 ICPR = Kmem::Pic_map_base + 0x000010,
18 INTERFACE [arm && sa1100]: // ----------------------------------
26 ICIP = Kmem::Pic_map_base + 0x00000,
27 ICMR = Kmem::Pic_map_base + 0x00004,
28 ICLR = Kmem::Pic_map_base + 0x00008,
29 ICCR = Kmem::Pic_map_base + 0x0000c,
30 ICFP = Kmem::Pic_map_base + 0x00010,
31 ICPR = Kmem::Pic_map_base + 0x00020,
35 // -------------------------------------------------------------
36 IMPLEMENTATION [arm && (sa1100 || pxa)]:
41 #include "irq_chip_generic.h"
44 class Chip : public Irq_chip_gen
47 Chip() : Irq_chip_gen(32) {}
48 unsigned set_mode(Mword, unsigned) { return Irq_base::Trigger_level; }
49 void set_cpu(Mword, unsigned) {}
50 void ack(Mword) { /* ack is empty */ }
57 assert(cpu_lock.test());
58 Io::write(Io::read<Mword>(Pic::ICMR) & ~(1 << irq), Pic::ICMR);
63 Chip::mask_and_ack(Mword irq)
65 assert (cpu_lock.test());
66 Io::write(Io::read<Mword>(Pic::ICMR) & ~(1 << irq), Pic::ICMR);
72 Chip::unmask(Mword irq)
74 Io::write(Io::read<Mword>(Pic::ICMR) | (1 << irq), Pic::ICMR);
77 static Static_object<Irq_mgr_single_chip<Chip> > mgr;
82 Irq_mgr::mgr = mgr.construct();
84 // only unmasked interrupts wakeup from idle
85 Io::write(0x01, ICCR);
86 // mask all interrupts
87 Io::write(0x00, ICMR);
88 // all interrupts are IRQ's (no FIQ)
89 Io::write(0x00, ICLR);
92 IMPLEMENT inline NEEDS["io.h"]
93 Pic::Status Pic::disable_all_save()
95 Status s = Io::read<Mword>(ICMR);
100 IMPLEMENT inline NEEDS["io.h"]
101 void Pic::restore_all(Status s)
106 PUBLIC static inline NEEDS["io.h"]
107 Unsigned32 Chip::pending()
109 return Io::read<Unsigned32>(Pic::ICIP);
115 Unsigned32 i = Chip::pending();
117 mgr->c.handle_irq<Chip>(i, 0);
120 // -------------------------------------------------------------
121 IMPLEMENTATION [arm && debug && (sa1100 || pxa)]:
125 Chip::chip_type() const
126 { return "HW PXA/SA IRQ"; }