dm: rtc: Rename to_tm() to rtc_to_tm() and add error code

Rename this function so that it is clear that it is provided by the RTC.
Also return an error when it cannot function as expected. This is unlikely
to occur since it works for dates since 1752 and many RTCs do not support
such old dates. Still it is better to be accurate.

Signed-off-by: Simon Glass <sjg@chromium.org>
Acked-by: Heiko Schocher <hs@denx.de>
diff --git a/common/image.c b/common/image.c
index abc0d89..fdec496 100644
--- a/common/image.c
+++ b/common/image.c
@@ -533,7 +533,7 @@
 #ifndef USE_HOSTCC
 	struct rtc_time tm;
 
-	to_tm(timestamp, &tm);
+	rtc_to_tm(timestamp, &tm);
 	printf("%4d-%02d-%02d  %2d:%02d:%02d UTC\n",
 			tm.tm_year, tm.tm_mon, tm.tm_mday,
 			tm.tm_hour, tm.tm_min, tm.tm_sec);
diff --git a/drivers/rtc/at91sam9_rtt.c b/drivers/rtc/at91sam9_rtt.c
index 714dd2a..d3cdee0 100644
--- a/drivers/rtc/at91sam9_rtt.c
+++ b/drivers/rtc/at91sam9_rtt.c
@@ -44,7 +44,7 @@
 	} while (tim!=tim2);
 	off = readl(&gpbr->reg[AT91_GPBR_INDEX_TIMEOFF]);
 	/* off==0 means time is invalid, but we ignore that */
-	to_tm (tim+off, tmp);
+	rtc_to_tm(tim+off, tmp);
 	return 0;
 }
 
diff --git a/drivers/rtc/bfin_rtc.c b/drivers/rtc/bfin_rtc.c
index 4cf2d83..6cb1eba 100644
--- a/drivers/rtc/bfin_rtc.c
+++ b/drivers/rtc/bfin_rtc.c
@@ -114,7 +114,7 @@
 
 	/* Calculate the total number of seconds since epoch */
 	time_in_sec = (tm_sec) + MIN_TO_SECS(tm_min) + HRS_TO_SECS(tm_hr) + DAYS_TO_SECS(tm_day);
-	to_tm(time_in_sec, tmp);
+	rtc_to_tm(time_in_sec, tmp);
 
 	return 0;
 }
diff --git a/drivers/rtc/date.c b/drivers/rtc/date.c
index 2000565..79beb94 100644
--- a/drivers/rtc/date.c
+++ b/drivers/rtc/date.c
@@ -71,7 +71,7 @@
 	return 0;
 }
 
-void to_tm(int tim, struct rtc_time * tm)
+int rtc_to_tm(int tim, struct rtc_time *tm)
 {
 	register int    i;
 	register long   hms, day;
@@ -103,10 +103,14 @@
 	/* Days are what is left over (+1) from all that. */
 	tm->tm_mday = day + 1;
 
+	/* Zero unused fields */
+	tm->tm_yday = 0;
+	tm->tm_isdst = 0;
+
 	/*
 	 * Determine the day of week
 	 */
-	rtc_calc_weekday(tm);
+	return rtc_calc_weekday(tm);
 }
 
 /* Converts Gregorian date to seconds since 1970-01-01 00:00:00.
diff --git a/drivers/rtc/ds1374.c b/drivers/rtc/ds1374.c
index 427b1eb..04793b5 100644
--- a/drivers/rtc/ds1374.c
+++ b/drivers/rtc/ds1374.c
@@ -118,7 +118,7 @@
 
 	DEBUGR ("Get RTC s since 1.1.1970: %ld\n", time1);
 
-	to_tm(time1, tm); /* To Gregorian Date */
+	rtc_to_tm(time1, tm); /* To Gregorian Date */
 
 	if (rtc_read(RTC_SR_ADDR) & RTC_SR_BIT_OSF) {
 		printf ("### Warning: RTC oscillator has stopped\n");
diff --git a/drivers/rtc/ftrtc010.c b/drivers/rtc/ftrtc010.c
index 713dad2..3c5d955 100644
--- a/drivers/rtc/ftrtc010.c
+++ b/drivers/rtc/ftrtc010.c
@@ -86,7 +86,7 @@
 	now = ftrtc010_time() + readl(&rtc->record);
 #endif
 
-	to_tm(now, tmp);
+	rtc_to_tm(now, tmp);
 
 	return 0;
 }
diff --git a/drivers/rtc/imxdi.c b/drivers/rtc/imxdi.c
index 0d7d736..e89034d 100644
--- a/drivers/rtc/imxdi.c
+++ b/drivers/rtc/imxdi.c
@@ -192,7 +192,7 @@
 	}
 
 	now = __raw_readl(&data.regs->dtcmr);
-	to_tm(now, tmp);
+	rtc_to_tm(now, tmp);
 
 err:
 	return rc;
diff --git a/drivers/rtc/mc13xxx-rtc.c b/drivers/rtc/mc13xxx-rtc.c
index 528247a..30c4e66 100644
--- a/drivers/rtc/mc13xxx-rtc.c
+++ b/drivers/rtc/mc13xxx-rtc.c
@@ -36,7 +36,7 @@
 
 	tim = day1 * 86400 + time;
 
-	to_tm(tim, rtc);
+	rtc_to_tm(tim, rtc);
 
 	rtc->tm_yday = 0;
 	rtc->tm_isdst = 0;
diff --git a/drivers/rtc/mcfrtc.c b/drivers/rtc/mcfrtc.c
index 8961ca4..e02e297 100644
--- a/drivers/rtc/mcfrtc.c
+++ b/drivers/rtc/mcfrtc.c
@@ -38,7 +38,7 @@
 	tim = (tim * 60) + rtc_mins;
 	tim = (tim * 60) + rtc->seconds;
 
-	to_tm(tim, tmp);
+	rtc_to_tm(tim, tmp);
 
 	tmp->tm_yday = 0;
 	tmp->tm_isdst = 0;
diff --git a/drivers/rtc/mpc8xx.c b/drivers/rtc/mpc8xx.c
index d239dae..796295d 100644
--- a/drivers/rtc/mpc8xx.c
+++ b/drivers/rtc/mpc8xx.c
@@ -26,7 +26,7 @@
 
 	tim = immr->im_sit.sit_rtc;
 
-	to_tm (tim, tmp);
+	rtc_to_tm(tim, tmp);
 
 	debug ( "Get DATE: %4d-%02d-%02d (wday=%d)  TIME: %2d:%02d:%02d\n",
 		tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,
diff --git a/drivers/rtc/mx27rtc.c b/drivers/rtc/mx27rtc.c
index ae6595b..7ba74d3 100644
--- a/drivers/rtc/mx27rtc.c
+++ b/drivers/rtc/mx27rtc.c
@@ -30,7 +30,7 @@
 
 	sec += min * 60 + hour * 3600 + day * 24 * 3600;
 
-	to_tm(sec, time);
+	rtc_to_tm(sec, time);
 
 	return 0;
 }
diff --git a/drivers/rtc/mxsrtc.c b/drivers/rtc/mxsrtc.c
index 32ba8a3..82c2fbf 100644
--- a/drivers/rtc/mxsrtc.c
+++ b/drivers/rtc/mxsrtc.c
@@ -43,7 +43,7 @@
 	uint32_t secs;
 
 	secs = readl(&rtc_regs->hw_rtc_seconds);
-	to_tm(secs, time);
+	rtc_to_tm(secs, time);
 
 	return 0;
 }
diff --git a/drivers/rtc/pl031.c b/drivers/rtc/pl031.c
index c4d1259..e6c1a6c 100644
--- a/drivers/rtc/pl031.c
+++ b/drivers/rtc/pl031.c
@@ -97,7 +97,7 @@
 
 	tim = RTC_READ_REG(RTC_DR);
 
-	to_tm (tim, tmp);
+	rtc_to_tm(tim, tmp);
 
 	debug ( "Get DATE: %4d-%02d-%02d (wday=%d)  TIME: %2d:%02d:%02d\n",
 		tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,
diff --git a/include/rtc.h b/include/rtc.h
index 96c696a..4b7ce61 100644
--- a/include/rtc.h
+++ b/include/rtc.h
@@ -45,7 +45,6 @@
 int rtc_set (struct rtc_time *);
 void rtc_reset (void);
 
-void to_tm (int, struct rtc_time *);
 unsigned long mktime (unsigned int, unsigned int, unsigned int,
 		      unsigned int, unsigned int, unsigned int);
 
@@ -97,4 +96,18 @@
  */
 int rtc_calc_weekday(struct rtc_time *time);
 
+/**
+ * rtc_to_tm() - Convert a time_t value into a broken-out time
+ *
+ * The following fields are set up by this function:
+ *	tm_sec, tm_min, tm_hour, tm_mday, tm_mon, tm_year, tm_wday
+ *
+ * Note that tm_yday and tm_isdst are set to 0.
+ *
+ * @time_t:	Number of seconds since 1970-01-01 00:00:00
+ * @time:	Place to put the broken-out time
+ * @return 0 if OK, -EINVAL if the weekday could not be determined
+ */
+int rtc_to_tm(int time_t, struct rtc_time *time);
+
 #endif	/* _RTC_H_ */
diff --git a/net/sntp.c b/net/sntp.c
index 6422eef..d7b9e55 100644
--- a/net/sntp.c
+++ b/net/sntp.c
@@ -68,7 +68,7 @@
 	 */
 	memcpy(&seconds, &rpktp->transmit_timestamp, sizeof(ulong));
 
-	to_tm(ntohl(seconds) - 2208988800UL + net_ntp_time_offset, &tm);
+	rtc_to_tm(ntohl(seconds) - 2208988800UL + net_ntp_time_offset, &tm);
 #if defined(CONFIG_CMD_DATE)
 	rtc_set(&tm);
 #endif
diff --git a/post/drivers/rtc.c b/post/drivers/rtc.c
index cd19f75..8d7a788 100644
--- a/post/drivers/rtc.c
+++ b/post/drivers/rtc.c
@@ -63,7 +63,7 @@
 					   tm->tm_min, tm->tm_sec) + sec;
 	struct rtc_time ntm;
 
-	to_tm (t, &ntm);
+	rtc_to_tm(t, &ntm);
 
 	rtc_set (&ntm);
 }
@@ -119,7 +119,7 @@
 		time_t t = mktime (ynl, i + 1, daysnl[i], 23, 59, 59);
 		struct rtc_time tm;
 
-		to_tm (t, &tm);
+		rtc_to_tm(t, &tm);
 		rtc_set (&tm);
 
 		skipped++;
@@ -143,7 +143,7 @@
 		time_t t = mktime (yl, i + 1, daysl[i], 23, 59, 59);
 		struct rtc_time tm;
 
-		to_tm (t, &tm);
+		rtc_to_tm(t, &tm);
 		rtc_set (&tm);
 
 		skipped++;