Index: uspace/drv/time/cmos-rtc/cmos-rtc.c
===================================================================
--- uspace/drv/time/cmos-rtc/cmos-rtc.c	(revision 289fa65da8a56fcf4398a5ead5d368d604bda79d)
+++ uspace/drv/time/cmos-rtc/cmos-rtc.c	(revision 6f9c8f61e5d640581889aa12459d4708d04bcc6f)
@@ -99,4 +99,5 @@
 static void rtc_register_write(rtc_t *rtc, int reg, int data);
 static time_t uptime_get(void);
+static bool is_battery_ok(rtc_t *rtc);
 
 static ddf_dev_ops_t rtc_dev_ops;
@@ -334,4 +335,10 @@
 	}
 
+	/* Check if the RTC battery is OK */
+	if (!is_battery_ok(rtc)) {
+		fibril_mutex_unlock(&rtc->mutex);
+		return EIO;
+	}
+
 	/* now read the registers */
 	do {
@@ -436,4 +443,9 @@
 
 	fibril_mutex_lock(&rtc->mutex);
+
+	if (!is_battery_ok(rtc)) {
+		fibril_mutex_unlock(&rtc->mutex);
+		return EIO;
+	}
 
 	/* boottime must be recomputed */
@@ -516,10 +528,25 @@
 {
 	rtc_t *rtc = fun_rtc(fun);
-	const bool batt_ok = rtc_register_read(rtc, RTC_STATUS_D) &
-	    RTC_D_BATTERY_OK;
+
+	fibril_mutex_lock(&rtc->mutex);
+	const bool batt_ok = is_battery_ok(rtc);
+	fibril_mutex_unlock(&rtc->mutex);
 
 	*status = batt_ok ? BATTERY_OK : BATTERY_LOW;
 
 	return EOK;
+}
+
+/** Check if the battery is working properly or not.
+ *  The caller already holds the rtc->mutex lock.
+ *
+ *  @param rtc   The RTC instance.
+ *
+ *  @return      true if the battery is ok, false otherwise.
+ */
+static bool
+is_battery_ok(rtc_t *rtc)
+{
+	return rtc_register_read(rtc, RTC_STATUS_D) & RTC_D_BATTERY_OK;
 }
 
