Index: HelenOS.config
===================================================================
--- HelenOS.config	(revision 74cbac7d1784d49086f1f07794c3f33e0d9ccc1c)
+++ HelenOS.config	(revision 69b68d1f55687ef031fcf0c68306d1a9162c79ab)
@@ -428,5 +428,5 @@
 
 % Serial line input module
-! [CONFIG_DSRLNIN=y|(PLATFORM=ia64&MACHINE=i460GX&CONFIG_NS16550=y)|(PLATFORM=ia64&MACHINE=ski)|(PLATFORM=sparc64&MACHINE=serengeti&CONFIG_SGCN_KBD=y)] CONFIG_SRLN (y)
+! [CONFIG_DSRLNIN=y|(PLATFORM=ia64&MACHINE=i460GX&CONFIG_NS16550=y)|(PLATFORM=ia64&MACHINE=ski)|(PLATFORM=sparc64&MACHINE=serengeti&CONFIG_SGCN_KBD=y)|(PLATFORM=sparc64&PROCESSOR=sun4v)] CONFIG_SRLN (y)
 
 % EGA support
Index: kernel/arch/sparc64/include/drivers/niagara.h
===================================================================
--- kernel/arch/sparc64/include/drivers/niagara.h	(revision 74cbac7d1784d49086f1f07794c3f33e0d9ccc1c)
+++ kernel/arch/sparc64/include/drivers/niagara.h	(revision 69b68d1f55687ef031fcf0c68306d1a9162c79ab)
@@ -36,9 +36,16 @@
 #define KERN_sparc64_NIAGARA_H
 
+#include <proc/thread.h>
+#include <console/chardev.h>
+
+typedef struct {
+	thread_t *thread;
+	indev_t *srlnin;
+} niagara_instance_t;
+
 char niagara_getc(void);
 void niagara_grab(void);
 void niagara_release(void);
-void niagara_init(void);
-void niagara_poll(void);
+niagara_instance_t *niagarain_init(void);
 
 #endif
Index: kernel/arch/sparc64/src/drivers/niagara.c
===================================================================
--- kernel/arch/sparc64/src/drivers/niagara.c	(revision 74cbac7d1784d49086f1f07794c3f33e0d9ccc1c)
+++ kernel/arch/sparc64/src/drivers/niagara.c	(revision 69b68d1f55687ef031fcf0c68306d1a9162c79ab)
@@ -41,4 +41,5 @@
 #include <ddi/device.h>
 #include <arch/asm.h>
+#include <arch.h>
 #include <mm/slab.h>
 #include <arch/drivers/kbd.h>
@@ -46,4 +47,10 @@
 #include <sysinfo/sysinfo.h>
 #include <ipc/irq.h>
+#include <print.h>
+#include <proc/thread.h>
+#include <console/console.h>
+#include <genarch/srln/srln.h>
+
+#define POLL_INTERVAL  10000
 
 /**
@@ -55,4 +62,7 @@
  */
 #define FICTIONAL_INR		1
+
+
+static niagara_instance_t *instance = NULL;
 
 /* functions referenced from definitions of I/O operations structures */
@@ -78,4 +88,5 @@
  * the mapped buffer. The shared buffer definition follows.
  */
+/*
 #define OUTPUT_BUFFER_SIZE	((PAGE_SIZE) - 2 * 8)
 static volatile struct {
@@ -87,4 +98,5 @@
 	__attribute__ ((aligned(PAGE_SIZE)))
 	output_buffer;
+*/
 
 #if 0
@@ -197,4 +209,6 @@
 }
 
+#endif
+
 /**
  * Function regularly called by the keyboard polling thread. Asks the
@@ -202,6 +216,7 @@
  * and sends it to the upper layers of HelenOS.
  */
-void niagara_poll(void)
-{
+static void niagara_poll(niagara_instance_t *instance)
+{
+	/*
 	while (output_buffer.read_ptr != output_buffer.write_ptr) {
 		do_putchar(output_buffer.data[output_buffer.read_ptr]);
@@ -209,8 +224,11 @@
 			((output_buffer.read_ptr) + 1) % OUTPUT_BUFFER_SIZE;
 	}
+	*/
 
 	uint64_t c;
 
 	if (__hypercall_fast_ret1(0, 0, 0, 0, 0, CONS_GETCHAR, &c) == EOK) {
+		indev_push_character(instance->srlnin, c);
+		#if 0
 		ipl_t ipl = interrupts_disable();
 		spinlock_lock(&niagara_irq.lock);
@@ -235,9 +253,21 @@
 				chardev_push_character(&niagara_io, '\n');
 		}
-	}
-
-}
-
-#endif
+		#endif
+	}
+
+}
+
+/**
+ * Polling thread function.
+ */
+static void kniagarapoll(void *instance) {
+	while (true) {
+		//MH
+		//if (!silent)
+			niagara_poll(instance);
+		
+		thread_usleep(POLL_INTERVAL);
+	}
+}
 
 /**
@@ -245,6 +275,24 @@
  * input/output is used.
  */
-void niagara_init(void)
-{
+static void niagara_init(void)
+{
+	if (instance)
+		return;
+	
+	instance = malloc(sizeof(niagara_instance_t), FRAME_ATOMIC);
+	
+	if (instance) {
+		instance->thread = thread_create(kniagarapoll, instance, TASK, 0,
+			"kniagarapoll", true);
+		
+		if (!instance->thread) {
+			free(instance);
+			instance = NULL;
+			return;
+		}
+	}
+
+	instance->srlnin = NULL;
+
 	#if 0
 	kbd_type = KBD_SUN4V;
@@ -269,6 +317,6 @@
 	 * niagara fb driver can communicate with kernel using a shared buffer.
  	 */
-	output_buffer.read_ptr = 0;
-	output_buffer.write_ptr = 0;
+	//output_buffer.read_ptr = 0;
+	//output_buffer.write_ptr = 0;
 
 	#if 0
@@ -296,4 +344,26 @@
 }
 
+/**
+ * A public function which initializes input from the Niagara console.
+ */
+niagara_instance_t *niagarain_init(void)
+{
+	niagara_init();
+
+	// TODO - move to console init
+	if (instance) {
+		srln_instance_t *srln_instance = srln_init();
+		if (srln_instance) {
+			indev_t *sink = stdin_wire();
+			indev_t *srln = srln_wire(srln_instance, sink);
+
+			// wire std. input to niagara
+			instance->srlnin = srln;
+			thread_ready(instance->thread);
+		}
+	}
+	return instance;
+}
+
 /** @}
  */
Index: kernel/arch/sparc64/src/sun4v/sparc64.c
===================================================================
--- kernel/arch/sparc64/src/sun4v/sparc64.c	(revision 74cbac7d1784d49086f1f07794c3f33e0d9ccc1c)
+++ kernel/arch/sparc64/src/sun4v/sparc64.c	(revision 69b68d1f55687ef031fcf0c68306d1a9162c79ab)
@@ -90,5 +90,4 @@
 		irq_init(1 << 11, 128);
 	}
-	niagara_init();
 }
 
@@ -105,4 +104,5 @@
 	//MH
 	//standalone_sparc64_console_init();
+	niagarain_init();
 }
 
