1 INTERFACE [arm && kirkwood]:
12 Main_Irq_cause_low_reg = Mem_layout::Pic_map_base + 0x20200,
13 Main_Irq_mask_low_reg = Mem_layout::Pic_map_base + 0x20204,
14 Main_Fiq_mask_low_reg = Mem_layout::Pic_map_base + 0x20208,
15 Endpoint_irq_mask_low_reg = Mem_layout::Pic_map_base + 0x2020c,
16 Main_Irq_cause_high_reg = Mem_layout::Pic_map_base + 0x20210,
17 Main_Irq_mask_high_reg = Mem_layout::Pic_map_base + 0x20214,
18 Main_Fiq_mask_high_reg = Mem_layout::Pic_map_base + 0x20218,
19 Endpoint_irq_mask_high_reg = Mem_layout::Pic_map_base + 0x2021c,
25 //-------------------------------------------------------------------
26 IMPLEMENTATION [arm && kirkwood]:
29 #include "initcalls.h"
31 #include "irq_chip_generic.h"
34 class Irq_chip_kirkwood : public Irq_chip_gen
37 Irq_chip_kirkwood() : Irq_chip_gen(64) {}
38 unsigned set_mode(Mword, unsigned) { return Irq_base::Trigger_level; }
39 void set_cpu(Mword, unsigned) {}
40 void ack(Mword) { /* ack is empty */ }
45 Irq_chip_kirkwood::mask(Mword irq)
47 assert (cpu_lock.test());
48 Io::clear<Unsigned32>(1 << (irq & 0x1f),
49 Pic::Main_Irq_mask_low_reg + ((irq & 0x20) >> 1));
54 Irq_chip_kirkwood::mask_and_ack(Mword irq)
56 assert(cpu_lock.test());
63 Irq_chip_kirkwood::unmask(Mword irq)
65 assert(cpu_lock.test());
66 Io::set<Unsigned32>(1 << (irq & 0x1f),
67 Pic::Main_Irq_mask_low_reg + ((irq & 0x20) >> 1));
70 static Static_object<Irq_mgr_single_chip<Irq_chip_kirkwood> > mgr;
75 Irq_mgr::mgr = mgr.construct();
77 // Disable all interrupts
78 Io::write<Unsigned32>(0U, Main_Irq_mask_low_reg);
79 Io::write<Unsigned32>(0U, Main_Fiq_mask_low_reg);
80 Io::write<Unsigned32>(0U, Main_Irq_mask_high_reg);
81 Io::write<Unsigned32>(0U, Main_Fiq_mask_high_reg);
83 // enable bridge (chain) IRQ
84 Io::set<Unsigned32>(1 << Bridge_int_num, Main_Irq_mask_low_reg);
88 Pic::Status Pic::disable_all_save()
92 void Pic::restore_all(Status)
95 PUBLIC static inline NEEDS["io.h"]
96 Unsigned32 Irq_chip_kirkwood::pending()
100 v = Io::read<Unsigned32>(Pic::Main_Irq_cause_low_reg);
103 v = Io::read<Unsigned32>(Pic::Main_Irq_cause_high_reg);
104 for (int i = 1; i < 32; ++i)
108 for (int i = 1; i < 32; ++i)
119 while ((i = Irq_chip_kirkwood::pending()) < 64)
120 mgr->c.handle_irq<Irq_chip_kirkwood>(i, 0);
123 //---------------------------------------------------------------------------
124 IMPLEMENTATION [debug && kirkwood]:
128 Irq_chip_kirkwood::chip_type() const
129 { return "HW Kirkwood IRQ"; }