Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e8227689 authored by Daniel Scheller's avatar Daniel Scheller Committed by Mauro Carvalho Chehab
Browse files

media: ddbridge: add macros to handle IRQs in nibble and byte blocks



Currently, each IRQ requires one IRQ_HANDLE() line to call each IRQ
handler that was set up. Add a IRQ_HANDLE_NIBBLE() and IRQ_HANDLE_BYTE()
macro to call all handlers in blocks of four (_NIBBLE) or eight (_BYTE)
handlers at a time, to make this construct more compact.

Picked up from the upstream dddvb-0.9.33 release.

Signed-off-by: default avatarDaniel Scheller <d.scheller@gmx.net>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent 1dda87ac
Loading
Loading
Loading
Loading
+27 −40
Original line number Diff line number Diff line
@@ -2388,54 +2388,41 @@ void ddb_ports_release(struct ddb *dev)
		dev->link[0].irq[_nr].handler(dev->link[0].irq[_nr].data); } \
	while (0)

#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));	     \
		IRQ_HANDLE(2 + (_shift));	     \
		IRQ_HANDLE(3 + (_shift));	     \
		IRQ_HANDLE(4 + (_shift));	     \
		IRQ_HANDLE(5 + (_shift));	     \
		IRQ_HANDLE(6 + (_shift));	     \
		IRQ_HANDLE(7 + (_shift));	     \
	}					     \
}

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)