Index: uspace/srv/hw/char/s3c24xx_uart/s3c24xx_uart.c
===================================================================
--- uspace/srv/hw/char/s3c24xx_uart/s3c24xx_uart.c	(revision 5fc82448bbd01f2950b893989095ed4c1b1c99b3)
+++ uspace/srv/hw/char/s3c24xx_uart/s3c24xx_uart.c	(revision 8d1bcd7366211adcd03d6018fa04133f76bc1946)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2010 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * All rights reserved.
  *
@@ -80,8 +80,10 @@
 int main(int argc, char *argv[])
 {
+	loc_srv_t *srv;
+
 	printf("%s: S3C24xx on-chip UART driver\n", NAME);
 
 	async_set_fallback_port_handler(s3c24xx_uart_connection, uart);
-	errno_t rc = loc_server_register(NAME);
+	errno_t rc = loc_server_register(NAME, &srv);
 	if (rc != EOK) {
 		printf("%s: Unable to register server.\n", NAME);
@@ -90,12 +92,20 @@
 
 	uart = malloc(sizeof(s3c24xx_uart_t));
-	if (uart == NULL)
-		return -1;
-
-	if (s3c24xx_uart_init(uart) != EOK)
-		return -1;
-
-	rc = loc_service_register(NAMESPACE "/" NAME, &uart->service_id);
+	if (uart == NULL) {
+		loc_server_unregister(srv);
+		return -1;
+	}
+
+	if (s3c24xx_uart_init(uart) != EOK) {
+		free(uart);
+		loc_server_unregister(srv);
+		return -1;
+	}
+
+	rc = loc_service_register(srv, NAMESPACE "/" NAME, &uart->service_id);
 	if (rc != EOK) {
+		// XXX s3c24xx_uart_fini(uart);
+		free(uart);
+		loc_server_unregister(srv);
 		printf(NAME ": Unable to register device %s.\n",
 		    NAMESPACE "/" NAME);
