diff --git a/ddbridge/ddbridge-core.c b/ddbridge/ddbridge-core.c index 8701a0a..69e3642 100644 --- a/ddbridge/ddbridge-core.c +++ b/ddbridge/ddbridge-core.c @@ -2709,7 +2709,17 @@ void ddb_ports_release(struct ddb *dev) dev->link[0].irq[_n].handler(dev->link[0].irq[_n].data); } \ while (0) -#define IRQ_HANDLE_BYTE(_shift) { \ +#define IRQ_HANDLE_NIBBLE(_shift) { \ + if (s & (0x0000000f << ((_shift) & 0x1f))) { \ + IRQ_HANDLE(0 + (_shift)); \ + IRQ_HANDLE(1 + (_shift)); \ + IRQ_HANDLE(2 + (_shift)); \ + IRQ_HANDLE(3 + (_shift)); \ + } \ +} + + +#define IRQ_HANDLE_BYTE(_shift) { \ if (s & (0x000000ff << ((_shift) & 0x1f))) { \ IRQ_HANDLE(0 + (_shift)); \ IRQ_HANDLE(1 + (_shift)); \ @@ -2725,51 +2735,16 @@ void ddb_ports_release(struct ddb *dev) static void irq_handle_msg(struct ddb *dev, u32 s) { dev->i2c_irq++; - IRQ_HANDLE(0); - IRQ_HANDLE(1); - IRQ_HANDLE(2); - IRQ_HANDLE(3); + IRQ_HANDLE_NIBBLE(0); } static void irq_handle_io(struct ddb *dev, u32 s) { dev->ts_irq++; - if ((s & 0x000000f0)) { - IRQ_HANDLE(4); - IRQ_HANDLE(5); - IRQ_HANDLE(6); - IRQ_HANDLE(7); - } - if ((s & 0x0000ff00)) { - IRQ_HANDLE(8); - IRQ_HANDLE(9); - IRQ_HANDLE(10); - IRQ_HANDLE(11); - IRQ_HANDLE(12); - IRQ_HANDLE(13); - IRQ_HANDLE(14); - IRQ_HANDLE(15); - } - if ((s & 0x00ff0000)) { - IRQ_HANDLE(16); - IRQ_HANDLE(17); - IRQ_HANDLE(18); - IRQ_HANDLE(19); - IRQ_HANDLE(20); - IRQ_HANDLE(21); - IRQ_HANDLE(22); - IRQ_HANDLE(23); - } - if ((s & 0xff000000)) { - IRQ_HANDLE(24); - IRQ_HANDLE(25); - IRQ_HANDLE(26); - IRQ_HANDLE(27); - IRQ_HANDLE(28); - IRQ_HANDLE(29); - IRQ_HANDLE(30); - IRQ_HANDLE(31); - } + IRQ_HANDLE_NIBBLE(4); + IRQ_HANDLE_BYTE(8); + IRQ_HANDLE_BYTE(16); + IRQ_HANDLE_BYTE(24); } irqreturn_t ddb_irq_handler0(int irq, void *dev_id) @@ -2842,46 +2817,10 @@ static irqreturn_t irq_handle_v2_n(struct ddb *dev, u32 n) return IRQ_NONE; ddbwritel(dev, s, reg); - if ((s & 0x000000ff)) { - IRQ_HANDLE(0 + off); - IRQ_HANDLE(1 + off); - IRQ_HANDLE(2 + off); - IRQ_HANDLE(3 + off); - IRQ_HANDLE(4 + off); - IRQ_HANDLE(5 + off); - IRQ_HANDLE(6 + off); - IRQ_HANDLE(7 + off); - } - if ((s & 0x0000ff00)) { - IRQ_HANDLE(8 + off); - IRQ_HANDLE(9 + off); - IRQ_HANDLE(10 + off); - IRQ_HANDLE(11 + off); - IRQ_HANDLE(12 + off); - IRQ_HANDLE(13 + off); - IRQ_HANDLE(14 + off); - IRQ_HANDLE(15 + off); - } - if ((s & 0x00ff0000)) { - IRQ_HANDLE(16 + off); - IRQ_HANDLE(17 + off); - IRQ_HANDLE(18 + off); - IRQ_HANDLE(19 + off); - IRQ_HANDLE(20 + off); - IRQ_HANDLE(21 + off); - IRQ_HANDLE(22 + off); - IRQ_HANDLE(23 + off); - } - if ((s & 0xff000000)) { - IRQ_HANDLE(24 + off); - IRQ_HANDLE(25 + off); - IRQ_HANDLE(26 + off); - IRQ_HANDLE(27 + off); - IRQ_HANDLE(28 + off); - IRQ_HANDLE(29 + off); - IRQ_HANDLE(30 + off); - IRQ_HANDLE(31 + off); - } + IRQ_HANDLE_BYTE(0 + off); + IRQ_HANDLE_BYTE(8 + off); + IRQ_HANDLE_BYTE(16 + off); + IRQ_HANDLE_BYTE(24 + off); return IRQ_HANDLED; } @@ -2903,10 +2842,7 @@ irqreturn_t ddb_irq_handler_v2(int irq, void *dev_id) irq_handle_v2_n(dev, 2); if (s & 0x00000004) irq_handle_v2_n(dev, 3); - IRQ_HANDLE(8); - IRQ_HANDLE(9); - IRQ_HANDLE(10); - IRQ_HANDLE(11); + IRQ_HANDLE_NIBBLE(8); } while ((s = 0xffff & ddbreadl(dev, INTERRUPT_V2_STATUS))); return ret;