Index: uspace/srv/hid/s3c24xx_ts/s3c24xx_ts.c
===================================================================
--- uspace/srv/hid/s3c24xx_ts/s3c24xx_ts.c	(revision fafb8e5dc8a80c87cf66270ca6f93d574a95471c)
+++ uspace/srv/hid/s3c24xx_ts/s3c24xx_ts.c	(revision 85b41bca352aeee41906524a20d3603da0fbca08)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2010 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * All rights reserved.
  *
@@ -81,8 +81,10 @@
 int main(int argc, char *argv[])
 {
+	loc_srv_t *srv;
+
 	printf("%s: S3C24xx touchscreen driver\n", NAME);
 
 	async_set_fallback_port_handler(s3c24xx_ts_connection, NULL);
-	errno_t rc = loc_server_register(NAME);
+	errno_t rc = loc_server_register(NAME, &srv);
 	if (rc != EOK) {
 		printf("%s: Unable to register driver.\n", NAME);
@@ -91,12 +93,20 @@
 
 	ts = malloc(sizeof(s3c24xx_ts_t));
-	if (ts == NULL)
+	if (ts == NULL) {
+		loc_server_unregister(srv);
 		return -1;
-
-	if (s3c24xx_ts_init(ts) != EOK)
+	}
+
+	if (s3c24xx_ts_init(ts) != EOK) {
+		free(ts);
+		loc_server_unregister(srv);
 		return -1;
-
-	rc = loc_service_register(NAMESPACE "/mouse", &ts->service_id);
+	}
+
+	rc = loc_service_register(srv, NAMESPACE "/mouse", &ts->service_id);
 	if (rc != EOK) {
+		// XXX s3c24xx_ts_fini();
+		free(ts);
+		loc_server_unregister(srv);
 		printf(NAME ": Unable to register device %s.\n",
 		    NAMESPACE "/mouse");
