Replace BCD2BIN and BIN2BCD macros with inline functions
In the process, also remove backward-compatiblity macros BIN_TO_BCD and BCD_TO_BIN and update the sole board using them to use the new bin2bcd and bcd2bin instead Signed-off-by: Albin Tonnerre <albin.tonnerre@free-electrons.com> Acked-by: Stefan Roese <sr@denx.de> Acked-by: Detlev Zundel <dzu@denx.de>
This commit is contained in:
parent
5b53b29bc2
commit
e84aba135e
board/rsdproto
drivers/rtc
include
@ -26,6 +26,7 @@
|
|||||||
#include <ioports.h>
|
#include <ioports.h>
|
||||||
#include <mpc8260.h>
|
#include <mpc8260.h>
|
||||||
#include <i2c.h>
|
#include <i2c.h>
|
||||||
|
#include <bcd.h>
|
||||||
|
|
||||||
/* define to initialise the SDRAM on the local bus */
|
/* define to initialise the SDRAM on the local bus */
|
||||||
#undef INIT_LOCAL_BUS_SDRAM
|
#undef INIT_LOCAL_BUS_SDRAM
|
||||||
@ -208,16 +209,14 @@ void read_RS5C372_time (struct tm *timedate)
|
|||||||
{
|
{
|
||||||
unsigned char buffer[8];
|
unsigned char buffer[8];
|
||||||
|
|
||||||
#define BCD_TO_BIN(val) ((val)=((val)&15) + ((val)>>4)*10)
|
|
||||||
|
|
||||||
if (! i2c_read (RS5C372_PPC_I2C_ADR, 0, 1, buffer, sizeof (buffer))) {
|
if (! i2c_read (RS5C372_PPC_I2C_ADR, 0, 1, buffer, sizeof (buffer))) {
|
||||||
timedate->tm_sec = BCD_TO_BIN (buffer[0]);
|
timedate->tm_sec = bcd2bin (buffer[0]);
|
||||||
timedate->tm_min = BCD_TO_BIN (buffer[1]);
|
timedate->tm_min = bcd2bin (buffer[1]);
|
||||||
timedate->tm_hour = BCD_TO_BIN (buffer[2]);
|
timedate->tm_hour = bcd2bin (buffer[2]);
|
||||||
timedate->tm_wday = BCD_TO_BIN (buffer[3]);
|
timedate->tm_wday = bcd2bin (buffer[3]);
|
||||||
timedate->tm_mday = BCD_TO_BIN (buffer[4]);
|
timedate->tm_mday = bcd2bin (buffer[4]);
|
||||||
timedate->tm_mon = BCD_TO_BIN (buffer[5]);
|
timedate->tm_mon = bcd2bin (buffer[5]);
|
||||||
timedate->tm_year = BCD_TO_BIN (buffer[6]) + 2000;
|
timedate->tm_year = bcd2bin (buffer[6]) + 2000;
|
||||||
} else {
|
} else {
|
||||||
/*printf("i2c error %02x\n", rc); */
|
/*printf("i2c error %02x\n", rc); */
|
||||||
memset (timedate, 0, sizeof (struct tm));
|
memset (timedate, 0, sizeof (struct tm));
|
||||||
|
@ -76,16 +76,16 @@ int rtc_get(struct rtc_time *tm)
|
|||||||
buf[0], buf[1], buf[2], buf[3],
|
buf[0], buf[1], buf[2], buf[3],
|
||||||
buf[4], buf[5], buf[6], buf[7]);
|
buf[4], buf[5], buf[6], buf[7]);
|
||||||
|
|
||||||
tm->tm_sec = BCD2BIN(buf[M41T62_REG_SEC] & 0x7f);
|
tm->tm_sec = bcd2bin(buf[M41T62_REG_SEC] & 0x7f);
|
||||||
tm->tm_min = BCD2BIN(buf[M41T62_REG_MIN] & 0x7f);
|
tm->tm_min = bcd2bin(buf[M41T62_REG_MIN] & 0x7f);
|
||||||
tm->tm_hour = BCD2BIN(buf[M41T62_REG_HOUR] & 0x3f);
|
tm->tm_hour = bcd2bin(buf[M41T62_REG_HOUR] & 0x3f);
|
||||||
tm->tm_mday = BCD2BIN(buf[M41T62_REG_DAY] & 0x3f);
|
tm->tm_mday = bcd2bin(buf[M41T62_REG_DAY] & 0x3f);
|
||||||
tm->tm_wday = buf[M41T62_REG_WDAY] & 0x07;
|
tm->tm_wday = buf[M41T62_REG_WDAY] & 0x07;
|
||||||
tm->tm_mon = BCD2BIN(buf[M41T62_REG_MON] & 0x1f);
|
tm->tm_mon = bcd2bin(buf[M41T62_REG_MON] & 0x1f);
|
||||||
|
|
||||||
/* assume 20YY not 19YY, and ignore the Century Bit */
|
/* assume 20YY not 19YY, and ignore the Century Bit */
|
||||||
/* U-Boot needs to add 1900 here */
|
/* U-Boot needs to add 1900 here */
|
||||||
tm->tm_year = BCD2BIN(buf[M41T62_REG_YEAR]) + 100 + 1900;
|
tm->tm_year = bcd2bin(buf[M41T62_REG_YEAR]) + 100 + 1900;
|
||||||
|
|
||||||
debug("%s: tm is secs=%d, mins=%d, hours=%d, "
|
debug("%s: tm is secs=%d, mins=%d, hours=%d, "
|
||||||
"mday=%d, mon=%d, year=%d, wday=%d\n",
|
"mday=%d, mon=%d, year=%d, wday=%d\n",
|
||||||
@ -109,19 +109,19 @@ int rtc_set(struct rtc_time *tm)
|
|||||||
/* Merge time-data and register flags into buf[0..7] */
|
/* Merge time-data and register flags into buf[0..7] */
|
||||||
buf[M41T62_REG_SSEC] = 0;
|
buf[M41T62_REG_SSEC] = 0;
|
||||||
buf[M41T62_REG_SEC] =
|
buf[M41T62_REG_SEC] =
|
||||||
BIN2BCD(tm->tm_sec) | (buf[M41T62_REG_SEC] & ~0x7f);
|
bin2bcd(tm->tm_sec) | (buf[M41T62_REG_SEC] & ~0x7f);
|
||||||
buf[M41T62_REG_MIN] =
|
buf[M41T62_REG_MIN] =
|
||||||
BIN2BCD(tm->tm_min) | (buf[M41T62_REG_MIN] & ~0x7f);
|
bin2bcd(tm->tm_min) | (buf[M41T62_REG_MIN] & ~0x7f);
|
||||||
buf[M41T62_REG_HOUR] =
|
buf[M41T62_REG_HOUR] =
|
||||||
BIN2BCD(tm->tm_hour) | (buf[M41T62_REG_HOUR] & ~0x3f) ;
|
bin2bcd(tm->tm_hour) | (buf[M41T62_REG_HOUR] & ~0x3f) ;
|
||||||
buf[M41T62_REG_WDAY] =
|
buf[M41T62_REG_WDAY] =
|
||||||
(tm->tm_wday & 0x07) | (buf[M41T62_REG_WDAY] & ~0x07);
|
(tm->tm_wday & 0x07) | (buf[M41T62_REG_WDAY] & ~0x07);
|
||||||
buf[M41T62_REG_DAY] =
|
buf[M41T62_REG_DAY] =
|
||||||
BIN2BCD(tm->tm_mday) | (buf[M41T62_REG_DAY] & ~0x3f);
|
bin2bcd(tm->tm_mday) | (buf[M41T62_REG_DAY] & ~0x3f);
|
||||||
buf[M41T62_REG_MON] =
|
buf[M41T62_REG_MON] =
|
||||||
BIN2BCD(tm->tm_mon) | (buf[M41T62_REG_MON] & ~0x1f);
|
bin2bcd(tm->tm_mon) | (buf[M41T62_REG_MON] & ~0x1f);
|
||||||
/* assume 20YY not 19YY */
|
/* assume 20YY not 19YY */
|
||||||
buf[M41T62_REG_YEAR] = BIN2BCD(tm->tm_year % 100);
|
buf[M41T62_REG_YEAR] = bin2bcd(tm->tm_year % 100);
|
||||||
|
|
||||||
if (i2c_write(CONFIG_SYS_I2C_RTC_ADDR, 0, 1, buf, M41T62_DATETIME_REG_SIZE)) {
|
if (i2c_write(CONFIG_SYS_I2C_RTC_ADDR, 0, 1, buf, M41T62_DATETIME_REG_SIZE)) {
|
||||||
printf("I2C write failed in %s()\n", __func__);
|
printf("I2C write failed in %s()\n", __func__);
|
||||||
|
@ -49,13 +49,13 @@ int rtc_get(struct rtc_time *tm)
|
|||||||
/* Read 52 bits into our buffer */
|
/* Read 52 bits into our buffer */
|
||||||
tws_read(buffer, 52);
|
tws_read(buffer, 52);
|
||||||
|
|
||||||
tm->tm_sec = BCD2BIN( buffer[0] & 0x7F);
|
tm->tm_sec = bcd2bin( buffer[0] & 0x7F);
|
||||||
tm->tm_min = BCD2BIN( buffer[1] & 0x7F);
|
tm->tm_min = bcd2bin( buffer[1] & 0x7F);
|
||||||
tm->tm_hour = BCD2BIN( buffer[2] & 0x3F);
|
tm->tm_hour = bcd2bin( buffer[2] & 0x3F);
|
||||||
tm->tm_wday = BCD2BIN( buffer[3] & 0x07);
|
tm->tm_wday = bcd2bin( buffer[3] & 0x07);
|
||||||
tm->tm_mday = BCD2BIN((buffer[3] & 0xF0) >> 4 | (buffer[4] & 0x0F) << 4);
|
tm->tm_mday = bcd2bin((buffer[3] & 0xF0) >> 4 | (buffer[4] & 0x0F) << 4);
|
||||||
tm->tm_mon = BCD2BIN((buffer[4] & 0x30) >> 4 | (buffer[5] & 0x0F) << 4);
|
tm->tm_mon = bcd2bin((buffer[4] & 0x30) >> 4 | (buffer[5] & 0x0F) << 4);
|
||||||
tm->tm_year = BCD2BIN((buffer[5] & 0xF0) >> 4 | (buffer[6] & 0x0F) << 4) + 2000;
|
tm->tm_year = bcd2bin((buffer[5] & 0xF0) >> 4 | (buffer[6] & 0x0F) << 4) + 2000;
|
||||||
tm->tm_yday = 0;
|
tm->tm_yday = 0;
|
||||||
tm->tm_isdst = 0;
|
tm->tm_isdst = 0;
|
||||||
|
|
||||||
@ -81,17 +81,17 @@ int rtc_set(struct rtc_time *tm)
|
|||||||
tm->tm_hour, tm->tm_min, tm->tm_sec);
|
tm->tm_hour, tm->tm_min, tm->tm_sec);
|
||||||
|
|
||||||
memset(buffer, 0, 7);
|
memset(buffer, 0, 7);
|
||||||
buffer[0] = BIN2BCD(tm->tm_sec);
|
buffer[0] = bin2bcd(tm->tm_sec);
|
||||||
buffer[1] = BIN2BCD(tm->tm_min);
|
buffer[1] = bin2bcd(tm->tm_min);
|
||||||
buffer[2] = BIN2BCD(tm->tm_hour);
|
buffer[2] = bin2bcd(tm->tm_hour);
|
||||||
buffer[3] = BIN2BCD(tm->tm_wday);
|
buffer[3] = bin2bcd(tm->tm_wday);
|
||||||
tmp = BIN2BCD(tm->tm_mday);
|
tmp = bin2bcd(tm->tm_mday);
|
||||||
buffer[3] |= (tmp & 0x0F) << 4;
|
buffer[3] |= (tmp & 0x0F) << 4;
|
||||||
buffer[4] = (tmp & 0xF0) >> 4;
|
buffer[4] = (tmp & 0xF0) >> 4;
|
||||||
tmp = BIN2BCD(tm->tm_mon);
|
tmp = bin2bcd(tm->tm_mon);
|
||||||
buffer[4] |= (tmp & 0x0F) << 4;
|
buffer[4] |= (tmp & 0x0F) << 4;
|
||||||
buffer[5] = (tmp & 0xF0) >> 4;
|
buffer[5] = (tmp & 0xF0) >> 4;
|
||||||
tmp = BIN2BCD(tm->tm_year % 100);
|
tmp = bin2bcd(tm->tm_year % 100);
|
||||||
buffer[5] |= (tmp & 0x0F) << 4;
|
buffer[5] |= (tmp & 0x0F) << 4;
|
||||||
buffer[6] = (tmp & 0xF0) >> 4;
|
buffer[6] = (tmp & 0xF0) >> 4;
|
||||||
|
|
||||||
|
@ -37,24 +37,24 @@
|
|||||||
int rtc_get (struct rtc_time* tm)
|
int rtc_get (struct rtc_time* tm)
|
||||||
{
|
{
|
||||||
RTCCON |= 1;
|
RTCCON |= 1;
|
||||||
tm->tm_year = BCD2BIN(BCDYEAR);
|
tm->tm_year = bcd2bin(BCDYEAR);
|
||||||
tm->tm_mon = BCD2BIN(BCDMON);
|
tm->tm_mon = bcd2bin(BCDMON);
|
||||||
tm->tm_wday = BCD2BIN(BCDDATE);
|
tm->tm_wday = bcd2bin(BCDDATE);
|
||||||
tm->tm_mday = BCD2BIN(BCDDAY);
|
tm->tm_mday = bcd2bin(BCDDAY);
|
||||||
tm->tm_hour = BCD2BIN(BCDHOUR);
|
tm->tm_hour = bcd2bin(BCDHOUR);
|
||||||
tm->tm_min = BCD2BIN(BCDMIN);
|
tm->tm_min = bcd2bin(BCDMIN);
|
||||||
tm->tm_sec = BCD2BIN(BCDSEC);
|
tm->tm_sec = bcd2bin(BCDSEC);
|
||||||
|
|
||||||
if (tm->tm_sec==0) {
|
if (tm->tm_sec==0) {
|
||||||
/* we have to re-read the rtc data because of the "one second deviation" problem */
|
/* we have to re-read the rtc data because of the "one second deviation" problem */
|
||||||
/* see RTC datasheet for more info about it */
|
/* see RTC datasheet for more info about it */
|
||||||
tm->tm_year = BCD2BIN(BCDYEAR);
|
tm->tm_year = bcd2bin(BCDYEAR);
|
||||||
tm->tm_mon = BCD2BIN(BCDMON);
|
tm->tm_mon = bcd2bin(BCDMON);
|
||||||
tm->tm_mday = BCD2BIN(BCDDAY);
|
tm->tm_mday = bcd2bin(BCDDAY);
|
||||||
tm->tm_wday = BCD2BIN(BCDDATE);
|
tm->tm_wday = bcd2bin(BCDDATE);
|
||||||
tm->tm_hour = BCD2BIN(BCDHOUR);
|
tm->tm_hour = bcd2bin(BCDHOUR);
|
||||||
tm->tm_min = BCD2BIN(BCDMIN);
|
tm->tm_min = bcd2bin(BCDMIN);
|
||||||
tm->tm_sec = BCD2BIN(BCDSEC);
|
tm->tm_sec = bcd2bin(BCDSEC);
|
||||||
}
|
}
|
||||||
|
|
||||||
RTCCON &= ~1;
|
RTCCON &= ~1;
|
||||||
@ -75,13 +75,13 @@ int rtc_set (struct rtc_time* tm)
|
|||||||
tm->tm_year -= 2000;
|
tm->tm_year -= 2000;
|
||||||
|
|
||||||
RTCCON |= 1;
|
RTCCON |= 1;
|
||||||
BCDYEAR = BIN2BCD(tm->tm_year);
|
BCDYEAR = bin2bcd(tm->tm_year);
|
||||||
BCDMON = BIN2BCD(tm->tm_mon);
|
BCDMON = bin2bcd(tm->tm_mon);
|
||||||
BCDDAY = BIN2BCD(tm->tm_mday);
|
BCDDAY = bin2bcd(tm->tm_mday);
|
||||||
BCDDATE = BIN2BCD(tm->tm_wday);
|
BCDDATE = bin2bcd(tm->tm_wday);
|
||||||
BCDHOUR = BIN2BCD(tm->tm_hour);
|
BCDHOUR = bin2bcd(tm->tm_hour);
|
||||||
BCDMIN = BIN2BCD(tm->tm_min);
|
BCDMIN = bin2bcd(tm->tm_min);
|
||||||
BCDSEC = BIN2BCD(tm->tm_sec);
|
BCDSEC = bin2bcd(tm->tm_sec);
|
||||||
RTCCON &= 1;
|
RTCCON &= 1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -116,13 +116,13 @@ int rtc_get(struct rtc_time *tm)
|
|||||||
buf[0], buf[1], buf[2], buf[3],
|
buf[0], buf[1], buf[2], buf[3],
|
||||||
buf[4], buf[5], buf[6], buf[7]);
|
buf[4], buf[5], buf[6], buf[7]);
|
||||||
|
|
||||||
tm->tm_sec = BCD2BIN(buf[CCR_SEC]);
|
tm->tm_sec = bcd2bin(buf[CCR_SEC]);
|
||||||
tm->tm_min = BCD2BIN(buf[CCR_MIN]);
|
tm->tm_min = bcd2bin(buf[CCR_MIN]);
|
||||||
tm->tm_hour = BCD2BIN(buf[CCR_HOUR] & 0x3F); /* hr is 0-23 */
|
tm->tm_hour = bcd2bin(buf[CCR_HOUR] & 0x3F); /* hr is 0-23 */
|
||||||
tm->tm_mday = BCD2BIN(buf[CCR_MDAY]);
|
tm->tm_mday = bcd2bin(buf[CCR_MDAY]);
|
||||||
tm->tm_mon = BCD2BIN(buf[CCR_MONTH]); /* mon is 0-11 */
|
tm->tm_mon = bcd2bin(buf[CCR_MONTH]); /* mon is 0-11 */
|
||||||
tm->tm_year = BCD2BIN(buf[CCR_YEAR])
|
tm->tm_year = bcd2bin(buf[CCR_YEAR])
|
||||||
+ (BCD2BIN(buf[CCR_Y2K]) * 100);
|
+ (bcd2bin(buf[CCR_Y2K]) * 100);
|
||||||
tm->tm_wday = buf[CCR_WDAY];
|
tm->tm_wday = buf[CCR_WDAY];
|
||||||
|
|
||||||
debug("%s: tm is secs=%d, mins=%d, hours=%d, "
|
debug("%s: tm is secs=%d, mins=%d, hours=%d, "
|
||||||
@ -143,21 +143,21 @@ int rtc_set(struct rtc_time *tm)
|
|||||||
tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_wday,
|
tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_wday,
|
||||||
tm->tm_hour, tm->tm_min, tm->tm_sec);
|
tm->tm_hour, tm->tm_min, tm->tm_sec);
|
||||||
|
|
||||||
buf[CCR_SEC] = BIN2BCD(tm->tm_sec);
|
buf[CCR_SEC] = bin2bcd(tm->tm_sec);
|
||||||
buf[CCR_MIN] = BIN2BCD(tm->tm_min);
|
buf[CCR_MIN] = bin2bcd(tm->tm_min);
|
||||||
|
|
||||||
/* set hour and 24hr bit */
|
/* set hour and 24hr bit */
|
||||||
buf[CCR_HOUR] = BIN2BCD(tm->tm_hour) | X1205_HR_MIL;
|
buf[CCR_HOUR] = bin2bcd(tm->tm_hour) | X1205_HR_MIL;
|
||||||
|
|
||||||
buf[CCR_MDAY] = BIN2BCD(tm->tm_mday);
|
buf[CCR_MDAY] = bin2bcd(tm->tm_mday);
|
||||||
|
|
||||||
/* month, 1 - 12 */
|
/* month, 1 - 12 */
|
||||||
buf[CCR_MONTH] = BIN2BCD(tm->tm_mon);
|
buf[CCR_MONTH] = bin2bcd(tm->tm_mon);
|
||||||
|
|
||||||
/* year, since the rtc epoch*/
|
/* year, since the rtc epoch*/
|
||||||
buf[CCR_YEAR] = BIN2BCD(tm->tm_year % 100);
|
buf[CCR_YEAR] = bin2bcd(tm->tm_year % 100);
|
||||||
buf[CCR_WDAY] = tm->tm_wday & 0x07;
|
buf[CCR_WDAY] = tm->tm_wday & 0x07;
|
||||||
buf[CCR_Y2K] = BIN2BCD(tm->tm_year / 100);
|
buf[CCR_Y2K] = bin2bcd(tm->tm_year / 100);
|
||||||
|
|
||||||
/* this sequence is required to unlock the chip */
|
/* this sequence is required to unlock the chip */
|
||||||
rtc_write(X1205_REG_SR, X1205_SR_WEL);
|
rtc_write(X1205_REG_SR, X1205_SR_WEL);
|
||||||
|
@ -3,18 +3,23 @@
|
|||||||
* at your option.
|
* at your option.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* macros to translate to/from binary and binary-coded decimal (frequently
|
/* inline functions to translate to/from binary and binary-coded decimal
|
||||||
* found in RTC chips).
|
* (frequently found in RTC chips).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _BCD_H
|
#ifndef _BCD_H
|
||||||
#define _BCD_H
|
#define _BCD_H
|
||||||
|
|
||||||
#define BCD2BIN(val) (((val) & 0x0f) + ((val)>>4)*10)
|
#include <linux/types.h>
|
||||||
#define BIN2BCD(val) ((((val)/10)<<4) + (val)%10)
|
|
||||||
|
|
||||||
/* backwards compat */
|
static inline unsigned int bcd2bin(u8 val)
|
||||||
#define BCD_TO_BIN(val) ((val)=BCD2BIN(val))
|
{
|
||||||
#define BIN_TO_BCD(val) ((val)=BIN2BCD(val))
|
return ((val) & 0x0f) + ((val) >> 4) * 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline u8 bin2bcd (unsigned int val)
|
||||||
|
{
|
||||||
|
return (((val / 10) << 4) | (val % 10));
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* _BCD_H */
|
#endif /* _BCD_H */
|
||||||
|
@ -83,16 +83,4 @@
|
|||||||
#define RTC_VALID RTC_REG_D
|
#define RTC_VALID RTC_REG_D
|
||||||
# define RTC_VRT 0x80 /* valid RAM and time */
|
# define RTC_VRT 0x80 /* valid RAM and time */
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
|
|
||||||
/* example: !(CMOS_READ(RTC_CONTROL) & RTC_DM_BINARY)
|
|
||||||
* determines if the following two #defines are needed
|
|
||||||
*/
|
|
||||||
#ifndef BCD_TO_BIN
|
|
||||||
#define BCD_TO_BIN(val) ((val)=((val)&15) + ((val)>>4)*10)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef BIN_TO_BCD
|
|
||||||
#define BIN_TO_BCD(val) ((val)=(((val)/10)<<4) + (val)%10)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _MC146818RTC_H */
|
#endif /* _MC146818RTC_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user