Index: uspace/drv/time/cmos-rtc/cmos-regs.h
===================================================================
--- uspace/drv/time/cmos-rtc/cmos-regs.h	(revision bb8f69d4b45d3aceef548d6caaf0303b86194f5e)
+++ uspace/drv/time/cmos-rtc/cmos-regs.h	(revision 95060d5b5601e199fc99f371417d05bbdff4b1e8)
@@ -38,4 +38,5 @@
 
 #define RTC_STATUS_B    0x0B
+#define RTC_MASK_24H    0x02
 #define RTC_MASK_BCD    0x04
 
Index: uspace/drv/time/cmos-rtc/cmos-rtc.c
===================================================================
--- uspace/drv/time/cmos-rtc/cmos-rtc.c	(revision bb8f69d4b45d3aceef548d6caaf0303b86194f5e)
+++ uspace/drv/time/cmos-rtc/cmos-rtc.c	(revision 95060d5b5601e199fc99f371417d05bbdff4b1e8)
@@ -268,4 +268,5 @@
 {
 	bool bcd_mode;
+	bool pm_mode = false;
 	rtc_t *rtc = RTC_FROM_FNODE(fun);
 
@@ -290,4 +291,19 @@
 		 t->tm_mon  != rtc_register_read(rtc, RTC_MON) ||
 		 t->tm_year != rtc_register_read(rtc, RTC_YEAR));
+
+	/* Check if the RTC is working in 12h mode */
+	bool _12h_mode = !(rtc_register_read(rtc, RTC_STATUS_B) &
+	    RTC_MASK_24H);
+
+	if (_12h_mode) {
+		/* The RTC is working in 12h mode, check if it is AM or PM */
+		if (t->tm_hour & 0x80) {
+			/* PM flag is active, it must to be cleared
+			 * or the BCD conversion will fail.
+			 */
+			t->tm_hour &= ~0x80;
+			pm_mode = true;
+		}
+	}
 
 	/* Check if the RTC is working in BCD mode */
@@ -301,4 +317,13 @@
 		t->tm_mon  = bcd2dec(t->tm_mon);
 		t->tm_year = bcd2dec(t->tm_year);
+	}
+
+	if (_12h_mode) {
+		/* Convert to 24h mode */
+		if (pm_mode) {
+			if (t->tm_hour < 12)
+				t->tm_hour += 12;
+		} else if (t->tm_hour == 12)
+			t->tm_hour = 0;
 	}
 
