Index: kernel/arch/sparc64/src/drivers/sgcn.c
===================================================================
--- kernel/arch/sparc64/src/drivers/sgcn.c	(revision 63b15373eee376c379663c5f4cbe72e41378054c)
+++ kernel/arch/sparc64/src/drivers/sgcn.c	(revision de88998df4f8ddec4b30482af3a93b8ebf8a6099)
@@ -74,5 +74,5 @@
  * which can be used. It is, however, used because when the kernel
  * is running, the OBP buffer is not used by OBP any more but OBP
- * has already made neccessary arangements so that the output will
+ * has already made necessary arrangements so that the output will
  * be read from the OBP buffer and input will go to the OBP buffer.
  * Therefore HelenOS needs to make no such arrangements any more.
@@ -97,5 +97,5 @@
  */
 #define SGCN_BUFFER(type, offset) \
-				((type *) (sgcn_buffer_begin + (offset)))
+	((type *) (sgcn_buffer_begin + (offset)))
 
 /** Returns a pointer to the console buffer header. */
@@ -146,4 +146,7 @@
 chardev_t sgcn_io;
 
+/** Address of the chardev, which is connected to SGCN. */
+static chardev_t *sgcnout;
+
 /**
  * Set some sysinfo values (SRAM address and SRAM size).
@@ -153,5 +156,5 @@
 	sysinfo_set_item_val("sram.area.size", NULL, MAPPED_AREA_SIZE);
 	sysinfo_set_item_val("sram.address.physical", NULL,
-		sram_begin_physical);
+	    sram_begin_physical);
 }
 
@@ -164,7 +167,4 @@
  * be set to the virtual address which maps to the SRAM physical
  * address.
- *
- * It also registers the physical area of SRAM and sets some sysinfo
- * values (SRAM address and SRAM size).
  */
 static void init_sram_begin(void)
@@ -185,5 +185,5 @@
 
 	sram_begin_physical = SBBC_START + SBBC_SRAM_OFFSET
-		+ *((uint32_t *) iosram_toc->value);
+	    + *((uint32_t *) iosram_toc->value);
 	sram_begin = hw_map(sram_begin_physical, MAPPED_AREA_SIZE);
 	
@@ -219,5 +219,5 @@
 	
 	sysinfo_set_item_val("sram.buffer.offset", NULL,
-		SRAM_TOC->keys[i].offset);
+	    SRAM_TOC->keys[i].offset);
 }
 
@@ -242,5 +242,5 @@
 	/* we need pointers to volatile variables */
 	volatile char *buf_ptr = (volatile char *)
-		SGCN_BUFFER(char, SGCN_BUFFER_HEADER->out_wrptr);
+	    SGCN_BUFFER(char, SGCN_BUFFER_HEADER->out_wrptr);
 	volatile uint32_t *out_wrptr_ptr = &(SGCN_BUFFER_HEADER->out_wrptr);
 	volatile uint32_t *out_rdptr_ptr = &(SGCN_BUFFER_HEADER->out_rdptr);
@@ -320,16 +320,12 @@
 	uint32_t size = end - begin;
 
+	if (kbd_disabled)
+		return;
+
 	spinlock_lock(&sgcn_input_lock);
-	
-	ipl_t ipl = interrupts_disable();
-
-	if (kbd_disabled) {
-		interrupts_restore(ipl);
-		return;
-	}
 	
 	/* we need pointers to volatile variables */
 	volatile char *buf_ptr = (volatile char *)
-		SGCN_BUFFER(char, SGCN_BUFFER_HEADER->in_rdptr);
+	    SGCN_BUFFER(char, SGCN_BUFFER_HEADER->in_rdptr);
 	volatile uint32_t *in_wrptr_ptr = &(SGCN_BUFFER_HEADER->in_wrptr);
 	volatile uint32_t *in_rdptr_ptr = &(SGCN_BUFFER_HEADER->in_rdptr);
@@ -338,15 +334,12 @@
 		
 		buf_ptr = (volatile char *)
-			SGCN_BUFFER(char, SGCN_BUFFER_HEADER->in_rdptr);
+		    SGCN_BUFFER(char, SGCN_BUFFER_HEADER->in_rdptr);
 		char c = *buf_ptr;
 		*in_rdptr_ptr = (((*in_rdptr_ptr) - begin + 1) % size) + begin;
 			
-		if (c == '\r') {
-			c = '\n';
-		}
-		chardev_push_character(&sgcn_io, c);	
+		if (sgcnout)
+			chardev_push_character(sgcnout, c);	
 	}	
 
-	interrupts_restore(ipl);	
 	spinlock_unlock(&sgcn_input_lock);
 }
@@ -368,5 +361,5 @@
  * and sets it as a default input/output. 
  */
-void sgcn_init(void)
+void sgcn_init(chardev_t *devout)
 {
 	sgcn_buffer_begin_init();
@@ -384,6 +377,7 @@
 	
 	chardev_initialize("sgcn_io", &sgcn_io, &sgcn_ops);
-	stdin = &sgcn_io;
 	stdout = &sgcn_io;
+
+	sgcnout = devout;
 }
 
