diff options
author | Alexandre Belloni <alexandre.belloni@free-electrons.com> | 2015-08-04 04:48:20 -0400 |
---|---|---|
committer | Alexandre Belloni <alexandre.belloni@free-electrons.com> | 2015-09-05 07:19:12 -0400 |
commit | 8c4a4467cda299491eff64640c891a0b2926cb76 (patch) | |
tree | 8411f90b3420f6ef6578ea1c051aa6cfe3edf3fa /drivers/rtc | |
parent | a27c7bf657cb4ab893328359b66a584251be6cac (diff) |
rtc: rx8025: reset validity when setting time
Wait for the user to set the time to reset the validity bits. Until then,
the time may be invalid.
Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
Diffstat (limited to 'drivers/rtc')
-rw-r--r-- | drivers/rtc/rtc-rx8025.c | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/drivers/rtc/rtc-rx8025.c b/drivers/rtc/rtc-rx8025.c index 22ce08d6e807..340133a5d907 100644 --- a/drivers/rtc/rtc-rx8025.c +++ b/drivers/rtc/rtc-rx8025.c | |||
@@ -104,6 +104,19 @@ static s32 rx8025_write_regs(const struct i2c_client *client, | |||
104 | length, values); | 104 | length, values); |
105 | } | 105 | } |
106 | 106 | ||
107 | static int rx8025_reset_validity(struct i2c_client *client) | ||
108 | { | ||
109 | int ctrl2 = rx8025_read_reg(client, RX8025_REG_CTRL2); | ||
110 | |||
111 | if (ctrl2 < 0) | ||
112 | return ctrl2; | ||
113 | |||
114 | ctrl2 &= ~(RX8025_BIT_CTRL2_PON | RX8025_BIT_CTRL2_VDET); | ||
115 | |||
116 | return rx8025_write_reg(client, RX8025_REG_CTRL2, | ||
117 | ctrl2 | RX8025_BIT_CTRL2_XST); | ||
118 | } | ||
119 | |||
107 | static irqreturn_t rx8025_handle_irq(int irq, void *dev_id) | 120 | static irqreturn_t rx8025_handle_irq(int irq, void *dev_id) |
108 | { | 121 | { |
109 | struct i2c_client *client = dev_id; | 122 | struct i2c_client *client = dev_id; |
@@ -133,10 +146,6 @@ static irqreturn_t rx8025_handle_irq(int irq, void *dev_id) | |||
133 | rtc_update_irq(rx8025->rtc, 1, RTC_AF | RTC_IRQF); | 146 | rtc_update_irq(rx8025->rtc, 1, RTC_AF | RTC_IRQF); |
134 | } | 147 | } |
135 | 148 | ||
136 | /* acknowledge IRQ */ | ||
137 | rx8025_write_reg(client, RX8025_REG_CTRL2, | ||
138 | status | RX8025_BIT_CTRL2_XST); | ||
139 | |||
140 | out: | 149 | out: |
141 | return IRQ_HANDLED; | 150 | return IRQ_HANDLED; |
142 | } | 151 | } |
@@ -193,6 +202,7 @@ static int rx8025_set_time(struct device *dev, struct rtc_time *dt) | |||
193 | { | 202 | { |
194 | struct rx8025_data *rx8025 = dev_get_drvdata(dev); | 203 | struct rx8025_data *rx8025 = dev_get_drvdata(dev); |
195 | u8 date[7]; | 204 | u8 date[7]; |
205 | int ret; | ||
196 | 206 | ||
197 | if ((dt->tm_year < 100) || (dt->tm_year > 199)) | 207 | if ((dt->tm_year < 100) || (dt->tm_year > 199)) |
198 | return -EINVAL; | 208 | return -EINVAL; |
@@ -219,7 +229,11 @@ static int rx8025_set_time(struct device *dev, struct rtc_time *dt) | |||
219 | __func__, | 229 | __func__, |
220 | date[0], date[1], date[2], date[3], date[4], date[5], date[6]); | 230 | date[0], date[1], date[2], date[3], date[4], date[5], date[6]); |
221 | 231 | ||
222 | return rx8025_write_regs(rx8025->client, RX8025_REG_SEC, 7, date); | 232 | ret = rx8025_write_regs(rx8025->client, RX8025_REG_SEC, 7, date); |
233 | if (ret < 0) | ||
234 | return ret; | ||
235 | |||
236 | return rx8025_reset_validity(rx8025->client); | ||
223 | } | 237 | } |
224 | 238 | ||
225 | static int rx8025_init_client(struct i2c_client *client) | 239 | static int rx8025_init_client(struct i2c_client *client) |
@@ -239,19 +253,16 @@ static int rx8025_init_client(struct i2c_client *client) | |||
239 | if (ctrl[1] & RX8025_BIT_CTRL2_PON) { | 253 | if (ctrl[1] & RX8025_BIT_CTRL2_PON) { |
240 | dev_warn(&client->dev, "power-on reset was detected, " | 254 | dev_warn(&client->dev, "power-on reset was detected, " |
241 | "you may have to readjust the clock\n"); | 255 | "you may have to readjust the clock\n"); |
242 | need_clear = 1; | ||
243 | } | 256 | } |
244 | 257 | ||
245 | if (ctrl[1] & RX8025_BIT_CTRL2_VDET) { | 258 | if (ctrl[1] & RX8025_BIT_CTRL2_VDET) { |
246 | dev_warn(&client->dev, "a power voltage drop was detected, " | 259 | dev_warn(&client->dev, "a power voltage drop was detected, " |
247 | "you may have to readjust the clock\n"); | 260 | "you may have to readjust the clock\n"); |
248 | need_clear = 1; | ||
249 | } | 261 | } |
250 | 262 | ||
251 | if (!(ctrl[1] & RX8025_BIT_CTRL2_XST)) { | 263 | if (!(ctrl[1] & RX8025_BIT_CTRL2_XST)) { |
252 | dev_warn(&client->dev, "Oscillation stop was detected," | 264 | dev_warn(&client->dev, "Oscillation stop was detected," |
253 | "you may have to readjust the clock\n"); | 265 | "you may have to readjust the clock\n"); |
254 | need_clear = 1; | ||
255 | } | 266 | } |
256 | 267 | ||
257 | if (ctrl[1] & (RX8025_BIT_CTRL2_DAFG | RX8025_BIT_CTRL2_WAFG)) { | 268 | if (ctrl[1] & (RX8025_BIT_CTRL2_DAFG | RX8025_BIT_CTRL2_WAFG)) { |
@@ -264,10 +275,8 @@ static int rx8025_init_client(struct i2c_client *client) | |||
264 | 275 | ||
265 | if (need_clear) { | 276 | if (need_clear) { |
266 | ctrl2 = ctrl[1]; | 277 | ctrl2 = ctrl[1]; |
267 | ctrl2 &= ~(RX8025_BIT_CTRL2_PON | RX8025_BIT_CTRL2_VDET | | 278 | ctrl2 &= ~(RX8025_BIT_CTRL2_CTFG | RX8025_BIT_CTRL2_WAFG | |
268 | RX8025_BIT_CTRL2_CTFG | RX8025_BIT_CTRL2_WAFG | | ||
269 | RX8025_BIT_CTRL2_DAFG); | 279 | RX8025_BIT_CTRL2_DAFG); |
270 | ctrl2 |= RX8025_BIT_CTRL2_XST; | ||
271 | 280 | ||
272 | err = rx8025_write_reg(client, RX8025_REG_CTRL2, ctrl2); | 281 | err = rx8025_write_reg(client, RX8025_REG_CTRL2, ctrl2); |
273 | } | 282 | } |