diff options
author | Paul Brook <paul@codesourcery.com> | 2009-11-20 00:03:47 +0000 |
---|---|---|
committer | Paul Brook <paul@codesourcery.com> | 2009-11-22 21:27:40 +0000 |
commit | abd0c6bda0c89f36528e1a7efac99277607a5280 (patch) | |
tree | c9e5adc54b76a3e428c3222a5e48b2c1cd39764c /hw/omap1.c | |
parent | a992fe3d0fc185112677286f7a02204d8245b61e (diff) | |
download | qemu-abd0c6bda0c89f36528e1a7efac99277607a5280.tar.gz qemu-abd0c6bda0c89f36528e1a7efac99277607a5280.tar.bz2 qemu-abd0c6bda0c89f36528e1a7efac99277607a5280.zip |
BCD cleanup
Combine multiple BCD implementations.
Signed-off-by: Paul Brook <paul@codesourcery.com>
Diffstat (limited to 'hw/omap1.c')
-rw-r--r-- | hw/omap1.c | 70 |
1 files changed, 30 insertions, 40 deletions
diff --git a/hw/omap1.c b/hw/omap1.c index e9676ecc88..b5d78cd917 100644 --- a/hw/omap1.c +++ b/hw/omap1.c @@ -3358,16 +3358,6 @@ static void omap_rtc_alarm_update(struct omap_rtc_s *s) printf("%s: conversion failed\n", __FUNCTION__); } -static inline uint8_t omap_rtc_bcd(int num) -{ - return ((num / 10) << 4) | (num % 10); -} - -static inline int omap_rtc_bin(uint8_t num) -{ - return (num & 15) + 10 * (num >> 4); -} - static uint32_t omap_rtc_read(void *opaque, target_phys_addr_t addr) { struct omap_rtc_s *s = (struct omap_rtc_s *) opaque; @@ -3376,51 +3366,51 @@ static uint32_t omap_rtc_read(void *opaque, target_phys_addr_t addr) switch (offset) { case 0x00: /* SECONDS_REG */ - return omap_rtc_bcd(s->current_tm.tm_sec); + return to_bcd(s->current_tm.tm_sec); case 0x04: /* MINUTES_REG */ - return omap_rtc_bcd(s->current_tm.tm_min); + return to_bcd(s->current_tm.tm_min); case 0x08: /* HOURS_REG */ if (s->pm_am) return ((s->current_tm.tm_hour > 11) << 7) | - omap_rtc_bcd(((s->current_tm.tm_hour - 1) % 12) + 1); + to_bcd(((s->current_tm.tm_hour - 1) % 12) + 1); else - return omap_rtc_bcd(s->current_tm.tm_hour); + return to_bcd(s->current_tm.tm_hour); case 0x0c: /* DAYS_REG */ - return omap_rtc_bcd(s->current_tm.tm_mday); + return to_bcd(s->current_tm.tm_mday); case 0x10: /* MONTHS_REG */ - return omap_rtc_bcd(s->current_tm.tm_mon + 1); + return to_bcd(s->current_tm.tm_mon + 1); case 0x14: /* YEARS_REG */ - return omap_rtc_bcd(s->current_tm.tm_year % 100); + return to_bcd(s->current_tm.tm_year % 100); case 0x18: /* WEEK_REG */ return s->current_tm.tm_wday; case 0x20: /* ALARM_SECONDS_REG */ - return omap_rtc_bcd(s->alarm_tm.tm_sec); + return to_bcd(s->alarm_tm.tm_sec); case 0x24: /* ALARM_MINUTES_REG */ - return omap_rtc_bcd(s->alarm_tm.tm_min); + return to_bcd(s->alarm_tm.tm_min); case 0x28: /* ALARM_HOURS_REG */ if (s->pm_am) return ((s->alarm_tm.tm_hour > 11) << 7) | - omap_rtc_bcd(((s->alarm_tm.tm_hour - 1) % 12) + 1); + to_bcd(((s->alarm_tm.tm_hour - 1) % 12) + 1); else - return omap_rtc_bcd(s->alarm_tm.tm_hour); + return to_bcd(s->alarm_tm.tm_hour); case 0x2c: /* ALARM_DAYS_REG */ - return omap_rtc_bcd(s->alarm_tm.tm_mday); + return to_bcd(s->alarm_tm.tm_mday); case 0x30: /* ALARM_MONTHS_REG */ - return omap_rtc_bcd(s->alarm_tm.tm_mon + 1); + return to_bcd(s->alarm_tm.tm_mon + 1); case 0x34: /* ALARM_YEARS_REG */ - return omap_rtc_bcd(s->alarm_tm.tm_year % 100); + return to_bcd(s->alarm_tm.tm_year % 100); case 0x40: /* RTC_CTRL_REG */ return (s->pm_am << 3) | (s->auto_comp << 2) | @@ -3459,7 +3449,7 @@ static void omap_rtc_write(void *opaque, target_phys_addr_t addr, printf("RTC SEC_REG <-- %02x\n", value); #endif s->ti -= s->current_tm.tm_sec; - s->ti += omap_rtc_bin(value); + s->ti += from_bcd(value); return; case 0x04: /* MINUTES_REG */ @@ -3467,7 +3457,7 @@ static void omap_rtc_write(void *opaque, target_phys_addr_t addr, printf("RTC MIN_REG <-- %02x\n", value); #endif s->ti -= s->current_tm.tm_min * 60; - s->ti += omap_rtc_bin(value) * 60; + s->ti += from_bcd(value) * 60; return; case 0x08: /* HOURS_REG */ @@ -3476,10 +3466,10 @@ static void omap_rtc_write(void *opaque, target_phys_addr_t addr, #endif s->ti -= s->current_tm.tm_hour * 3600; if (s->pm_am) { - s->ti += (omap_rtc_bin(value & 0x3f) & 12) * 3600; + s->ti += (from_bcd(value & 0x3f) & 12) * 3600; s->ti += ((value >> 7) & 1) * 43200; } else - s->ti += omap_rtc_bin(value & 0x3f) * 3600; + s->ti += from_bcd(value & 0x3f) * 3600; return; case 0x0c: /* DAYS_REG */ @@ -3487,7 +3477,7 @@ static void omap_rtc_write(void *opaque, target_phys_addr_t addr, printf("RTC DAY_REG <-- %02x\n", value); #endif s->ti -= s->current_tm.tm_mday * 86400; - s->ti += omap_rtc_bin(value) * 86400; + s->ti += from_bcd(value) * 86400; return; case 0x10: /* MONTHS_REG */ @@ -3495,7 +3485,7 @@ static void omap_rtc_write(void *opaque, target_phys_addr_t addr, printf("RTC MTH_REG <-- %02x\n", value); #endif memcpy(&new_tm, &s->current_tm, sizeof(new_tm)); - new_tm.tm_mon = omap_rtc_bin(value); + new_tm.tm_mon = from_bcd(value); ti[0] = mktimegm(&s->current_tm); ti[1] = mktimegm(&new_tm); @@ -3505,7 +3495,7 @@ static void omap_rtc_write(void *opaque, target_phys_addr_t addr, } else { /* A less accurate version */ s->ti -= s->current_tm.tm_mon * 2592000; - s->ti += omap_rtc_bin(value) * 2592000; + s->ti += from_bcd(value) * 2592000; } return; @@ -3514,7 +3504,7 @@ static void omap_rtc_write(void *opaque, target_phys_addr_t addr, printf("RTC YRS_REG <-- %02x\n", value); #endif memcpy(&new_tm, &s->current_tm, sizeof(new_tm)); - new_tm.tm_year += omap_rtc_bin(value) - (new_tm.tm_year % 100); + new_tm.tm_year += from_bcd(value) - (new_tm.tm_year % 100); ti[0] = mktimegm(&s->current_tm); ti[1] = mktimegm(&new_tm); @@ -3524,7 +3514,7 @@ static void omap_rtc_write(void *opaque, target_phys_addr_t addr, } else { /* A less accurate version */ s->ti -= (s->current_tm.tm_year % 100) * 31536000; - s->ti += omap_rtc_bin(value) * 31536000; + s->ti += from_bcd(value) * 31536000; } return; @@ -3535,7 +3525,7 @@ static void omap_rtc_write(void *opaque, target_phys_addr_t addr, #ifdef ALMDEBUG printf("ALM SEC_REG <-- %02x\n", value); #endif - s->alarm_tm.tm_sec = omap_rtc_bin(value); + s->alarm_tm.tm_sec = from_bcd(value); omap_rtc_alarm_update(s); return; @@ -3543,7 +3533,7 @@ static void omap_rtc_write(void *opaque, target_phys_addr_t addr, #ifdef ALMDEBUG printf("ALM MIN_REG <-- %02x\n", value); #endif - s->alarm_tm.tm_min = omap_rtc_bin(value); + s->alarm_tm.tm_min = from_bcd(value); omap_rtc_alarm_update(s); return; @@ -3553,10 +3543,10 @@ static void omap_rtc_write(void *opaque, target_phys_addr_t addr, #endif if (s->pm_am) s->alarm_tm.tm_hour = - ((omap_rtc_bin(value & 0x3f)) % 12) + + ((from_bcd(value & 0x3f)) % 12) + ((value >> 7) & 1) * 12; else - s->alarm_tm.tm_hour = omap_rtc_bin(value); + s->alarm_tm.tm_hour = from_bcd(value); omap_rtc_alarm_update(s); return; @@ -3564,7 +3554,7 @@ static void omap_rtc_write(void *opaque, target_phys_addr_t addr, #ifdef ALMDEBUG printf("ALM DAY_REG <-- %02x\n", value); #endif - s->alarm_tm.tm_mday = omap_rtc_bin(value); + s->alarm_tm.tm_mday = from_bcd(value); omap_rtc_alarm_update(s); return; @@ -3572,7 +3562,7 @@ static void omap_rtc_write(void *opaque, target_phys_addr_t addr, #ifdef ALMDEBUG printf("ALM MON_REG <-- %02x\n", value); #endif - s->alarm_tm.tm_mon = omap_rtc_bin(value); + s->alarm_tm.tm_mon = from_bcd(value); omap_rtc_alarm_update(s); return; @@ -3580,7 +3570,7 @@ static void omap_rtc_write(void *opaque, target_phys_addr_t addr, #ifdef ALMDEBUG printf("ALM YRS_REG <-- %02x\n", value); #endif - s->alarm_tm.tm_year = omap_rtc_bin(value); + s->alarm_tm.tm_year = from_bcd(value); omap_rtc_alarm_update(s); return; |