Index: uspace/drv/time/cmos-rtc/cmos-rtc.c
===================================================================
--- uspace/drv/time/cmos-rtc/cmos-rtc.c	(revision 82d062d84ee0879d721eb52383c754e968797d93)
+++ uspace/drv/time/cmos-rtc/cmos-rtc.c	(revision f220e25ced65f6914f802dba7020702c0529ef51)
@@ -100,4 +100,6 @@
 static time_t uptime_get(void);
 static bool is_battery_ok(rtc_t *rtc);
+static int  rtc_fun_online(ddf_fun_t *fun);
+static int  rtc_fun_offline(ddf_fun_t *fun);
 
 static ddf_dev_ops_t rtc_dev_ops;
@@ -107,4 +109,6 @@
 	.dev_add = rtc_dev_add,
 	.dev_remove = rtc_dev_remove,
+	.fun_online = rtc_fun_online,
+	.fun_offline = rtc_fun_offline,
 };
 
@@ -406,10 +410,16 @@
 	/* Try to normalize the content of the tm structure */
 	time_t r = mktime(t);
-
-	rtc->boottime = r - uptime_get();
+	int result;
+
+	if (r < 0)
+		result = EINVAL;
+	else {
+		rtc->boottime = r - uptime_get();
+		result = EOK;
+	}
 
 	fibril_mutex_unlock(&rtc->mutex);
 
-	return r < 0 ? EINVAL : EOK;
+	return result;
 }
 
@@ -638,4 +648,10 @@
 	fibril_mutex_unlock(&rtc->mutex);
 
+	rc = rtc_fun_offline(rtc->fun);
+	if (rc != EOK) {
+		ddf_msg(LVL_ERROR, "Failed to offline function");
+		return rc;
+	}
+
 	rc = ddf_fun_unbind(rtc->fun);
 	if (rc != EOK) {
@@ -726,4 +742,18 @@
 }
 
+static int
+rtc_fun_online(ddf_fun_t *fun)
+{
+	ddf_msg(LVL_DEBUG, "rtc_fun_online()");
+	return ddf_fun_online(fun);
+}
+
+static int
+rtc_fun_offline(ddf_fun_t *fun)
+{
+	ddf_msg(LVL_DEBUG, "rtc_fun_offline()");
+	return ddf_fun_offline(fun);
+}
+
 int
 main(int argc, char **argv)
