Index: kernel/Makefile
===================================================================
--- kernel/Makefile	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ kernel/Makefile	(revision 24abb85d299db39cc03f429adc41bb1ed4f23e23)
@@ -209,5 +209,4 @@
 	generic/src/ddi/ddi.c \
 	generic/src/ddi/irq.c \
-	generic/src/ddi/device.c \
 	generic/src/debug/symtab.c \
 	generic/src/debug/stacktrace.c \
Index: kernel/arch/arm32/src/interrupt.c
===================================================================
--- kernel/arch/arm32/src/interrupt.c	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ kernel/arch/arm32/src/interrupt.c	(revision 24abb85d299db39cc03f429adc41bb1ed4f23e23)
@@ -38,5 +38,4 @@
 #include <arch/machine_func.h>
 #include <ddi/irq.h>
-#include <ddi/device.h>
 #include <interrupt.h>
 
Index: kernel/arch/arm32/src/mach/beagleboardxm/beagleboardxm.c
===================================================================
--- kernel/arch/arm32/src/mach/beagleboardxm/beagleboardxm.c	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ kernel/arch/arm32/src/mach/beagleboardxm/beagleboardxm.c	(revision 24abb85d299db39cc03f429adc41bb1ed4f23e23)
@@ -44,5 +44,4 @@
 #include <mm/km.h>
 #include <ddi/ddi.h>
-#include <ddi/device.h>
 
 static void bbxm_init(void);
@@ -117,5 +116,4 @@
 	static irq_t timer_irq;
 	irq_initialize(&timer_irq);
-	timer_irq.devno = device_assign_devno();
 	timer_irq.inr = AMDM37x_GPT1_IRQ;
 	timer_irq.claim = bb_timer_irq_claim;
Index: kernel/arch/arm32/src/mach/beaglebone/beaglebone.c
===================================================================
--- kernel/arch/arm32/src/mach/beaglebone/beaglebone.c	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ kernel/arch/arm32/src/mach/beaglebone/beaglebone.c	(revision 24abb85d299db39cc03f429adc41bb1ed4f23e23)
@@ -46,5 +46,4 @@
 #include <interrupt.h>
 #include <ddi/ddi.h>
-#include <ddi/device.h>
 #include <mm/km.h>
 
@@ -129,5 +128,4 @@
 	static irq_t timer_irq;
 	irq_initialize(&timer_irq);
-	timer_irq.devno = device_assign_devno();
 	timer_irq.inr = AM335x_DMTIMER2_IRQ;
 	timer_irq.claim = bbone_timer_irq_claim;
Index: kernel/arch/arm32/src/mach/gta02/gta02.c
===================================================================
--- kernel/arch/arm32/src/mach/gta02/gta02.c	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ kernel/arch/arm32/src/mach/gta02/gta02.c	(revision 24abb85d299db39cc03f429adc41bb1ed4f23e23)
@@ -48,5 +48,4 @@
 #include <interrupt.h>
 #include <ddi/ddi.h>
-#include <ddi/device.h>
 #include <log.h>
 
@@ -241,5 +240,4 @@
 {
 	irq_initialize(&gta02_timer_irq);
-	gta02_timer_irq.devno = device_assign_devno();
 	gta02_timer_irq.inr = GTA02_TIMER_IRQ;
 	gta02_timer_irq.claim = gta02_timer_irq_claim;
Index: kernel/arch/arm32/src/mach/integratorcp/integratorcp.c
===================================================================
--- kernel/arch/arm32/src/mach/integratorcp/integratorcp.c	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ kernel/arch/arm32/src/mach/integratorcp/integratorcp.c	(revision 24abb85d299db39cc03f429adc41bb1ed4f23e23)
@@ -43,5 +43,4 @@
 #include <console/console.h>
 #include <sysinfo/sysinfo.h>
-#include <ddi/device.h>
 #include <mm/page.h>
 #include <mm/frame.h>
@@ -207,5 +206,4 @@
 {
 	irq_initialize(&icp.timer_irq);
-	icp.timer_irq.devno = device_assign_devno();
 	icp.timer_irq.inr = ICP_TIMER_IRQ;
 	icp.timer_irq.claim = icp_timer_claim;
Index: kernel/arch/arm32/src/mach/raspberrypi/raspberrypi.c
===================================================================
--- kernel/arch/arm32/src/mach/raspberrypi/raspberrypi.c	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ kernel/arch/arm32/src/mach/raspberrypi/raspberrypi.c	(revision 24abb85d299db39cc03f429adc41bb1ed4f23e23)
@@ -50,5 +50,4 @@
 #include <interrupt.h>
 #include <ddi/ddi.h>
-#include <ddi/device.h>
 
 #define RPI_DEFAULT_MEMORY_START	0
@@ -118,5 +117,4 @@
 	static irq_t timer_irq;
 	irq_initialize(&timer_irq);
-	timer_irq.devno = device_assign_devno();
 	timer_irq.inr = BCM2835_TIMER1_IRQ;
 	timer_irq.claim = raspberrypi_timer_irq_claim;
Index: kernel/arch/ia32/src/drivers/i8254.c
===================================================================
--- kernel/arch/ia32/src/drivers/i8254.c	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ kernel/arch/ia32/src/drivers/i8254.c	(revision 24abb85d299db39cc03f429adc41bb1ed4f23e23)
@@ -51,5 +51,4 @@
 #include <arch.h>
 #include <ddi/irq.h>
-#include <ddi/device.h>
 
 #define CLK_PORT1  ((ioport8_t *) 0x40U)
@@ -86,5 +85,4 @@
 	irq_initialize(&i8254_irq);
 	i8254_irq.preack = true;
-	i8254_irq.devno = device_assign_devno();
 	i8254_irq.inr = IRQ_CLK;
 	i8254_irq.claim = i8254_claim;
Index: kernel/arch/ia32/src/smp/apic.c
===================================================================
--- kernel/arch/ia32/src/smp/apic.c	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ kernel/arch/ia32/src/smp/apic.c	(revision 24abb85d299db39cc03f429adc41bb1ed4f23e23)
@@ -47,5 +47,4 @@
 #include <arch.h>
 #include <ddi/irq.h>
-#include <ddi/device.h>
 
 #ifdef CONFIG_SMP
@@ -190,5 +189,4 @@
 	irq_initialize(&l_apic_timer_irq);
 	l_apic_timer_irq.preack = true;
-	l_apic_timer_irq.devno = device_assign_devno();
 	l_apic_timer_irq.inr = IRQ_CLK;
 	l_apic_timer_irq.claim = l_apic_timer_claim;
Index: kernel/arch/ia64/src/drivers/it.c
===================================================================
--- kernel/arch/ia64/src/drivers/it.c	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ kernel/arch/ia64/src/drivers/it.c	(revision 24abb85d299db39cc03f429adc41bb1ed4f23e23)
@@ -42,5 +42,4 @@
 #include <time/clock.h>
 #include <ddi/irq.h>
-#include <ddi/device.h>
 #include <arch.h>
 
@@ -66,5 +65,4 @@
 		irq_initialize(&it_irq);
 		it_irq.inr = INTERRUPT_TIMER;
-		it_irq.devno = device_assign_devno();
 		it_irq.claim = it_claim;
 		it_irq.handler = it_interrupt;
Index: kernel/arch/mips32/src/interrupt.c
===================================================================
--- kernel/arch/mips32/src/interrupt.c	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ kernel/arch/mips32/src/interrupt.c	(revision 24abb85d299db39cc03f429adc41bb1ed4f23e23)
@@ -41,5 +41,4 @@
 #include <time/clock.h>
 #include <ipc/sysipc.h>
-#include <ddi/device.h>
 
 #define IRQ_COUNT   8
@@ -175,5 +174,4 @@
 	
 	irq_initialize(&timer_irq);
-	timer_irq.devno = device_assign_devno();
 	timer_irq.inr = TIMER_IRQ;
 	timer_irq.claim = timer_claim;
@@ -186,5 +184,4 @@
 #ifdef MACHINE_msim
 	irq_initialize(&dorder_irq);
-	dorder_irq.devno = device_assign_devno();
 	dorder_irq.inr = DORDER_IRQ;
 	dorder_irq.claim = dorder_claim;
Index: kernel/arch/sparc64/src/drivers/niagara.c
===================================================================
--- kernel/arch/sparc64/src/drivers/niagara.c	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ kernel/arch/sparc64/src/drivers/niagara.c	(revision 24abb85d299db39cc03f429adc41bb1ed4f23e23)
@@ -39,5 +39,4 @@
 #include <console/console.h>
 #include <ddi/ddi.h>
-#include <ddi/device.h>
 #include <arch/asm.h>
 #include <arch.h>
Index: kernel/genarch/src/drivers/dsrln/dsrlnin.c
===================================================================
--- kernel/genarch/src/drivers/dsrln/dsrlnin.c	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ kernel/genarch/src/drivers/dsrln/dsrlnin.c	(revision 24abb85d299db39cc03f429adc41bb1ed4f23e23)
@@ -40,5 +40,4 @@
 #include <mm/slab.h>
 #include <arch/asm.h>
-#include <ddi/device.h>
 
 static irq_ownership_t dsrlnin_claim(irq_t *irq)
@@ -64,5 +63,4 @@
 		
 		irq_initialize(&instance->irq);
-		instance->irq.devno = device_assign_devno();
 		instance->irq.inr = inr;
 		instance->irq.claim = dsrlnin_claim;
Index: kernel/genarch/src/drivers/i8042/i8042.c
===================================================================
--- kernel/genarch/src/drivers/i8042/i8042.c	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ kernel/genarch/src/drivers/i8042/i8042.c	(revision 24abb85d299db39cc03f429adc41bb1ed4f23e23)
@@ -44,5 +44,4 @@
 #include <console/chardev.h>
 #include <mm/slab.h>
-#include <ddi/device.h>
 #include <time/delay.h>
 
@@ -113,5 +112,4 @@
 		
 		irq_initialize(&instance->irq);
-		instance->irq.devno = device_assign_devno();
 		instance->irq.inr = inr;
 		instance->irq.claim = i8042_claim;
Index: kernel/genarch/src/drivers/ns16550/ns16550.c
===================================================================
--- kernel/genarch/src/drivers/ns16550/ns16550.c	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ kernel/genarch/src/drivers/ns16550/ns16550.c	(revision 24abb85d299db39cc03f429adc41bb1ed4f23e23)
@@ -41,5 +41,4 @@
 #include <console/chardev.h>
 #include <mm/slab.h>
-#include <ddi/device.h>
 #include <str.h>
 
@@ -138,5 +137,4 @@
 		
 		irq_initialize(&instance->irq);
-		instance->irq.devno = device_assign_devno();
 		instance->irq.inr = inr;
 		instance->irq.claim = ns16550_claim;
Index: kernel/genarch/src/drivers/omap/uart.c
===================================================================
--- kernel/genarch/src/drivers/omap/uart.c	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ kernel/genarch/src/drivers/omap/uart.c	(revision 24abb85d299db39cc03f429adc41bb1ed4f23e23)
@@ -37,5 +37,4 @@
 #include <assert.h>
 #include <genarch/drivers/omap/uart.h>
-#include <ddi/device.h>
 #include <str.h>
 #include <mm/km.h>
@@ -161,5 +160,4 @@
 	/* Initialize IRQ */
 	irq_initialize(&uart->irq);
-	uart->irq.devno = device_assign_devno();
 	uart->irq.inr = interrupt;
 	uart->irq.claim = omap_uart_claim;
Index: kernel/genarch/src/drivers/pl011/pl011.c
===================================================================
--- kernel/genarch/src/drivers/pl011/pl011.c	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ kernel/genarch/src/drivers/pl011/pl011.c	(revision 24abb85d299db39cc03f429adc41bb1ed4f23e23)
@@ -39,5 +39,4 @@
 #include <console/chardev.h>
 #include <console/console.h>
-#include <ddi/device.h>
 #include <arch/asm.h>
 #include <mm/slab.h>
@@ -127,5 +126,4 @@
 	/* Initialize IRQ */
 	irq_initialize(&uart->irq);
-	uart->irq.devno = device_assign_devno();
 	uart->irq.inr = interrupt;
 	uart->irq.claim = pl011_uart_claim;
Index: kernel/genarch/src/drivers/pl050/pl050.c
===================================================================
--- kernel/genarch/src/drivers/pl050/pl050.c	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ kernel/genarch/src/drivers/pl050/pl050.c	(revision 24abb85d299db39cc03f429adc41bb1ed4f23e23)
@@ -41,5 +41,4 @@
 #include <console/chardev.h>
 #include <mm/slab.h>
-#include <ddi/device.h>
 
 #define PL050_KEY_RELEASE 0xF0
@@ -87,5 +86,4 @@
 
 		irq_initialize(&instance->irq);
-		instance->irq.devno = device_assign_devno();
 		instance->irq.inr = inr;
 		instance->irq.claim = pl050_claim;
Index: kernel/genarch/src/drivers/s3c24xx/uart.c
===================================================================
--- kernel/genarch/src/drivers/s3c24xx/uart.c	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ kernel/genarch/src/drivers/s3c24xx/uart.c	(revision 24abb85d299db39cc03f429adc41bb1ed4f23e23)
@@ -42,5 +42,4 @@
 #include <console/chardev.h>
 #include <console/console.h>
-#include <ddi/device.h>
 #include <arch/asm.h>
 #include <mm/slab.h>
@@ -123,5 +122,4 @@
 	/* Initialize IRQ structure. */
 	irq_initialize(&uart->irq);
-	uart->irq.devno = device_assign_devno();
 	uart->irq.inr = inr;
 	uart->irq.claim = s3c24xx_uart_claim;
Index: kernel/genarch/src/drivers/via-cuda/cuda.c
===================================================================
--- kernel/genarch/src/drivers/via-cuda/cuda.c	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ kernel/genarch/src/drivers/via-cuda/cuda.c	(revision 24abb85d299db39cc03f429adc41bb1ed4f23e23)
@@ -40,5 +40,4 @@
 #include <arch/asm.h>
 #include <mm/slab.h>
-#include <ddi/device.h>
 #include <synch/spinlock.h>
 #include <mem.h>
@@ -106,5 +105,4 @@
 
 		irq_initialize(&instance->irq);
-		instance->irq.devno = device_assign_devno();
 		instance->irq.inr = inr;
 		instance->irq.claim = cuda_claim;
Index: kernel/generic/include/ddi/device.h
===================================================================
--- kernel/generic/include/ddi/device.h	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ 	(revision )
@@ -1,46 +1,0 @@
-/*
- * Copyright (c) 2006 Jakub Jermar
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * - Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- * - The name of the author may not be used to endorse or promote products
- *   derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/** @addtogroup genericddi
- * @{
- */
-/** @file
- */
-
-#ifndef KERN_DEVICE_H_
-#define KERN_DEVICE_H_
-
-#include <typedefs.h>
-
-extern devno_t device_assign_devno(void);
-extern sysarg_t sys_device_assign_devno(void);
-
-#endif
-
-/** @}
- */
Index: kernel/generic/include/ddi/irq.h
===================================================================
--- kernel/generic/include/ddi/irq.h	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ kernel/generic/include/ddi/irq.h	(revision 24abb85d299db39cc03f429adc41bb1ed4f23e23)
@@ -43,4 +43,14 @@
 #include <proc/task.h>
 #include <ipc/ipc.h>
+
+typedef enum {
+	IRQ_HT_KEY_INR,
+	IRQ_HT_KEY_MODE
+} irq_ht_key_t;
+
+typedef enum {
+	IRQ_HT_MODE_CLAIM,
+	IRQ_HT_MODE_NO_CLAIM
+} irq_ht_mode_t;
 
 typedef enum {
@@ -91,6 +101,5 @@
  *
  * If one device has multiple interrupts, there will be multiple irq_t
- * instantions with the same devno.
- *
+ * instantions.
  */
 typedef struct irq {
@@ -112,7 +121,4 @@
 	 */
 	bool preack;
-	
-	/** Unique device number. -1 if not yet assigned. */
-	devno_t devno;
 	
 	/** Actual IRQ number. -1 if not yet assigned. */
Index: kernel/generic/include/ipc/irq.h
===================================================================
--- kernel/generic/include/ipc/irq.h	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ kernel/generic/include/ipc/irq.h	(revision 24abb85d299db39cc03f429adc41bb1ed4f23e23)
@@ -47,10 +47,9 @@
 #include <adt/list.h>
 
-extern int ipc_irq_subscribe(answerbox_t *, inr_t, devno_t, sysarg_t,
-    irq_code_t *);
 
 extern irq_ownership_t ipc_irq_top_half_claim(irq_t *);
 extern void ipc_irq_top_half_handler(irq_t *);
 
+extern int ipc_irq_subscribe(answerbox_t *, inr_t, sysarg_t, irq_code_t *);
 extern int ipc_irq_unsubscribe(answerbox_t *, int);
 extern void ipc_irq_cleanup(answerbox_t *);
Index: kernel/generic/include/ipc/sysipc.h
===================================================================
--- kernel/generic/include/ipc/sysipc.h	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ kernel/generic/include/ipc/sysipc.h	(revision 24abb85d299db39cc03f429adc41bb1ed4f23e23)
@@ -56,5 +56,5 @@
 extern sysarg_t sys_ipc_hangup(sysarg_t);
 
-extern sysarg_t sys_ipc_irq_subscribe(inr_t, devno_t, sysarg_t, irq_code_t *);
+extern sysarg_t sys_ipc_irq_subscribe(inr_t, sysarg_t, irq_code_t *);
 extern sysarg_t sys_ipc_irq_unsubscribe(sysarg_t);
 
Index: kernel/generic/include/typedefs.h
===================================================================
--- kernel/generic/include/typedefs.h	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ kernel/generic/include/typedefs.h	(revision 24abb85d299db39cc03f429adc41bb1ed4f23e23)
@@ -49,5 +49,4 @@
 
 typedef int32_t inr_t;
-typedef int32_t devno_t;
 
 typedef volatile uint8_t ioport8_t;
Index: kernel/generic/src/console/kconsole.c
===================================================================
--- kernel/generic/src/console/kconsole.c	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ kernel/generic/src/console/kconsole.c	(revision 24abb85d299db39cc03f429adc41bb1ed4f23e23)
@@ -55,5 +55,4 @@
 #include <str.h>
 #include <sysinfo/sysinfo.h>
-#include <ddi/device.h>
 #include <symtab.h>
 #include <errno.h>
Index: kernel/generic/src/ddi/device.c
===================================================================
--- kernel/generic/src/ddi/device.c	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ 	(revision )
@@ -1,63 +1,0 @@
-/*
- * Copyright (c) 2006 Jakub Jermar
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * - Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- * - The name of the author may not be used to endorse or promote products
- *   derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/** @addtogroup genericddi
- * @{
- */
-/**
- * @file
- * @brief Device numbers.
- */
-
-#include <assert.h>
-#include <typedefs.h>
-#include <ddi/device.h>
-#include <atomic.h>
-#include <debug.h>
-
-static atomic_t last;
-
-/** Assign new device number.
- *
- * @return Unique device number.
- */
-devno_t device_assign_devno(void)
-{
-	devno_t devno = (devno_t) atomic_postinc(&last);
-	assert(devno >= 0);
-	
-	return devno;
-}
-
-sysarg_t sys_device_assign_devno(void)
-{
-	return (sysarg_t) device_assign_devno();
-}
-
-/** @}
- */
Index: kernel/generic/src/ddi/irq.c
===================================================================
--- kernel/generic/src/ddi/irq.c	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ kernel/generic/src/ddi/irq.c	(revision 24abb85d299db39cc03f429adc41bb1ed4f23e23)
@@ -59,7 +59,8 @@
  * Note about the irq_hash_table.
  *
- * The hash table is configured to use two keys: inr and devno.  However, the
- * hash index is computed only from inr. Moreover, if devno is -1, the match is
- * based on the return value of the claim() function instead of on devno.
+ * The hash table is configured to use two keys: inr and mode.  However, the
+ * hash index is computed only from inr. Moreover, if mode is IRQ_HT_MODE_CLAIM,
+ * the match is based also on the return value of the claim(). Otherwise the
+ * the keys do not match.
  */
 
@@ -73,7 +74,4 @@
 #include <mem.h>
 #include <arch.h>
-
-#define KEY_INR    0
-#define KEY_DEVNO  1
 
 /** Spinlock protecting the kernel IRQ hash table.
@@ -174,5 +172,4 @@
 	link_initialize(&irq->notif_cfg.link);
 	irq->inr = -1;
-	irq->devno = -1;
 	
 	irq_initialize_arch(irq);
@@ -190,6 +187,6 @@
 {
 	sysarg_t key[] = {
-		(sysarg_t) irq->inr,
-		(sysarg_t) irq->devno
+		[IRQ_HT_KEY_INR] = (sysarg_t) irq->inr,
+		[IRQ_HT_KEY_MODE] = (sysarg_t) IRQ_HT_MODE_NO_CLAIM 
 	};
 	
@@ -208,6 +205,6 @@
 	link_t *lnk;
 	sysarg_t key[] = {
-		(sysarg_t) inr,
-		(sysarg_t) -1    /* Search will use claim() instead of devno */
+		[IRQ_HT_KEY_INR] = (sysarg_t) inr,
+		[IRQ_HT_KEY_MODE] = (sysarg_t) IRQ_HT_MODE_CLAIM
 	};
 	
@@ -231,6 +228,6 @@
 	link_t *lnk;
 	sysarg_t key[] = {
-		(sysarg_t) inr,
-		(sysarg_t) -1    /* Search will use claim() instead of devno */
+		[IRQ_HT_KEY_INR] = (sysarg_t) inr,
+		[IRQ_HT_KEY_MODE] = (sysarg_t) IRQ_HT_MODE_CLAIM
 	};
 	
@@ -290,7 +287,7 @@
  * be collisions between different INRs.
  *
- * The devno is not used to compute the hash.
- *
- * @param key The first of the keys is inr and the second is devno or -1.
+ * The mode is not used to compute the hash.
+ *
+ * @param key The first of the keys is inr and the second is mode.
  *
  * @return Index into the hash table.
@@ -299,5 +296,5 @@
 size_t irq_ht_hash(sysarg_t key[])
 {
-	inr_t inr = (inr_t) key[KEY_INR];
+	inr_t inr = (inr_t) key[IRQ_HT_KEY_INR];
 	return inr % buckets;
 }
@@ -308,11 +305,11 @@
  * more complex architecture setup in which there are way too many interrupt
  * numbers (i.e. inr's) to arrange the hash table so that collisions occur only
- * among same inrs of different devnos. So the explicit check for inr match must
- * be done.  Second, if devno is -1, the second key (i.e. devno) is not used for
- * the match and the result of the claim() function is used instead.
+ * among same inrs of different devices. So the explicit check for inr match
+ * must be done.  Second, if mode is IRQ_HT_MODE_CLAIM, the result of the
+ * claim() function is used for the match. Otherwise the key does not match.
  *
  * This function assumes interrupts are already disabled.
  *
- * @param key  Keys (i.e. inr and devno).
+ * @param key  Keys (i.e. inr and mode).
  * @param keys This is 2. 
  * @param item The item to compare the key with.
@@ -325,17 +322,16 @@
 {
 	irq_t *irq = hash_table_get_instance(item, irq_t, link);
-	inr_t inr = (inr_t) key[KEY_INR];
-	devno_t devno = (devno_t) key[KEY_DEVNO];
+	inr_t inr = (inr_t) key[IRQ_HT_KEY_INR];
+	irq_ht_mode_t mode = (irq_ht_mode_t) key[IRQ_HT_KEY_MODE];
 	
 	bool rv;
 	
 	irq_spinlock_lock(&irq->lock, false);
-	if (devno == -1) {
+	if (mode == IRQ_HT_MODE_CLAIM) {
 		/* Invoked by irq_dispatch_and_lock(). */
-		rv = ((irq->inr == inr) &&
-		    (irq->claim(irq) == IRQ_ACCEPT));
+		rv = ((irq->inr == inr) && (irq->claim(irq) == IRQ_ACCEPT));
 	} else {
 		/* Invoked by irq_find_and_lock(). */
-		rv = ((irq->inr == inr) && (irq->devno == devno));
+		rv = false;
 	}
 	
@@ -363,5 +359,5 @@
  * no collisions between different INRs.
  *
- * @param key The first of the keys is inr and the second is devno or -1.
+ * @param key The first of the keys is inr and the second is mode.
  *
  * @return Index into the hash table.
@@ -370,5 +366,5 @@
 size_t irq_lin_hash(sysarg_t key[])
 {
-	inr_t inr = (inr_t) key[KEY_INR];
+	inr_t inr = (inr_t) key[IRQ_HT_KEY_INR];
 	return inr;
 }
@@ -385,5 +381,5 @@
  * This function assumes interrupts are already disabled.
  *
- * @param key  Keys (i.e. inr and devno).
+ * @param key  Keys (i.e. inr and mode).
  * @param keys This is 2. 
  * @param item The item to compare the key with.
@@ -396,14 +392,14 @@
 {
 	irq_t *irq = list_get_instance(item, irq_t, link);
-	devno_t devno = (devno_t) key[KEY_DEVNO];
+	irq_ht_mode_t mode = (irq_ht_mode_t) key[IRQ_HT_KEY_MODE];
 	bool rv;
 	
 	irq_spinlock_lock(&irq->lock, false);
-	if (devno == -1) {
+	if (mode == IRQ_HT_MODE_CLAIM) {
 		/* Invoked by irq_dispatch_and_lock() */
 		rv = (irq->claim(irq) == IRQ_ACCEPT);
 	} else {
 		/* Invoked by irq_find_and_lock() */
-		rv = (irq->devno == devno);
+		rv = false;
 	}
 	
Index: kernel/generic/src/ipc/irq.c
===================================================================
--- kernel/generic/src/ipc/irq.c	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ kernel/generic/src/ipc/irq.c	(revision 24abb85d299db39cc03f429adc41bb1ed4f23e23)
@@ -294,5 +294,4 @@
  * @param box     Receiving answerbox.
  * @param inr     IRQ number.
- * @param devno   Device number.
  * @param imethod Interface and method to be associated with the
  *                notification.
@@ -303,10 +302,10 @@
  *
  */
-int ipc_irq_subscribe(answerbox_t *box, inr_t inr, devno_t devno,
-    sysarg_t imethod, irq_code_t *ucode)
+int ipc_irq_subscribe(answerbox_t *box, inr_t inr, sysarg_t imethod,
+    irq_code_t *ucode)
 {
 	sysarg_t key[] = {
-		(sysarg_t) inr,
-		(sysarg_t) devno
+		[IRQ_HT_KEY_INR] = (sysarg_t) inr,
+		[IRQ_HT_KEY_MODE] = (sysarg_t) IRQ_HT_MODE_NO_CLAIM
 	};
 	
@@ -334,5 +333,4 @@
 	irq_t *irq = &kobj->irq;
 	irq_initialize(irq);
-	irq->devno = devno;
 	irq->inr = inr;
 	irq->claim = ipc_irq_top_half_claim;
@@ -349,19 +347,4 @@
 	 */
 	irq_spinlock_lock(&irq_uspace_hash_table_lock, true);
-	
-	link_t *hlp = hash_table_find(&irq_uspace_hash_table, key);
-	if (hlp) {
-		irq_t *hirq = hash_table_get_instance(hlp, irq_t, link);
-		
-		/* hirq is locked */
-		irq_spinlock_unlock(&hirq->lock, false);
-		code_free(code);
-		irq_spinlock_unlock(&irq_uspace_hash_table_lock, true);
-		
-		kobject_free(TASK, cap);
-		return EEXIST;
-	}
-	
-	/* Locking is not really necessary, but paranoid */
 	irq_spinlock_lock(&irq->lock, false);
 	irq_spinlock_lock(&box->irq_lock, false);
Index: kernel/generic/src/ipc/sysipc.c
===================================================================
--- kernel/generic/src/ipc/sysipc.c	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ kernel/generic/src/ipc/sysipc.c	(revision 24abb85d299db39cc03f429adc41bb1ed4f23e23)
@@ -801,5 +801,4 @@
  *
  * @param inr     IRQ number.
- * @param devno   Device number.
  * @param imethod Interface and method to be associated with the notification.
  * @param ucode   Uspace pointer to the top-half pseudocode.
@@ -810,11 +809,10 @@
  *
  */
-sysarg_t sys_ipc_irq_subscribe(inr_t inr, devno_t devno, sysarg_t imethod,
-    irq_code_t *ucode)
+sysarg_t sys_ipc_irq_subscribe(inr_t inr, sysarg_t imethod, irq_code_t *ucode)
 {
 	if (!(perm_get(TASK) & PERM_IRQ_REG))
 		return EPERM;
 	
-	return ipc_irq_subscribe(&TASK->answerbox, inr, devno, imethod, ucode);
+	return ipc_irq_subscribe(&TASK->answerbox, inr, imethod, ucode);
 }
 
Index: kernel/generic/src/syscall/syscall.c
===================================================================
--- kernel/generic/src/syscall/syscall.c	(revision e9d15d9f0efb393d698245b131a15268dc1cd68f)
+++ kernel/generic/src/syscall/syscall.c	(revision 24abb85d299db39cc03f429adc41bb1ed4f23e23)
@@ -45,5 +45,4 @@
 #include <arch.h>
 #include <debug.h>
-#include <ddi/device.h>
 #include <interrupt.h>
 #include <ipc/sysipc.h>
@@ -175,5 +174,4 @@
 	
 	/* DDI related syscalls. */
-	[SYS_DEVICE_ASSIGN_DEVNO] = (syshandler_t) sys_device_assign_devno,
 	[SYS_PHYSMEM_MAP] = (syshandler_t) sys_physmem_map,
 	[SYS_PHYSMEM_UNMAP] = (syshandler_t) sys_physmem_unmap,
