diff --git a/drivers/rtc/at91sam9_rtt.c b/drivers/rtc/at91sam9_rtt.c
index d3cdee04ffc736c42d5580e19e793b3e0c22f775..a684ad6a6f774da84af6cbf9df62775c593ba714 100644
--- a/drivers/rtc/at91sam9_rtt.c
+++ b/drivers/rtc/at91sam9_rtt.c
@@ -54,8 +54,7 @@ int rtc_set (struct rtc_time *tmp)
 	at91_gpbr_t *gpbr = (at91_gpbr_t *) ATMEL_BASE_GPBR;
 	ulong tim;
 
-	tim = mktime (tmp->tm_year, tmp->tm_mon, tmp->tm_mday,
-		      tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
+	tim = rtc_mktime(tmp);
 
 	/* clear alarm, set prescaler to 32768, clear counter */
 	writel(32768+AT91_RTT_RTTRST, &rtt->mr);
diff --git a/drivers/rtc/bfin_rtc.c b/drivers/rtc/bfin_rtc.c
index 6cb1ebac74c09996fc78f7a1d15349285402f69d..a079a1d472365c95e72e5d00f2d216d0aeb6c9f1 100644
--- a/drivers/rtc/bfin_rtc.c
+++ b/drivers/rtc/bfin_rtc.c
@@ -67,8 +67,7 @@ int rtc_set(struct rtc_time *tmp)
 	wait_for_complete();
 
 	/* Calculate number of seconds this incoming time represents */
-	remain = mktime(tmp->tm_year, tmp->tm_mon, tmp->tm_mday,
-			tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
+	remain = rtc_mktime(tmp);
 
 	/* Figure out how many days since epoch */
 	days = remain / NUM_SECS_IN_DAY;
diff --git a/drivers/rtc/date.c b/drivers/rtc/date.c
index 79beb940e5c5a193aff68c9fa0d42863c82a9b2b..8c643a0b460c81afe4aeb9113bb020d16033aa68 100644
--- a/drivers/rtc/date.c
+++ b/drivers/rtc/date.c
@@ -128,22 +128,23 @@ int rtc_to_tm(int tim, struct rtc_time *tm)
  * machines were long is 32-bit! (However, as time_t is signed, we
  * will already get problems at other places on 2038-01-19 03:14:08)
  */
-unsigned long
-mktime (unsigned int year, unsigned int mon,
-	unsigned int day, unsigned int hour,
-	unsigned int min, unsigned int sec)
+unsigned long rtc_mktime(const struct rtc_time *tm)
 {
-	if (0 >= (int) (mon -= 2)) {	/* 1..12 -> 11,12,1..10 */
+	int mon = tm->tm_mon;
+	int year = tm->tm_year;
+	int days, hours;
+
+	mon -= 2;
+	if (0 >= (int)mon) {	/* 1..12 -> 11,12,1..10 */
 		mon += 12;		/* Puts Feb last since it has leap day */
 		year -= 1;
 	}
 
-	return (((
-		(unsigned long) (year/4 - year/100 + year/400 + 367*mon/12 + day) +
-			year*365 - 719499
-	    )*24 + hour /* now have hours */
-	  )*60 + min /* now have minutes */
-	)*60 + sec; /* finally seconds */
+	days = (unsigned long)(year / 4 - year / 100 + year / 400 +
+			367 * mon / 12 + tm->tm_mday) +
+			year * 365 - 719499;
+	hours = days * 24 + tm->tm_hour;
+	return (hours * 60 + tm->tm_min) * 60 + tm->tm_sec;
 }
 
 #endif
diff --git a/drivers/rtc/ds1306.c b/drivers/rtc/ds1306.c
index 3fe6721c13617517344fcb56afcdc18c63343935..7dd3e19028e217b7a5664276c5cd9e8251f983ef 100644
--- a/drivers/rtc/ds1306.c
+++ b/drivers/rtc/ds1306.c
@@ -180,8 +180,7 @@ int rtc_set (struct rtc_time *tmp)
 	{
 		ulong tim;
 
-		tim = mktime (tmp->tm_year, tmp->tm_mon, tmp->tm_mday,
-			      tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
+		tim = rtc_mktime(tmp);
 
 		immap->im_sitk.sitk_rtck = KAPWR_KEY;
 		immap->im_sit.sit_rtc = tim;
diff --git a/drivers/rtc/ds1374.c b/drivers/rtc/ds1374.c
index 04793b54be67f67554fb3ae51c8bb34e0e38dd43..78473570b9df6c9292466705709a45581e97a801 100644
--- a/drivers/rtc/ds1374.c
+++ b/drivers/rtc/ds1374.c
@@ -147,9 +147,7 @@ int rtc_set (struct rtc_time *tmp){
 	if (tmp->tm_year < 1970 || tmp->tm_year > 2069)
 		printf("WARNING: year should be between 1970 and 2069!\n");
 
-	time = mktime(tmp->tm_year, tmp->tm_mon,
-			tmp->tm_mday, tmp->tm_hour,
-			tmp->tm_min, tmp->tm_sec);
+	time = rtc_mktime(tmp);
 
 	DEBUGR ("Set RTC s since 1.1.1970: %ld (0x%02lx)\n", time, time);
 
diff --git a/drivers/rtc/ftrtc010.c b/drivers/rtc/ftrtc010.c
index 3c5d95594390eef7b20526c03d069ec1f45aa375..7d0cfb3ba8c7320f6102ec533a5dde4e2aded88e 100644
--- a/drivers/rtc/ftrtc010.c
+++ b/drivers/rtc/ftrtc010.c
@@ -104,8 +104,7 @@ int rtc_set(struct rtc_time *tmp)
 	      tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,
 	      tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
 
-	new = mktime(tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_hour,
-		     tmp->tm_min, tmp->tm_sec);
+	new = rtc_mktime(tmp);
 
 	now = ftrtc010_time();
 
diff --git a/drivers/rtc/imxdi.c b/drivers/rtc/imxdi.c
index e89034dc0a80c5b7b35ccb47f1c24c5236e9fd81..17519ce2c057d7ee66077ba637124ff8c228d460 100644
--- a/drivers/rtc/imxdi.c
+++ b/drivers/rtc/imxdi.c
@@ -209,8 +209,7 @@ int rtc_set(struct rtc_time *tmp)
 			goto err;
 	}
 
-	now = mktime(tmp->tm_year, tmp->tm_mon, tmp->tm_mday,
-		     tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
+	now = rtc_mktime(tmp);
 	/* zero the fractional part first */
 	rc = DI_WRITE_WAIT(0, dtclr);
 	if (rc == 0)
diff --git a/drivers/rtc/mc13xxx-rtc.c b/drivers/rtc/mc13xxx-rtc.c
index 30c4e662dd7652d534048a8ae793ab209cb850dc..3e463368b09c864c7c05e8ef30d983cc8645193a 100644
--- a/drivers/rtc/mc13xxx-rtc.c
+++ b/drivers/rtc/mc13xxx-rtc.c
@@ -51,8 +51,7 @@ int rtc_set(struct rtc_time *rtc)
 	if (!p)
 		return -1;
 
-	time = mktime(rtc->tm_year, rtc->tm_mon, rtc->tm_mday,
-		      rtc->tm_hour, rtc->tm_min, rtc->tm_sec);
+	time = rtc_mktime(rtc);
 	day = time / 86400;
 	time %= 86400;
 
diff --git a/drivers/rtc/mpc8xx.c b/drivers/rtc/mpc8xx.c
index 796295d5b0e0640e5d9f0549d82907a62fea7591..147a225c6b0a651c5694e7b45ffc1af26601bcfd 100644
--- a/drivers/rtc/mpc8xx.c
+++ b/drivers/rtc/mpc8xx.c
@@ -44,8 +44,7 @@ int rtc_set (struct rtc_time *tmp)
 		tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,
 		tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
 
-	tim = mktime (tmp->tm_year, tmp->tm_mon, tmp->tm_mday,
-		      tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
+	tim = rtc_mktime(tmp);
 
 	immr->im_sitk.sitk_rtck = KAPWR_KEY;
 	immr->im_sit.sit_rtc = tim;
diff --git a/drivers/rtc/mx27rtc.c b/drivers/rtc/mx27rtc.c
index 7ba74d3b110436d154499b2bb89ed7b42f025170..29ccdf17301b174241feffadd7fb4e92084a4b18 100644
--- a/drivers/rtc/mx27rtc.c
+++ b/drivers/rtc/mx27rtc.c
@@ -40,8 +40,7 @@ int rtc_set(struct rtc_time *time)
 	struct rtc_regs *rtc_regs = (struct rtc_regs *)IMX_RTC_BASE;
 	uint32_t day, hour, min, sec;
 
-	sec = mktime(time->tm_year, time->tm_mon, time->tm_mday,
-		time->tm_hour, time->tm_min, time->tm_sec);
+	sec = rtc_mktime(time);
 
 	day  = sec / (24 * 3600);
 	sec  = sec % (24 * 3600);
diff --git a/drivers/rtc/mxsrtc.c b/drivers/rtc/mxsrtc.c
index 82c2fbfde04c7cc799254f34edb80d9b3dd2a6f9..6e32154f47b40bc21475e6d68b7cc03c80e2e6f5 100644
--- a/drivers/rtc/mxsrtc.c
+++ b/drivers/rtc/mxsrtc.c
@@ -52,8 +52,7 @@ int rtc_set(struct rtc_time *time)
 {
 	uint32_t secs;
 
-	secs = mktime(time->tm_year, time->tm_mon, time->tm_mday,
-		time->tm_hour, time->tm_min, time->tm_sec);
+	secs = rtc_mktime(time);
 
 	return mxs_rtc_set_time(secs);
 }
diff --git a/drivers/rtc/pl031.c b/drivers/rtc/pl031.c
index e6c1a6c27100e8c4904d8a6932bdd42c3d6a6a4e..fc83049ecd2ebcfed6e746a25d8edda92ace3a32 100644
--- a/drivers/rtc/pl031.c
+++ b/drivers/rtc/pl031.c
@@ -72,8 +72,7 @@ int rtc_set(struct rtc_time *tmp)
 	}
 
 	/* Calculate number of seconds this incoming time represents */
-	tim = mktime(tmp->tm_year, tmp->tm_mon, tmp->tm_mday,
-			tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
+	tim = rtc_mktime(tmp);
 
 	RTC_WRITE_REG(RTC_LR, tim);
 
diff --git a/include/rtc.h b/include/rtc.h
index 4b7ce6108cfc3f726b4da10bd61d48634780349a..b1a4bf05ec3b56a882f79bc429a38292ab52dc5e 100644
--- a/include/rtc.h
+++ b/include/rtc.h
@@ -45,9 +45,6 @@ int rtc_get (struct rtc_time *);
 int rtc_set (struct rtc_time *);
 void rtc_reset (void);
 
-unsigned long mktime (unsigned int, unsigned int, unsigned int,
-		      unsigned int, unsigned int, unsigned int);
-
 /**
  * rtc_read8() - Read an 8-bit register
  *
@@ -110,4 +107,17 @@ int rtc_calc_weekday(struct rtc_time *time);
  */
 int rtc_to_tm(int time_t, struct rtc_time *time);
 
+/**
+ * rtc_mktime() - Convert a broken-out time into a time_t value
+ *
+ * The following fields need to be valid for this function to work:
+ *	tm_sec, tm_min, tm_hour, tm_mday, tm_mon, tm_year
+ *
+ * Note that tm_wday and tm_yday are ignored.
+ *
+ * @time:	Broken-out time to convert
+ * @return corresponding time_t value, seconds since 1970-01-01 00:00:00
+ */
+unsigned long rtc_mktime(const struct rtc_time *time);
+
 #endif	/* _RTC_H_ */
diff --git a/post/drivers/rtc.c b/post/drivers/rtc.c
index 8d7a7884bc28dec6ec63d527ab1464b20a62c71d..c2e73917ec51141b20290fb3aa7249fccfc0d809 100644
--- a/post/drivers/rtc.c
+++ b/post/drivers/rtc.c
@@ -59,8 +59,7 @@ static int rtc_post_skip (ulong * diff)
 
 static void rtc_post_restore (struct rtc_time *tm, unsigned int sec)
 {
-	time_t t = mktime (tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_hour,
-					   tm->tm_min, tm->tm_sec) + sec;
+	time_t t = rtc_mktime(tm) + sec;
 	struct rtc_time ntm;
 
 	rtc_to_tm(t, &ntm);
@@ -116,9 +115,16 @@ int rtc_post_test (int flags)
 	rtc_get (&svtm);
 
 	for (i = 0; i < 12; i++) {
-		time_t t = mktime (ynl, i + 1, daysnl[i], 23, 59, 59);
+		time_t t;
 		struct rtc_time tm;
 
+		tm.tm_year = ynl;
+		tm.tm_mon = i + 1;
+		tm.tm_mday = daysnl[i];
+		tm.tm_hour = 23;
+		tm.tm_min = 59;
+		tm.tm_sec = 59;
+		t = rtc_mktime(&tm);
 		rtc_to_tm(t, &tm);
 		rtc_set (&tm);
 
@@ -140,9 +146,17 @@ int rtc_post_test (int flags)
 	}
 
 	for (i = 0; i < 12; i++) {
-		time_t t = mktime (yl, i + 1, daysl[i], 23, 59, 59);
+		time_t t;
 		struct rtc_time tm;
 
+		tm.tm_year = yl;
+		tm.tm_mon = i + 1;
+		tm.tm_mday = daysl[i];
+		tm.tm_hour = 23;
+		tm.tm_min = 59;
+		tm.tm_sec = 59;
+		t = rtc_mktime(&tm);
+
 		rtc_to_tm(t, &tm);
 		rtc_set (&tm);