Lines Matching refs:sim
11 struct irq_sim *sim; member
50 struct irq_sim *sim; in irq_sim_handle_irq() local
54 sim = container_of(work_ctx, struct irq_sim, work_ctx); in irq_sim_handle_irq()
56 while (!bitmap_empty(work_ctx->pending, sim->irq_count)) { in irq_sim_handle_irq()
58 sim->irq_count, offset); in irq_sim_handle_irq()
60 irqnum = irq_sim_irqnum(sim, offset); in irq_sim_handle_irq()
75 int irq_sim_init(struct irq_sim *sim, unsigned int num_irqs) in irq_sim_init() argument
79 sim->irqs = kmalloc_array(num_irqs, sizeof(*sim->irqs), GFP_KERNEL); in irq_sim_init()
80 if (!sim->irqs) in irq_sim_init()
83 sim->irq_base = irq_alloc_descs(-1, 0, num_irqs, 0); in irq_sim_init()
84 if (sim->irq_base < 0) { in irq_sim_init()
85 kfree(sim->irqs); in irq_sim_init()
86 return sim->irq_base; in irq_sim_init()
89 sim->work_ctx.pending = bitmap_zalloc(num_irqs, GFP_KERNEL); in irq_sim_init()
90 if (!sim->work_ctx.pending) { in irq_sim_init()
91 kfree(sim->irqs); in irq_sim_init()
92 irq_free_descs(sim->irq_base, num_irqs); in irq_sim_init()
97 sim->irqs[i].irqnum = sim->irq_base + i; in irq_sim_init()
98 sim->irqs[i].enabled = false; in irq_sim_init()
99 irq_set_chip(sim->irq_base + i, &irq_sim_irqchip); in irq_sim_init()
100 irq_set_chip_data(sim->irq_base + i, &sim->irqs[i]); in irq_sim_init()
101 irq_set_handler(sim->irq_base + i, &handle_simple_irq); in irq_sim_init()
102 irq_modify_status(sim->irq_base + i, in irq_sim_init()
106 init_irq_work(&sim->work_ctx.work, irq_sim_handle_irq); in irq_sim_init()
107 sim->irq_count = num_irqs; in irq_sim_init()
109 return sim->irq_base; in irq_sim_init()
119 void irq_sim_fini(struct irq_sim *sim) in irq_sim_fini() argument
121 irq_work_sync(&sim->work_ctx.work); in irq_sim_fini()
122 bitmap_free(sim->work_ctx.pending); in irq_sim_fini()
123 irq_free_descs(sim->irq_base, sim->irq_count); in irq_sim_fini()
124 kfree(sim->irqs); in irq_sim_fini()
132 irq_sim_fini(this->sim); in devm_irq_sim_release()
145 int devm_irq_sim_init(struct device *dev, struct irq_sim *sim, in devm_irq_sim_init() argument
155 rv = irq_sim_init(sim, num_irqs); in devm_irq_sim_init()
161 dr->sim = sim; in devm_irq_sim_init()
174 void irq_sim_fire(struct irq_sim *sim, unsigned int offset) in irq_sim_fire() argument
176 if (sim->irqs[offset].enabled) { in irq_sim_fire()
177 set_bit(offset, sim->work_ctx.pending); in irq_sim_fire()
178 irq_work_queue(&sim->work_ctx.work); in irq_sim_fire()
190 int irq_sim_irqnum(struct irq_sim *sim, unsigned int offset) in irq_sim_irqnum() argument
192 return sim->irqs[offset].irqnum; in irq_sim_irqnum()