| Date: | 2010-06-06 16:58:19 (13 years 6 months ago) |
|---|---|
| Author: | Lars C. |
| Commit: | f934e4b076ff99c345ba1ab92c0bfef94be7ae8a |
| Message: | RTC: JZ4740: Remove deadlocks which could occur if the HW was broken |
| Files: |
drivers/rtc/rtc-jz4740.c (3 diffs) |
Change Details
| drivers/rtc/rtc-jz4740.c | ||
|---|---|---|
| 54 | 54 | static inline void jz4740_rtc_wait_write_ready(struct jz4740_rtc *rtc) |
| 55 | 55 | { |
| 56 | 56 | uint32_t ctrl; |
| 57 | int timeout = 10; | |
| 58 | ||
| 57 | 59 | do { |
| 58 | 60 | ctrl = jz4740_rtc_reg_read(rtc, JZ_REG_RTC_CTRL); |
| 59 | } while (!(ctrl & JZ_RTC_CTRL_WRDY)); | |
| 61 | } while (!(ctrl & JZ_RTC_CTRL_WRDY) && timeout--); | |
| 60 | 62 | } |
| 61 | 63 | |
| 62 | 64 | static inline void jz4740_rtc_reg_write(struct jz4740_rtc *rtc, size_t reg, |
| ... | ... | |
| 91 | 93 | { |
| 92 | 94 | struct jz4740_rtc *rtc = dev_get_drvdata(dev); |
| 93 | 95 | uint32_t secs, secs2; |
| 96 | int timeout = 5; | |
| 94 | 97 | |
| 98 | /* If the seconds register is read while it is updated, it can contain a | |
| 99 | * bogus value. This can be avoided by making sure that two consecutive | |
| 100 | * reads have the same value. | |
| 101 | */ | |
| 95 | 102 | secs = jz4740_rtc_reg_read(rtc, JZ_REG_RTC_SEC); |
| 96 | 103 | secs2 = jz4740_rtc_reg_read(rtc, JZ_REG_RTC_SEC); |
| 97 | 104 | |
| 98 | while (secs != secs2) { | |
| 105 | while (secs != secs2 && timeout--) { | |
| 99 | 106 | secs = secs2; |
| 100 | 107 | secs2 = jz4740_rtc_reg_read(rtc, JZ_REG_RTC_SEC); |
| 101 | 108 | } |
| 102 | 109 | |
| 110 | if (timeout == 0) | |
| 111 | return -EIO; | |
| 112 | ||
| 103 | 113 | rtc_time_to_tm(secs, time); |
| 104 | 114 | |
| 105 | 115 | return rtc_valid_tm(time); |
| ... | ... | |
| 120 | 130 | static int jz4740_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) |
| 121 | 131 | { |
| 122 | 132 | struct jz4740_rtc *rtc = dev_get_drvdata(dev); |
| 123 | uint32_t secs, secs2; | |
| 133 | uint32_t secs; | |
| 124 | 134 | uint32_t ctrl; |
| 125 | 135 | |
| 126 | 136 | secs = jz4740_rtc_reg_read(rtc, JZ_REG_RTC_SEC_ALARM); |
| 127 | secs2 = jz4740_rtc_reg_read(rtc, JZ_REG_RTC_SEC_ALARM); | |
| 128 | ||
| 129 | while (secs != secs2) { | |
| 130 | secs = secs2; | |
| 131 | secs2 = jz4740_rtc_reg_read(rtc, JZ_REG_RTC_SEC_ALARM); | |
| 132 | } | |
| 133 | 137 | |
| 134 | 138 | ctrl = jz4740_rtc_reg_read(rtc, JZ_REG_RTC_CTRL); |
| 135 | 139 | |
Branches:
ben-wpan
ben-wpan-stefan
5396a9238205f20f811ea57898980d3ca82df0b6
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9
