+ unsigned int i, k;
+ struct intc_desc_int *d;
+
+ d = alloc_bootmem(sizeof(*d));
+
+ d->nr_reg = desc->mask_regs ? desc->nr_mask_regs * 2 : 0;
+ d->nr_reg += desc->prio_regs ? desc->nr_prio_regs * 2 : 0;
+ d->nr_reg += desc->sense_regs ? desc->nr_sense_regs : 0;
+
+ d->reg = alloc_bootmem(d->nr_reg * sizeof(*d->reg));
+ k = 0;
+
+ if (desc->mask_regs) {
+ for (i = 0; i < desc->nr_mask_regs; i++) {
+ if (desc->mask_regs[i].set_reg)
+ d->reg[k++] = desc->mask_regs[i].set_reg;
+ if (desc->mask_regs[i].clr_reg)
+ d->reg[k++] = desc->mask_regs[i].clr_reg;
+ }
+ }
+
+ if (desc->prio_regs) {
+ d->prio = alloc_bootmem(desc->nr_vectors * sizeof(*d->prio));
+
+ for (i = 0; i < desc->nr_prio_regs; i++) {
+ if (desc->prio_regs[i].set_reg)
+ d->reg[k++] = desc->prio_regs[i].set_reg;
+ if (desc->prio_regs[i].clr_reg)
+ d->reg[k++] = desc->prio_regs[i].clr_reg;
+ }
+ }
+
+ if (desc->sense_regs) {
+ d->sense = alloc_bootmem(desc->nr_vectors * sizeof(*d->sense));
+
+ for (i = 0; i < desc->nr_sense_regs; i++) {
+ if (desc->sense_regs[i].reg)
+ d->reg[k++] = desc->sense_regs[i].reg;
+ }
+ }
+
+ BUG_ON(k > 256); /* _INTC_ADDR_E() and _INTC_ADDR_D() are 8 bits */