Index: kernel/genarch/src/drivers/amdm37x_uart/amdm37x_uart.c
===================================================================
--- kernel/genarch/src/drivers/amdm37x_uart/amdm37x_uart.c	(revision 81c354fb41622b00023355b3dda0f6e944fb5294)
+++ kernel/genarch/src/drivers/amdm37x_uart/amdm37x_uart.c	(revision d447598e4fbddb2cd07d077dfd32a3d07224f96a)
@@ -35,4 +35,5 @@
 
 #include <genarch/drivers/amdm37x_uart/amdm37x_uart.h>
+#include <ddi/device.h>
 #include <str.h>
 #include <mm/km.h>
@@ -63,4 +64,20 @@
 };
 
+static irq_ownership_t amdm37x_uart_claim(irq_t *irq)
+{
+	return IRQ_ACCEPT;
+}
+
+static void amdm37x_uart_handler(irq_t *irq)
+{
+	amdm37x_uart_t *uart = irq->instance;
+//TODO enable while checking when RX FIFO is used instead of single char.
+//	while (!(uart->regs->isr2 & AMDM37x_UART_ISR2_RX_FIFO_EMPTY_FLAG)) {
+		const uint8_t val = uart->regs->rhr;
+		if (uart->indev)
+			indev_push_character(uart->indev, val);
+//	}
+}
+
 bool amdm37x_uart_init(
     amdm37x_uart_t *uart, inr_t interrupt, uintptr_t addr, size_t size)
@@ -69,6 +86,8 @@
 	uart->regs = (void *)km_map(addr, size, PAGE_NOT_CACHEABLE);
 
+	ASSERT(uart->regs);
+
 	/* See TI OMAP35X TRM ch 17.5.1.1 p. 2732 for startup routine */
-
+#if 0
 	/* Soft reset the port */
 	uart->regs->sysc = AMDM37x_UART_SYSC_SOFTRESET_FLAG;
@@ -106,8 +125,17 @@
 	/* Disable interrupts */
 	uart->regs->ier = 0;
-
+#endif
 	/* Setup outdev */
 	outdev_initialize("amdm37x_uart_dev", &uart->outdev, &amdm37x_uart_ops);
 	uart->outdev.data = uart;
+
+	/* Initialize IRQ */
+	irq_initialize(&uart->irq);
+	uart->irq.devno = device_assign_devno();
+	uart->irq.inr = interrupt;
+	uart->irq.claim = amdm37x_uart_claim;
+	uart->irq.handler = amdm37x_uart_handler;
+	uart->irq.instance = uart;
+	irq_register(&uart->irq);
 
 	return true;
@@ -116,8 +144,12 @@
 void amdm37x_uart_input_wire(amdm37x_uart_t *uart, indev_t *indev)
 {
-	// TODO implement
-	// register interrupt
-	// set rx fifo
-	// set rx fifo threshold to 1
+	ASSERT(uart);
+	/* Set indev */
+	uart->indev = indev;
+	/* Enable interrupt on receive */
+	uart->regs->ier |= AMDM37x_UART_IER_RHR_IRQ_FLAG;
+
+	// TODO set rx fifo
+	// TODO set rx fifo threshold to 1
 }
 
