diff options
Diffstat (limited to 'drivers/macintosh/via-pmu.c')
-rw-r--r-- | drivers/macintosh/via-pmu.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/drivers/macintosh/via-pmu.c b/drivers/macintosh/via-pmu.c index d72c450aebe5..60f57e2abf21 100644 --- a/drivers/macintosh/via-pmu.c +++ b/drivers/macintosh/via-pmu.c | |||
@@ -1737,6 +1737,39 @@ pmu_enable_irled(int on) | |||
1737 | pmu_wait_complete(&req); | 1737 | pmu_wait_complete(&req); |
1738 | } | 1738 | } |
1739 | 1739 | ||
1740 | /* Offset between Unix time (1970-based) and Mac time (1904-based) */ | ||
1741 | #define RTC_OFFSET 2082844800 | ||
1742 | |||
1743 | time64_t pmu_get_time(void) | ||
1744 | { | ||
1745 | struct adb_request req; | ||
1746 | u32 now; | ||
1747 | |||
1748 | if (pmu_request(&req, NULL, 1, PMU_READ_RTC) < 0) | ||
1749 | return 0; | ||
1750 | pmu_wait_complete(&req); | ||
1751 | if (req.reply_len != 4) | ||
1752 | pr_err("%s: got %d byte reply\n", __func__, req.reply_len); | ||
1753 | now = (req.reply[0] << 24) + (req.reply[1] << 16) + | ||
1754 | (req.reply[2] << 8) + req.reply[3]; | ||
1755 | return (time64_t)now - RTC_OFFSET; | ||
1756 | } | ||
1757 | |||
1758 | int pmu_set_rtc_time(struct rtc_time *tm) | ||
1759 | { | ||
1760 | u32 now; | ||
1761 | struct adb_request req; | ||
1762 | |||
1763 | now = lower_32_bits(rtc_tm_to_time64(tm) + RTC_OFFSET); | ||
1764 | if (pmu_request(&req, NULL, 5, PMU_SET_RTC, | ||
1765 | now >> 24, now >> 16, now >> 8, now) < 0) | ||
1766 | return -ENXIO; | ||
1767 | pmu_wait_complete(&req); | ||
1768 | if (req.reply_len != 0) | ||
1769 | pr_err("%s: got %d byte reply\n", __func__, req.reply_len); | ||
1770 | return 0; | ||
1771 | } | ||
1772 | |||
1740 | void | 1773 | void |
1741 | pmu_restart(void) | 1774 | pmu_restart(void) |
1742 | { | 1775 | { |