diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-01-18 15:10:45 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-01-18 15:10:45 -0500 |
commit | c38dec71664dadb15094151f53886abb69f8f9e6 (patch) | |
tree | afd6aaa893cd4d7d740679826c7f0c252764e4c8 | |
parent | d43fb9f3c5dff281dd72bea5cd2e91386fdc33a8 (diff) | |
parent | 079062b28fb4c58e30d024fdf974e00de53158fd (diff) |
Merge tag 'rtc-4.5' of git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux
Pull RTC updates from Alexandre Belloni:
"Core:
- fix module reference count in rtc-proc
- Replace simple_strtoul by kstrtoul
New driver:
- Epson RX8010SJ
Subsystem wide cleanups:
- use %ph for short hex dumps
- constify *_chip_ops structures
Drivers:
- abx80x: Microcrystal rv1805 support, alarm support
- cmos: prevent kernel warning on IRQ flags mismatch
- s5m: various cleanups
- rv8803: rx8900 compatibility, small error path fix
- sunxi: various cleanups
- lpc32xx: remove irq > NR_IRQS check from probe()
- imxdi: fix spelling mistake in warning message
- ds1685: don't try to micromanage sysfs output size
- da9063: avoid writing undefined data to rtc
- gemini: Remove unnecessary platform_set_drvdata()
- efi: add efi_procfs in efi_rtc_ops
- pcf8523: refuse to write dates later than 2099"
* tag 'rtc-4.5' of git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux: (24 commits)
rtc: cmos: prevent kernel warning on IRQ flags mismatch
rtc: rtc-ds2404: constify ds2404_chip_ops structures
rtc: s5m: Make register configuration per S2MPS device to remove exceptions
rtc: s5m: Add separate field for storing auto-cleared mask in register config
rtc: s5m: Cleanup by removing useless 'rtc' prefix from fields
rtc: Replace simple_strtoul by kstrtoul
rtc: abx80x: add alarm support
rtc: abx80x: Add Microcrystal rv1805 support
rtc: v3020: constify v3020_chip_ops structures
rtc: rv8803: Extend compatibility with the rx8900
rtc: rv8803: fix handling return value of i2c_smbus_read_byte_data
rtc: Add Epson RX8010SJ RTC driver
rtc: lpc32xx: remove irq > NR_IRQS check from probe()
rtc: imxdi: fix spelling mistake in warning message
rtc: ds1685: don't try to micromanage sysfs output size
rtc: use %ph for short hex dumps
rtc: da9063: avoid writing undefined data to rtc
rtc: sunxi: use of_device_get_match_data
rtc: sunxi: constify the data_year_param structure
rtc: sunxi: fix signedness issues
...
-rw-r--r-- | drivers/rtc/Kconfig | 10 | ||||
-rw-r--r-- | drivers/rtc/Makefile | 1 | ||||
-rw-r--r-- | drivers/rtc/rtc-abx80x.c | 146 | ||||
-rw-r--r-- | drivers/rtc/rtc-cmos.c | 2 | ||||
-rw-r--r-- | drivers/rtc/rtc-da9063.c | 23 | ||||
-rw-r--r-- | drivers/rtc/rtc-ds1305.c | 8 | ||||
-rw-r--r-- | drivers/rtc/rtc-ds1307.c | 17 | ||||
-rw-r--r-- | drivers/rtc/rtc-ds1685.c | 22 | ||||
-rw-r--r-- | drivers/rtc/rtc-ds2404.c | 4 | ||||
-rw-r--r-- | drivers/rtc/rtc-efi.c | 66 | ||||
-rw-r--r-- | drivers/rtc/rtc-gemini.c | 1 | ||||
-rw-r--r-- | drivers/rtc/rtc-imxdi.c | 2 | ||||
-rw-r--r-- | drivers/rtc/rtc-lpc32xx.c | 2 | ||||
-rw-r--r-- | drivers/rtc/rtc-pcf8523.c | 11 | ||||
-rw-r--r-- | drivers/rtc/rtc-proc.c | 8 | ||||
-rw-r--r-- | drivers/rtc/rtc-rv8803.c | 3 | ||||
-rw-r--r-- | drivers/rtc/rtc-rx8010.c | 523 | ||||
-rw-r--r-- | drivers/rtc/rtc-s5m.c | 138 | ||||
-rw-r--r-- | drivers/rtc/rtc-sunxi.c | 18 | ||||
-rw-r--r-- | drivers/rtc/rtc-sysfs.c | 11 | ||||
-rw-r--r-- | drivers/rtc/rtc-v3020.c | 6 | ||||
-rw-r--r-- | include/linux/mfd/samsung/rtc.h | 2 |
22 files changed, 894 insertions, 130 deletions
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 2a524244afec..376322f71fd5 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig | |||
@@ -558,6 +558,16 @@ config RTC_DRV_FM3130 | |||
558 | This driver can also be built as a module. If so the module | 558 | This driver can also be built as a module. If so the module |
559 | will be called rtc-fm3130. | 559 | will be called rtc-fm3130. |
560 | 560 | ||
561 | config RTC_DRV_RX8010 | ||
562 | tristate "Epson RX8010SJ" | ||
563 | depends on I2C | ||
564 | help | ||
565 | If you say yes here you get support for the Epson RX8010SJ RTC | ||
566 | chip. | ||
567 | |||
568 | This driver can also be built as a module. If so, the module | ||
569 | will be called rtc-rx8010. | ||
570 | |||
561 | config RTC_DRV_RX8581 | 571 | config RTC_DRV_RX8581 |
562 | tristate "Epson RX-8581" | 572 | tristate "Epson RX-8581" |
563 | help | 573 | help |
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index 231f76451615..62d61b26ca7e 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile | |||
@@ -128,6 +128,7 @@ obj-$(CONFIG_RTC_DRV_RS5C372) += rtc-rs5c372.o | |||
128 | obj-$(CONFIG_RTC_DRV_RV3029C2) += rtc-rv3029c2.o | 128 | obj-$(CONFIG_RTC_DRV_RV3029C2) += rtc-rv3029c2.o |
129 | obj-$(CONFIG_RTC_DRV_RV8803) += rtc-rv8803.o | 129 | obj-$(CONFIG_RTC_DRV_RV8803) += rtc-rv8803.o |
130 | obj-$(CONFIG_RTC_DRV_RX4581) += rtc-rx4581.o | 130 | obj-$(CONFIG_RTC_DRV_RX4581) += rtc-rx4581.o |
131 | obj-$(CONFIG_RTC_DRV_RX8010) += rtc-rx8010.o | ||
131 | obj-$(CONFIG_RTC_DRV_RX8025) += rtc-rx8025.o | 132 | obj-$(CONFIG_RTC_DRV_RX8025) += rtc-rx8025.o |
132 | obj-$(CONFIG_RTC_DRV_RX8581) += rtc-rx8581.o | 133 | obj-$(CONFIG_RTC_DRV_RX8581) += rtc-rx8581.o |
133 | obj-$(CONFIG_RTC_DRV_S35390A) += rtc-s35390a.o | 134 | obj-$(CONFIG_RTC_DRV_S35390A) += rtc-s35390a.o |
diff --git a/drivers/rtc/rtc-abx80x.c b/drivers/rtc/rtc-abx80x.c index afea84c7a155..d41bbcd653f6 100644 --- a/drivers/rtc/rtc-abx80x.c +++ b/drivers/rtc/rtc-abx80x.c | |||
@@ -27,10 +27,28 @@ | |||
27 | #define ABX8XX_REG_YR 0x06 | 27 | #define ABX8XX_REG_YR 0x06 |
28 | #define ABX8XX_REG_WD 0x07 | 28 | #define ABX8XX_REG_WD 0x07 |
29 | 29 | ||
30 | #define ABX8XX_REG_AHTH 0x08 | ||
31 | #define ABX8XX_REG_ASC 0x09 | ||
32 | #define ABX8XX_REG_AMN 0x0a | ||
33 | #define ABX8XX_REG_AHR 0x0b | ||
34 | #define ABX8XX_REG_ADA 0x0c | ||
35 | #define ABX8XX_REG_AMO 0x0d | ||
36 | #define ABX8XX_REG_AWD 0x0e | ||
37 | |||
38 | #define ABX8XX_REG_STATUS 0x0f | ||
39 | #define ABX8XX_STATUS_AF BIT(2) | ||
40 | |||
30 | #define ABX8XX_REG_CTRL1 0x10 | 41 | #define ABX8XX_REG_CTRL1 0x10 |
31 | #define ABX8XX_CTRL_WRITE BIT(0) | 42 | #define ABX8XX_CTRL_WRITE BIT(0) |
43 | #define ABX8XX_CTRL_ARST BIT(2) | ||
32 | #define ABX8XX_CTRL_12_24 BIT(6) | 44 | #define ABX8XX_CTRL_12_24 BIT(6) |
33 | 45 | ||
46 | #define ABX8XX_REG_IRQ 0x12 | ||
47 | #define ABX8XX_IRQ_AIE BIT(2) | ||
48 | #define ABX8XX_IRQ_IM_1_4 (0x3 << 5) | ||
49 | |||
50 | #define ABX8XX_REG_CD_TIMER_CTL 0x18 | ||
51 | |||
34 | #define ABX8XX_REG_CFG_KEY 0x1f | 52 | #define ABX8XX_REG_CFG_KEY 0x1f |
35 | #define ABX8XX_CFG_KEY_MISC 0x9d | 53 | #define ABX8XX_CFG_KEY_MISC 0x9d |
36 | 54 | ||
@@ -63,8 +81,6 @@ static struct abx80x_cap abx80x_caps[] = { | |||
63 | [ABX80X] = {.pn = 0} | 81 | [ABX80X] = {.pn = 0} |
64 | }; | 82 | }; |
65 | 83 | ||
66 | static struct i2c_driver abx80x_driver; | ||
67 | |||
68 | static int abx80x_enable_trickle_charger(struct i2c_client *client, | 84 | static int abx80x_enable_trickle_charger(struct i2c_client *client, |
69 | u8 trickle_cfg) | 85 | u8 trickle_cfg) |
70 | { | 86 | { |
@@ -148,9 +164,111 @@ static int abx80x_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
148 | return 0; | 164 | return 0; |
149 | } | 165 | } |
150 | 166 | ||
167 | static irqreturn_t abx80x_handle_irq(int irq, void *dev_id) | ||
168 | { | ||
169 | struct i2c_client *client = dev_id; | ||
170 | struct rtc_device *rtc = i2c_get_clientdata(client); | ||
171 | int status; | ||
172 | |||
173 | status = i2c_smbus_read_byte_data(client, ABX8XX_REG_STATUS); | ||
174 | if (status < 0) | ||
175 | return IRQ_NONE; | ||
176 | |||
177 | if (status & ABX8XX_STATUS_AF) | ||
178 | rtc_update_irq(rtc, 1, RTC_AF | RTC_IRQF); | ||
179 | |||
180 | i2c_smbus_write_byte_data(client, ABX8XX_REG_STATUS, 0); | ||
181 | |||
182 | return IRQ_HANDLED; | ||
183 | } | ||
184 | |||
185 | static int abx80x_read_alarm(struct device *dev, struct rtc_wkalrm *t) | ||
186 | { | ||
187 | struct i2c_client *client = to_i2c_client(dev); | ||
188 | unsigned char buf[7]; | ||
189 | |||
190 | int irq_mask, err; | ||
191 | |||
192 | if (client->irq <= 0) | ||
193 | return -EINVAL; | ||
194 | |||
195 | err = i2c_smbus_read_i2c_block_data(client, ABX8XX_REG_ASC, | ||
196 | sizeof(buf), buf); | ||
197 | if (err) | ||
198 | return err; | ||
199 | |||
200 | irq_mask = i2c_smbus_read_byte_data(client, ABX8XX_REG_IRQ); | ||
201 | if (irq_mask < 0) | ||
202 | return irq_mask; | ||
203 | |||
204 | t->time.tm_sec = bcd2bin(buf[0] & 0x7F); | ||
205 | t->time.tm_min = bcd2bin(buf[1] & 0x7F); | ||
206 | t->time.tm_hour = bcd2bin(buf[2] & 0x3F); | ||
207 | t->time.tm_mday = bcd2bin(buf[3] & 0x3F); | ||
208 | t->time.tm_mon = bcd2bin(buf[4] & 0x1F) - 1; | ||
209 | t->time.tm_wday = buf[5] & 0x7; | ||
210 | |||
211 | t->enabled = !!(irq_mask & ABX8XX_IRQ_AIE); | ||
212 | t->pending = (buf[6] & ABX8XX_STATUS_AF) && t->enabled; | ||
213 | |||
214 | return err; | ||
215 | } | ||
216 | |||
217 | static int abx80x_set_alarm(struct device *dev, struct rtc_wkalrm *t) | ||
218 | { | ||
219 | struct i2c_client *client = to_i2c_client(dev); | ||
220 | u8 alarm[6]; | ||
221 | int err; | ||
222 | |||
223 | if (client->irq <= 0) | ||
224 | return -EINVAL; | ||
225 | |||
226 | alarm[0] = 0x0; | ||
227 | alarm[1] = bin2bcd(t->time.tm_sec); | ||
228 | alarm[2] = bin2bcd(t->time.tm_min); | ||
229 | alarm[3] = bin2bcd(t->time.tm_hour); | ||
230 | alarm[4] = bin2bcd(t->time.tm_mday); | ||
231 | alarm[5] = bin2bcd(t->time.tm_mon + 1); | ||
232 | |||
233 | err = i2c_smbus_write_i2c_block_data(client, ABX8XX_REG_AHTH, | ||
234 | sizeof(alarm), alarm); | ||
235 | if (err < 0) { | ||
236 | dev_err(&client->dev, "Unable to write alarm registers\n"); | ||
237 | return -EIO; | ||
238 | } | ||
239 | |||
240 | if (t->enabled) { | ||
241 | err = i2c_smbus_write_byte_data(client, ABX8XX_REG_IRQ, | ||
242 | (ABX8XX_IRQ_IM_1_4 | | ||
243 | ABX8XX_IRQ_AIE)); | ||
244 | if (err) | ||
245 | return err; | ||
246 | } | ||
247 | |||
248 | return 0; | ||
249 | } | ||
250 | |||
251 | static int abx80x_alarm_irq_enable(struct device *dev, unsigned int enabled) | ||
252 | { | ||
253 | struct i2c_client *client = to_i2c_client(dev); | ||
254 | int err; | ||
255 | |||
256 | if (enabled) | ||
257 | err = i2c_smbus_write_byte_data(client, ABX8XX_REG_IRQ, | ||
258 | (ABX8XX_IRQ_IM_1_4 | | ||
259 | ABX8XX_IRQ_AIE)); | ||
260 | else | ||
261 | err = i2c_smbus_write_byte_data(client, ABX8XX_REG_IRQ, | ||
262 | ABX8XX_IRQ_IM_1_4); | ||
263 | return err; | ||
264 | } | ||
265 | |||
151 | static const struct rtc_class_ops abx80x_rtc_ops = { | 266 | static const struct rtc_class_ops abx80x_rtc_ops = { |
152 | .read_time = abx80x_rtc_read_time, | 267 | .read_time = abx80x_rtc_read_time, |
153 | .set_time = abx80x_rtc_set_time, | 268 | .set_time = abx80x_rtc_set_time, |
269 | .read_alarm = abx80x_read_alarm, | ||
270 | .set_alarm = abx80x_set_alarm, | ||
271 | .alarm_irq_enable = abx80x_alarm_irq_enable, | ||
154 | }; | 272 | }; |
155 | 273 | ||
156 | static int abx80x_dt_trickle_cfg(struct device_node *np) | 274 | static int abx80x_dt_trickle_cfg(struct device_node *np) |
@@ -225,7 +343,8 @@ static int abx80x_probe(struct i2c_client *client, | |||
225 | } | 343 | } |
226 | 344 | ||
227 | err = i2c_smbus_write_byte_data(client, ABX8XX_REG_CTRL1, | 345 | err = i2c_smbus_write_byte_data(client, ABX8XX_REG_CTRL1, |
228 | ((data & ~ABX8XX_CTRL_12_24) | | 346 | ((data & ~(ABX8XX_CTRL_12_24 | |
347 | ABX8XX_CTRL_ARST)) | | ||
229 | ABX8XX_CTRL_WRITE)); | 348 | ABX8XX_CTRL_WRITE)); |
230 | if (err < 0) { | 349 | if (err < 0) { |
231 | dev_err(&client->dev, "Unable to write control register\n"); | 350 | dev_err(&client->dev, "Unable to write control register\n"); |
@@ -260,7 +379,12 @@ static int abx80x_probe(struct i2c_client *client, | |||
260 | abx80x_enable_trickle_charger(client, trickle_cfg); | 379 | abx80x_enable_trickle_charger(client, trickle_cfg); |
261 | } | 380 | } |
262 | 381 | ||
263 | rtc = devm_rtc_device_register(&client->dev, abx80x_driver.driver.name, | 382 | err = i2c_smbus_write_byte_data(client, ABX8XX_REG_CD_TIMER_CTL, |
383 | BIT(2)); | ||
384 | if (err) | ||
385 | return err; | ||
386 | |||
387 | rtc = devm_rtc_device_register(&client->dev, "abx8xx", | ||
264 | &abx80x_rtc_ops, THIS_MODULE); | 388 | &abx80x_rtc_ops, THIS_MODULE); |
265 | 389 | ||
266 | if (IS_ERR(rtc)) | 390 | if (IS_ERR(rtc)) |
@@ -268,6 +392,19 @@ static int abx80x_probe(struct i2c_client *client, | |||
268 | 392 | ||
269 | i2c_set_clientdata(client, rtc); | 393 | i2c_set_clientdata(client, rtc); |
270 | 394 | ||
395 | if (client->irq > 0) { | ||
396 | dev_info(&client->dev, "IRQ %d supplied\n", client->irq); | ||
397 | err = devm_request_threaded_irq(&client->dev, client->irq, NULL, | ||
398 | abx80x_handle_irq, | ||
399 | IRQF_SHARED | IRQF_ONESHOT, | ||
400 | "abx8xx", | ||
401 | client); | ||
402 | if (err) { | ||
403 | dev_err(&client->dev, "unable to request IRQ, alarms disabled\n"); | ||
404 | client->irq = 0; | ||
405 | } | ||
406 | } | ||
407 | |||
271 | return 0; | 408 | return 0; |
272 | } | 409 | } |
273 | 410 | ||
@@ -286,6 +423,7 @@ static const struct i2c_device_id abx80x_id[] = { | |||
286 | { "ab1803", AB1803 }, | 423 | { "ab1803", AB1803 }, |
287 | { "ab1804", AB1804 }, | 424 | { "ab1804", AB1804 }, |
288 | { "ab1805", AB1805 }, | 425 | { "ab1805", AB1805 }, |
426 | { "rv1805", AB1805 }, | ||
289 | { } | 427 | { } |
290 | }; | 428 | }; |
291 | MODULE_DEVICE_TABLE(i2c, abx80x_id); | 429 | MODULE_DEVICE_TABLE(i2c, abx80x_id); |
diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index 8f7034ba7d9e..84fb541038be 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c | |||
@@ -725,7 +725,7 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq) | |||
725 | rtc_cmos_int_handler = cmos_interrupt; | 725 | rtc_cmos_int_handler = cmos_interrupt; |
726 | 726 | ||
727 | retval = request_irq(rtc_irq, rtc_cmos_int_handler, | 727 | retval = request_irq(rtc_irq, rtc_cmos_int_handler, |
728 | 0, dev_name(&cmos_rtc.rtc->dev), | 728 | IRQF_SHARED, dev_name(&cmos_rtc.rtc->dev), |
729 | cmos_rtc.rtc); | 729 | cmos_rtc.rtc); |
730 | if (retval < 0) { | 730 | if (retval < 0) { |
731 | dev_dbg(dev, "IRQ %d is already in use\n", rtc_irq); | 731 | dev_dbg(dev, "IRQ %d is already in use\n", rtc_irq); |
diff --git a/drivers/rtc/rtc-da9063.c b/drivers/rtc/rtc-da9063.c index d6c853bbfa9f..f85cae240f12 100644 --- a/drivers/rtc/rtc-da9063.c +++ b/drivers/rtc/rtc-da9063.c | |||
@@ -191,24 +191,13 @@ static void da9063_tm_to_data(struct rtc_time *tm, u8 *data, | |||
191 | { | 191 | { |
192 | const struct da9063_compatible_rtc_regmap *config = rtc->config; | 192 | const struct da9063_compatible_rtc_regmap *config = rtc->config; |
193 | 193 | ||
194 | data[RTC_SEC] &= ~config->rtc_count_sec_mask; | 194 | data[RTC_SEC] = tm->tm_sec & config->rtc_count_sec_mask; |
195 | data[RTC_SEC] |= tm->tm_sec & config->rtc_count_sec_mask; | 195 | data[RTC_MIN] = tm->tm_min & config->rtc_count_min_mask; |
196 | 196 | data[RTC_HOUR] = tm->tm_hour & config->rtc_count_hour_mask; | |
197 | data[RTC_MIN] &= ~config->rtc_count_min_mask; | 197 | data[RTC_DAY] = tm->tm_mday & config->rtc_count_day_mask; |
198 | data[RTC_MIN] |= tm->tm_min & config->rtc_count_min_mask; | 198 | data[RTC_MONTH] = MONTHS_TO_DA9063(tm->tm_mon) & |
199 | |||
200 | data[RTC_HOUR] &= ~config->rtc_count_hour_mask; | ||
201 | data[RTC_HOUR] |= tm->tm_hour & config->rtc_count_hour_mask; | ||
202 | |||
203 | data[RTC_DAY] &= ~config->rtc_count_day_mask; | ||
204 | data[RTC_DAY] |= tm->tm_mday & config->rtc_count_day_mask; | ||
205 | |||
206 | data[RTC_MONTH] &= ~config->rtc_count_month_mask; | ||
207 | data[RTC_MONTH] |= MONTHS_TO_DA9063(tm->tm_mon) & | ||
208 | config->rtc_count_month_mask; | 199 | config->rtc_count_month_mask; |
209 | 200 | data[RTC_YEAR] = YEARS_TO_DA9063(tm->tm_year) & | |
210 | data[RTC_YEAR] &= ~config->rtc_count_year_mask; | ||
211 | data[RTC_YEAR] |= YEARS_TO_DA9063(tm->tm_year) & | ||
212 | config->rtc_count_year_mask; | 201 | config->rtc_count_year_mask; |
213 | } | 202 | } |
214 | 203 | ||
diff --git a/drivers/rtc/rtc-ds1305.c b/drivers/rtc/rtc-ds1305.c index 85706a9f82c9..f39691eea736 100644 --- a/drivers/rtc/rtc-ds1305.c +++ b/drivers/rtc/rtc-ds1305.c | |||
@@ -186,9 +186,7 @@ static int ds1305_get_time(struct device *dev, struct rtc_time *time) | |||
186 | if (status < 0) | 186 | if (status < 0) |
187 | return status; | 187 | return status; |
188 | 188 | ||
189 | dev_vdbg(dev, "%s: %02x %02x %02x, %02x %02x %02x %02x\n", | 189 | dev_vdbg(dev, "%s: %3ph, %4ph\n", "read", &buf[0], &buf[3]); |
190 | "read", buf[0], buf[1], buf[2], buf[3], | ||
191 | buf[4], buf[5], buf[6]); | ||
192 | 190 | ||
193 | /* Decode the registers */ | 191 | /* Decode the registers */ |
194 | time->tm_sec = bcd2bin(buf[DS1305_SEC]); | 192 | time->tm_sec = bcd2bin(buf[DS1305_SEC]); |
@@ -232,9 +230,7 @@ static int ds1305_set_time(struct device *dev, struct rtc_time *time) | |||
232 | *bp++ = bin2bcd(time->tm_mon + 1); | 230 | *bp++ = bin2bcd(time->tm_mon + 1); |
233 | *bp++ = bin2bcd(time->tm_year - 100); | 231 | *bp++ = bin2bcd(time->tm_year - 100); |
234 | 232 | ||
235 | dev_dbg(dev, "%s: %02x %02x %02x, %02x %02x %02x %02x\n", | 233 | dev_dbg(dev, "%s: %3ph, %4ph\n", "write", &buf[1], &buf[4]); |
236 | "write", buf[1], buf[2], buf[3], | ||
237 | buf[4], buf[5], buf[6], buf[7]); | ||
238 | 234 | ||
239 | /* use write-then-read since dma from stack is nonportable */ | 235 | /* use write-then-read since dma from stack is nonportable */ |
240 | return spi_write_then_read(ds1305->spi, buf, sizeof(buf), | 236 | return spi_write_then_read(ds1305->spi, buf, sizeof(buf), |
diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c index aa705bb4748c..cf685f67b391 100644 --- a/drivers/rtc/rtc-ds1307.c +++ b/drivers/rtc/rtc-ds1307.c | |||
@@ -460,13 +460,8 @@ static int ds1337_read_alarm(struct device *dev, struct rtc_wkalrm *t) | |||
460 | return -EIO; | 460 | return -EIO; |
461 | } | 461 | } |
462 | 462 | ||
463 | dev_dbg(dev, "%s: %02x %02x %02x %02x, %02x %02x %02x, %02x %02x\n", | 463 | dev_dbg(dev, "%s: %4ph, %3ph, %2ph\n", "alarm read", |
464 | "alarm read", | 464 | &ds1307->regs[0], &ds1307->regs[4], &ds1307->regs[7]); |
465 | ds1307->regs[0], ds1307->regs[1], | ||
466 | ds1307->regs[2], ds1307->regs[3], | ||
467 | ds1307->regs[4], ds1307->regs[5], | ||
468 | ds1307->regs[6], ds1307->regs[7], | ||
469 | ds1307->regs[8]); | ||
470 | 465 | ||
471 | /* | 466 | /* |
472 | * report alarm time (ALARM1); assume 24 hour and day-of-month modes, | 467 | * report alarm time (ALARM1); assume 24 hour and day-of-month modes, |
@@ -522,12 +517,8 @@ static int ds1337_set_alarm(struct device *dev, struct rtc_wkalrm *t) | |||
522 | control = ds1307->regs[7]; | 517 | control = ds1307->regs[7]; |
523 | status = ds1307->regs[8]; | 518 | status = ds1307->regs[8]; |
524 | 519 | ||
525 | dev_dbg(dev, "%s: %02x %02x %02x %02x, %02x %02x %02x, %02x %02x\n", | 520 | dev_dbg(dev, "%s: %4ph, %3ph, %02x %02x\n", "alarm set (old status)", |
526 | "alarm set (old status)", | 521 | &ds1307->regs[0], &ds1307->regs[4], control, status); |
527 | ds1307->regs[0], ds1307->regs[1], | ||
528 | ds1307->regs[2], ds1307->regs[3], | ||
529 | ds1307->regs[4], ds1307->regs[5], | ||
530 | ds1307->regs[6], control, status); | ||
531 | 522 | ||
532 | /* set ALARM1, using 24 hour and day-of-month modes */ | 523 | /* set ALARM1, using 24 hour and day-of-month modes */ |
533 | buf[0] = bin2bcd(t->time.tm_sec); | 524 | buf[0] = bin2bcd(t->time.tm_sec); |
diff --git a/drivers/rtc/rtc-ds1685.c b/drivers/rtc/rtc-ds1685.c index 05a51ef52703..535050fc5e9f 100644 --- a/drivers/rtc/rtc-ds1685.c +++ b/drivers/rtc/rtc-ds1685.c | |||
@@ -853,7 +853,7 @@ ds1685_rtc_proc(struct device *dev, struct seq_file *seq) | |||
853 | "Periodic Rate\t: %s\n" | 853 | "Periodic Rate\t: %s\n" |
854 | "SQW Freq\t: %s\n" | 854 | "SQW Freq\t: %s\n" |
855 | #ifdef CONFIG_RTC_DS1685_PROC_REGS | 855 | #ifdef CONFIG_RTC_DS1685_PROC_REGS |
856 | "Serial #\t: %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n" | 856 | "Serial #\t: %8phC\n" |
857 | "Register Status\t:\n" | 857 | "Register Status\t:\n" |
858 | " Ctrl A\t: UIP DV2 DV1 DV0 RS3 RS2 RS1 RS0\n" | 858 | " Ctrl A\t: UIP DV2 DV1 DV0 RS3 RS2 RS1 RS0\n" |
859 | "\t\t: %s\n" | 859 | "\t\t: %s\n" |
@@ -872,7 +872,7 @@ ds1685_rtc_proc(struct device *dev, struct seq_file *seq) | |||
872 | " Ctrl 4B\t: ABE E32k CS RCE PRS RIE WIE KSE\n" | 872 | " Ctrl 4B\t: ABE E32k CS RCE PRS RIE WIE KSE\n" |
873 | "\t\t: %s\n", | 873 | "\t\t: %s\n", |
874 | #else | 874 | #else |
875 | "Serial #\t: %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n", | 875 | "Serial #\t: %8phC\n", |
876 | #endif | 876 | #endif |
877 | model, | 877 | model, |
878 | ((ctrla & RTC_CTRL_A_DV1) ? "enabled" : "disabled"), | 878 | ((ctrla & RTC_CTRL_A_DV1) ? "enabled" : "disabled"), |
@@ -888,7 +888,7 @@ ds1685_rtc_proc(struct device *dev, struct seq_file *seq) | |||
888 | (!((ctrl4b & RTC_CTRL_4B_E32K)) ? | 888 | (!((ctrl4b & RTC_CTRL_4B_E32K)) ? |
889 | ds1685_rtc_sqw_freq[(ctrla & RTC_CTRL_A_RS_MASK)] : "32768Hz"), | 889 | ds1685_rtc_sqw_freq[(ctrla & RTC_CTRL_A_RS_MASK)] : "32768Hz"), |
890 | #ifdef CONFIG_RTC_DS1685_PROC_REGS | 890 | #ifdef CONFIG_RTC_DS1685_PROC_REGS |
891 | ssn[0], ssn[1], ssn[2], ssn[3], ssn[4], ssn[5], ssn[6], ssn[7], | 891 | ssn, |
892 | ds1685_rtc_print_regs(ctrla, bits[0]), | 892 | ds1685_rtc_print_regs(ctrla, bits[0]), |
893 | ds1685_rtc_print_regs(ctrlb, bits[1]), | 893 | ds1685_rtc_print_regs(ctrlb, bits[1]), |
894 | ds1685_rtc_print_regs(ctrlc, bits[2]), | 894 | ds1685_rtc_print_regs(ctrlc, bits[2]), |
@@ -896,7 +896,7 @@ ds1685_rtc_proc(struct device *dev, struct seq_file *seq) | |||
896 | ds1685_rtc_print_regs(ctrl4a, bits[4]), | 896 | ds1685_rtc_print_regs(ctrl4a, bits[4]), |
897 | ds1685_rtc_print_regs(ctrl4b, bits[5])); | 897 | ds1685_rtc_print_regs(ctrl4b, bits[5])); |
898 | #else | 898 | #else |
899 | ssn[0], ssn[1], ssn[2], ssn[3], ssn[4], ssn[5], ssn[6], ssn[7]); | 899 | ssn); |
900 | #endif | 900 | #endif |
901 | return 0; | 901 | return 0; |
902 | } | 902 | } |
@@ -1114,7 +1114,7 @@ ds1685_rtc_sysfs_battery_show(struct device *dev, | |||
1114 | 1114 | ||
1115 | ctrld = rtc->read(rtc, RTC_CTRL_D); | 1115 | ctrld = rtc->read(rtc, RTC_CTRL_D); |
1116 | 1116 | ||
1117 | return snprintf(buf, 13, "%s\n", | 1117 | return sprintf(buf, "%s\n", |
1118 | (ctrld & RTC_CTRL_D_VRT) ? "ok" : "not ok or N/A"); | 1118 | (ctrld & RTC_CTRL_D_VRT) ? "ok" : "not ok or N/A"); |
1119 | } | 1119 | } |
1120 | static DEVICE_ATTR(battery, S_IRUGO, ds1685_rtc_sysfs_battery_show, NULL); | 1120 | static DEVICE_ATTR(battery, S_IRUGO, ds1685_rtc_sysfs_battery_show, NULL); |
@@ -1137,7 +1137,7 @@ ds1685_rtc_sysfs_auxbatt_show(struct device *dev, | |||
1137 | ctrl4a = rtc->read(rtc, RTC_EXT_CTRL_4A); | 1137 | ctrl4a = rtc->read(rtc, RTC_EXT_CTRL_4A); |
1138 | ds1685_rtc_switch_to_bank0(rtc); | 1138 | ds1685_rtc_switch_to_bank0(rtc); |
1139 | 1139 | ||
1140 | return snprintf(buf, 13, "%s\n", | 1140 | return sprintf(buf, "%s\n", |
1141 | (ctrl4a & RTC_CTRL_4A_VRT2) ? "ok" : "not ok or N/A"); | 1141 | (ctrl4a & RTC_CTRL_4A_VRT2) ? "ok" : "not ok or N/A"); |
1142 | } | 1142 | } |
1143 | static DEVICE_ATTR(auxbatt, S_IRUGO, ds1685_rtc_sysfs_auxbatt_show, NULL); | 1143 | static DEVICE_ATTR(auxbatt, S_IRUGO, ds1685_rtc_sysfs_auxbatt_show, NULL); |
@@ -1160,11 +1160,7 @@ ds1685_rtc_sysfs_serial_show(struct device *dev, | |||
1160 | ds1685_rtc_get_ssn(rtc, ssn); | 1160 | ds1685_rtc_get_ssn(rtc, ssn); |
1161 | ds1685_rtc_switch_to_bank0(rtc); | 1161 | ds1685_rtc_switch_to_bank0(rtc); |
1162 | 1162 | ||
1163 | return snprintf(buf, 24, "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n", | 1163 | return sprintf(buf, "%8phC\n", ssn); |
1164 | ssn[0], ssn[1], ssn[2], ssn[3], ssn[4], ssn[5], | ||
1165 | ssn[6], ssn[7]); | ||
1166 | |||
1167 | return 0; | ||
1168 | } | 1164 | } |
1169 | static DEVICE_ATTR(serial, S_IRUGO, ds1685_rtc_sysfs_serial_show, NULL); | 1165 | static DEVICE_ATTR(serial, S_IRUGO, ds1685_rtc_sysfs_serial_show, NULL); |
1170 | 1166 | ||
@@ -1287,7 +1283,7 @@ ds1685_rtc_sysfs_ctrl_regs_show(struct device *dev, | |||
1287 | tmp = rtc->read(rtc, reg_info->reg) & reg_info->bit; | 1283 | tmp = rtc->read(rtc, reg_info->reg) & reg_info->bit; |
1288 | ds1685_rtc_switch_to_bank0(rtc); | 1284 | ds1685_rtc_switch_to_bank0(rtc); |
1289 | 1285 | ||
1290 | return snprintf(buf, 2, "%d\n", (tmp ? 1 : 0)); | 1286 | return sprintf(buf, "%d\n", (tmp ? 1 : 0)); |
1291 | } | 1287 | } |
1292 | 1288 | ||
1293 | /** | 1289 | /** |
@@ -1623,7 +1619,7 @@ ds1685_rtc_sysfs_time_regs_show(struct device *dev, | |||
1623 | tmp = ds1685_rtc_bcd2bin(rtc, tmp, bcd_reg_info->mask, | 1619 | tmp = ds1685_rtc_bcd2bin(rtc, tmp, bcd_reg_info->mask, |
1624 | bin_reg_info->mask); | 1620 | bin_reg_info->mask); |
1625 | 1621 | ||
1626 | return snprintf(buf, 4, "%d\n", tmp); | 1622 | return sprintf(buf, "%d\n", tmp); |
1627 | } | 1623 | } |
1628 | 1624 | ||
1629 | /** | 1625 | /** |
diff --git a/drivers/rtc/rtc-ds2404.c b/drivers/rtc/rtc-ds2404.c index 7885edd3d507..16310fe79d76 100644 --- a/drivers/rtc/rtc-ds2404.c +++ b/drivers/rtc/rtc-ds2404.c | |||
@@ -48,7 +48,7 @@ struct ds2404_gpio { | |||
48 | 48 | ||
49 | struct ds2404 { | 49 | struct ds2404 { |
50 | struct ds2404_gpio *gpio; | 50 | struct ds2404_gpio *gpio; |
51 | struct ds2404_chip_ops *ops; | 51 | const struct ds2404_chip_ops *ops; |
52 | struct rtc_device *rtc; | 52 | struct rtc_device *rtc; |
53 | }; | 53 | }; |
54 | 54 | ||
@@ -95,7 +95,7 @@ static void ds2404_gpio_unmap(struct ds2404 *chip) | |||
95 | gpio_free(ds2404_gpio[i].gpio); | 95 | gpio_free(ds2404_gpio[i].gpio); |
96 | } | 96 | } |
97 | 97 | ||
98 | static struct ds2404_chip_ops ds2404_gpio_ops = { | 98 | static const struct ds2404_chip_ops ds2404_gpio_ops = { |
99 | .map_io = ds2404_gpio_map, | 99 | .map_io = ds2404_gpio_map, |
100 | .unmap_io = ds2404_gpio_unmap, | 100 | .unmap_io = ds2404_gpio_unmap, |
101 | }; | 101 | }; |
diff --git a/drivers/rtc/rtc-efi.c b/drivers/rtc/rtc-efi.c index 3806961b4348..96d38609d803 100644 --- a/drivers/rtc/rtc-efi.c +++ b/drivers/rtc/rtc-efi.c | |||
@@ -191,11 +191,69 @@ static int efi_set_time(struct device *dev, struct rtc_time *tm) | |||
191 | return status == EFI_SUCCESS ? 0 : -EINVAL; | 191 | return status == EFI_SUCCESS ? 0 : -EINVAL; |
192 | } | 192 | } |
193 | 193 | ||
194 | static int efi_procfs(struct device *dev, struct seq_file *seq) | ||
195 | { | ||
196 | efi_time_t eft, alm; | ||
197 | efi_time_cap_t cap; | ||
198 | efi_bool_t enabled, pending; | ||
199 | |||
200 | memset(&eft, 0, sizeof(eft)); | ||
201 | memset(&alm, 0, sizeof(alm)); | ||
202 | memset(&cap, 0, sizeof(cap)); | ||
203 | |||
204 | efi.get_time(&eft, &cap); | ||
205 | efi.get_wakeup_time(&enabled, &pending, &alm); | ||
206 | |||
207 | seq_printf(seq, | ||
208 | "Time\t\t: %u:%u:%u.%09u\n" | ||
209 | "Date\t\t: %u-%u-%u\n" | ||
210 | "Daylight\t: %u\n", | ||
211 | eft.hour, eft.minute, eft.second, eft.nanosecond, | ||
212 | eft.year, eft.month, eft.day, | ||
213 | eft.daylight); | ||
214 | |||
215 | if (eft.timezone == EFI_UNSPECIFIED_TIMEZONE) | ||
216 | seq_puts(seq, "Timezone\t: unspecified\n"); | ||
217 | else | ||
218 | /* XXX fixme: convert to string? */ | ||
219 | seq_printf(seq, "Timezone\t: %u\n", eft.timezone); | ||
220 | |||
221 | seq_printf(seq, | ||
222 | "Alarm Time\t: %u:%u:%u.%09u\n" | ||
223 | "Alarm Date\t: %u-%u-%u\n" | ||
224 | "Alarm Daylight\t: %u\n" | ||
225 | "Enabled\t\t: %s\n" | ||
226 | "Pending\t\t: %s\n", | ||
227 | alm.hour, alm.minute, alm.second, alm.nanosecond, | ||
228 | alm.year, alm.month, alm.day, | ||
229 | alm.daylight, | ||
230 | enabled == 1 ? "yes" : "no", | ||
231 | pending == 1 ? "yes" : "no"); | ||
232 | |||
233 | if (eft.timezone == EFI_UNSPECIFIED_TIMEZONE) | ||
234 | seq_puts(seq, "Timezone\t: unspecified\n"); | ||
235 | else | ||
236 | /* XXX fixme: convert to string? */ | ||
237 | seq_printf(seq, "Timezone\t: %u\n", alm.timezone); | ||
238 | |||
239 | /* | ||
240 | * now prints the capabilities | ||
241 | */ | ||
242 | seq_printf(seq, | ||
243 | "Resolution\t: %u\n" | ||
244 | "Accuracy\t: %u\n" | ||
245 | "SetstoZero\t: %u\n", | ||
246 | cap.resolution, cap.accuracy, cap.sets_to_zero); | ||
247 | |||
248 | return 0; | ||
249 | } | ||
250 | |||
194 | static const struct rtc_class_ops efi_rtc_ops = { | 251 | static const struct rtc_class_ops efi_rtc_ops = { |
195 | .read_time = efi_read_time, | 252 | .read_time = efi_read_time, |
196 | .set_time = efi_set_time, | 253 | .set_time = efi_set_time, |
197 | .read_alarm = efi_read_alarm, | 254 | .read_alarm = efi_read_alarm, |
198 | .set_alarm = efi_set_alarm, | 255 | .set_alarm = efi_set_alarm, |
256 | .proc = efi_procfs, | ||
199 | }; | 257 | }; |
200 | 258 | ||
201 | static int __init efi_rtc_probe(struct platform_device *dev) | 259 | static int __init efi_rtc_probe(struct platform_device *dev) |
diff --git a/drivers/rtc/rtc-gemini.c b/drivers/rtc/rtc-gemini.c index e84184647d15..f46b6d46a51b 100644 --- a/drivers/rtc/rtc-gemini.c +++ b/drivers/rtc/rtc-gemini.c | |||
@@ -156,7 +156,6 @@ static int gemini_rtc_remove(struct platform_device *pdev) | |||
156 | struct gemini_rtc *rtc = platform_get_drvdata(pdev); | 156 | struct gemini_rtc *rtc = platform_get_drvdata(pdev); |
157 | 157 | ||
158 | rtc_device_unregister(rtc->rtc_dev); | 158 | rtc_device_unregister(rtc->rtc_dev); |
159 | platform_set_drvdata(pdev, NULL); | ||
160 | 159 | ||
161 | return 0; | 160 | return 0; |
162 | } | 161 | } |
diff --git a/drivers/rtc/rtc-imxdi.c b/drivers/rtc/rtc-imxdi.c index 7bffd7f0e306..8d8049bdfaf6 100644 --- a/drivers/rtc/rtc-imxdi.c +++ b/drivers/rtc/rtc-imxdi.c | |||
@@ -303,7 +303,7 @@ static int di_handle_invalid_state(struct imxdi_dev *imxdi, u32 dsr) | |||
303 | sec = readl(imxdi->ioaddr + DTCMR); | 303 | sec = readl(imxdi->ioaddr + DTCMR); |
304 | if (sec != 0) | 304 | if (sec != 0) |
305 | dev_warn(&imxdi->pdev->dev, | 305 | dev_warn(&imxdi->pdev->dev, |
306 | "The security violation has happend at %u seconds\n", | 306 | "The security violation has happened at %u seconds\n", |
307 | sec); | 307 | sec); |
308 | /* | 308 | /* |
309 | * the timer cannot be set/modified if | 309 | * the timer cannot be set/modified if |
diff --git a/drivers/rtc/rtc-lpc32xx.c b/drivers/rtc/rtc-lpc32xx.c index f923f7324788..887871c3d526 100644 --- a/drivers/rtc/rtc-lpc32xx.c +++ b/drivers/rtc/rtc-lpc32xx.c | |||
@@ -205,7 +205,7 @@ static int lpc32xx_rtc_probe(struct platform_device *pdev) | |||
205 | u32 tmp; | 205 | u32 tmp; |
206 | 206 | ||
207 | rtcirq = platform_get_irq(pdev, 0); | 207 | rtcirq = platform_get_irq(pdev, 0); |
208 | if (rtcirq < 0 || rtcirq >= NR_IRQS) { | 208 | if (rtcirq < 0) { |
209 | dev_warn(&pdev->dev, "Can't get interrupt resource\n"); | 209 | dev_warn(&pdev->dev, "Can't get interrupt resource\n"); |
210 | rtcirq = -1; | 210 | rtcirq = -1; |
211 | } | 211 | } |
diff --git a/drivers/rtc/rtc-pcf8523.c b/drivers/rtc/rtc-pcf8523.c index e7ebcc0b7e59..988566caaaa6 100644 --- a/drivers/rtc/rtc-pcf8523.c +++ b/drivers/rtc/rtc-pcf8523.c | |||
@@ -219,6 +219,17 @@ static int pcf8523_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
219 | u8 regs[8]; | 219 | u8 regs[8]; |
220 | int err; | 220 | int err; |
221 | 221 | ||
222 | /* | ||
223 | * The hardware can only store values between 0 and 99 in it's YEAR | ||
224 | * register (with 99 overflowing to 0 on increment). | ||
225 | * After 2100-02-28 we could start interpreting the year to be in the | ||
226 | * interval [2100, 2199], but there is no path to switch in a smooth way | ||
227 | * because the chip handles YEAR=0x00 (and the out-of-spec | ||
228 | * YEAR=0xa0) as a leap year, but 2100 isn't. | ||
229 | */ | ||
230 | if (tm->tm_year < 100 || tm->tm_year >= 200) | ||
231 | return -EINVAL; | ||
232 | |||
222 | err = pcf8523_stop_rtc(client); | 233 | err = pcf8523_stop_rtc(client); |
223 | if (err < 0) | 234 | if (err < 0) |
224 | return err; | 235 | return err; |
diff --git a/drivers/rtc/rtc-proc.c b/drivers/rtc/rtc-proc.c index ffa69e1c9245..31e7e23cc5be 100644 --- a/drivers/rtc/rtc-proc.c +++ b/drivers/rtc/rtc-proc.c | |||
@@ -112,19 +112,21 @@ static int rtc_proc_open(struct inode *inode, struct file *file) | |||
112 | int ret; | 112 | int ret; |
113 | struct rtc_device *rtc = PDE_DATA(inode); | 113 | struct rtc_device *rtc = PDE_DATA(inode); |
114 | 114 | ||
115 | if (!try_module_get(THIS_MODULE)) | 115 | if (!try_module_get(rtc->owner)) |
116 | return -ENODEV; | 116 | return -ENODEV; |
117 | 117 | ||
118 | ret = single_open(file, rtc_proc_show, rtc); | 118 | ret = single_open(file, rtc_proc_show, rtc); |
119 | if (ret) | 119 | if (ret) |
120 | module_put(THIS_MODULE); | 120 | module_put(rtc->owner); |
121 | return ret; | 121 | return ret; |
122 | } | 122 | } |
123 | 123 | ||
124 | static int rtc_proc_release(struct inode *inode, struct file *file) | 124 | static int rtc_proc_release(struct inode *inode, struct file *file) |
125 | { | 125 | { |
126 | int res = single_release(inode, file); | 126 | int res = single_release(inode, file); |
127 | module_put(THIS_MODULE); | 127 | struct rtc_device *rtc = PDE_DATA(inode); |
128 | |||
129 | module_put(rtc->owner); | ||
128 | return res; | 130 | return res; |
129 | } | 131 | } |
130 | 132 | ||
diff --git a/drivers/rtc/rtc-rv8803.c b/drivers/rtc/rtc-rv8803.c index e7329e21bfe3..7155c0816aa6 100644 --- a/drivers/rtc/rtc-rv8803.c +++ b/drivers/rtc/rtc-rv8803.c | |||
@@ -61,7 +61,7 @@ static irqreturn_t rv8803_handle_irq(int irq, void *dev_id) | |||
61 | struct i2c_client *client = dev_id; | 61 | struct i2c_client *client = dev_id; |
62 | struct rv8803_data *rv8803 = i2c_get_clientdata(client); | 62 | struct rv8803_data *rv8803 = i2c_get_clientdata(client); |
63 | unsigned long events = 0; | 63 | unsigned long events = 0; |
64 | u8 flags; | 64 | int flags; |
65 | 65 | ||
66 | spin_lock(&rv8803->flags_lock); | 66 | spin_lock(&rv8803->flags_lock); |
67 | 67 | ||
@@ -502,6 +502,7 @@ static int rv8803_remove(struct i2c_client *client) | |||
502 | 502 | ||
503 | static const struct i2c_device_id rv8803_id[] = { | 503 | static const struct i2c_device_id rv8803_id[] = { |
504 | { "rv8803", 0 }, | 504 | { "rv8803", 0 }, |
505 | { "rx8900", 0 }, | ||
505 | { } | 506 | { } |
506 | }; | 507 | }; |
507 | MODULE_DEVICE_TABLE(i2c, rv8803_id); | 508 | MODULE_DEVICE_TABLE(i2c, rv8803_id); |
diff --git a/drivers/rtc/rtc-rx8010.c b/drivers/rtc/rtc-rx8010.c new file mode 100644 index 000000000000..772d221ec2d9 --- /dev/null +++ b/drivers/rtc/rtc-rx8010.c | |||
@@ -0,0 +1,523 @@ | |||
1 | /* | ||
2 | * Driver for the Epson RTC module RX-8010 SJ | ||
3 | * | ||
4 | * Copyright(C) Timesys Corporation 2015 | ||
5 | * Copyright(C) General Electric Company 2015 | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | * | ||
11 | */ | ||
12 | |||
13 | #include <linux/bcd.h> | ||
14 | #include <linux/bitops.h> | ||
15 | #include <linux/i2c.h> | ||
16 | #include <linux/kernel.h> | ||
17 | #include <linux/module.h> | ||
18 | #include <linux/rtc.h> | ||
19 | |||
20 | #define RX8010_SEC 0x10 | ||
21 | #define RX8010_MIN 0x11 | ||
22 | #define RX8010_HOUR 0x12 | ||
23 | #define RX8010_WDAY 0x13 | ||
24 | #define RX8010_MDAY 0x14 | ||
25 | #define RX8010_MONTH 0x15 | ||
26 | #define RX8010_YEAR 0x16 | ||
27 | #define RX8010_YEAR 0x16 | ||
28 | #define RX8010_RESV17 0x17 | ||
29 | #define RX8010_ALMIN 0x18 | ||
30 | #define RX8010_ALHOUR 0x19 | ||
31 | #define RX8010_ALWDAY 0x1A | ||
32 | #define RX8010_TCOUNT0 0x1B | ||
33 | #define RX8010_TCOUNT1 0x1C | ||
34 | #define RX8010_EXT 0x1D | ||
35 | #define RX8010_FLAG 0x1E | ||
36 | #define RX8010_CTRL 0x1F | ||
37 | /* 0x20 to 0x2F are user registers */ | ||
38 | #define RX8010_RESV30 0x30 | ||
39 | #define RX8010_RESV31 0x32 | ||
40 | #define RX8010_IRQ 0x32 | ||
41 | |||
42 | #define RX8010_EXT_WADA BIT(3) | ||
43 | |||
44 | #define RX8010_FLAG_VLF BIT(1) | ||
45 | #define RX8010_FLAG_AF BIT(3) | ||
46 | #define RX8010_FLAG_TF BIT(4) | ||
47 | #define RX8010_FLAG_UF BIT(5) | ||
48 | |||
49 | #define RX8010_CTRL_AIE BIT(3) | ||
50 | #define RX8010_CTRL_UIE BIT(5) | ||
51 | #define RX8010_CTRL_STOP BIT(6) | ||
52 | #define RX8010_CTRL_TEST BIT(7) | ||
53 | |||
54 | #define RX8010_ALARM_AE BIT(7) | ||
55 | |||
56 | static const struct i2c_device_id rx8010_id[] = { | ||
57 | { "rx8010", 0 }, | ||
58 | { } | ||
59 | }; | ||
60 | MODULE_DEVICE_TABLE(i2c, rx8010_id); | ||
61 | |||
62 | struct rx8010_data { | ||
63 | struct i2c_client *client; | ||
64 | struct rtc_device *rtc; | ||
65 | u8 ctrlreg; | ||
66 | spinlock_t flags_lock; | ||
67 | }; | ||
68 | |||
69 | static irqreturn_t rx8010_irq_1_handler(int irq, void *dev_id) | ||
70 | { | ||
71 | struct i2c_client *client = dev_id; | ||
72 | struct rx8010_data *rx8010 = i2c_get_clientdata(client); | ||
73 | int flagreg; | ||
74 | |||
75 | spin_lock(&rx8010->flags_lock); | ||
76 | |||
77 | flagreg = i2c_smbus_read_byte_data(client, RX8010_FLAG); | ||
78 | |||
79 | if (flagreg <= 0) { | ||
80 | spin_unlock(&rx8010->flags_lock); | ||
81 | return IRQ_NONE; | ||
82 | } | ||
83 | |||
84 | if (flagreg & RX8010_FLAG_VLF) | ||
85 | dev_warn(&client->dev, "Frequency stop detected\n"); | ||
86 | |||
87 | if (flagreg & RX8010_FLAG_TF) { | ||
88 | flagreg &= ~RX8010_FLAG_TF; | ||
89 | rtc_update_irq(rx8010->rtc, 1, RTC_PF | RTC_IRQF); | ||
90 | } | ||
91 | |||
92 | if (flagreg & RX8010_FLAG_AF) { | ||
93 | flagreg &= ~RX8010_FLAG_AF; | ||
94 | rtc_update_irq(rx8010->rtc, 1, RTC_AF | RTC_IRQF); | ||
95 | } | ||
96 | |||
97 | if (flagreg & RX8010_FLAG_UF) { | ||
98 | flagreg &= ~RX8010_FLAG_UF; | ||
99 | rtc_update_irq(rx8010->rtc, 1, RTC_UF | RTC_IRQF); | ||
100 | } | ||
101 | |||
102 | i2c_smbus_write_byte_data(client, RX8010_FLAG, flagreg); | ||
103 | |||
104 | spin_unlock(&rx8010->flags_lock); | ||
105 | return IRQ_HANDLED; | ||
106 | } | ||
107 | |||
108 | static int rx8010_get_time(struct device *dev, struct rtc_time *dt) | ||
109 | { | ||
110 | struct rx8010_data *rx8010 = dev_get_drvdata(dev); | ||
111 | u8 date[7]; | ||
112 | int flagreg; | ||
113 | int err; | ||
114 | |||
115 | flagreg = i2c_smbus_read_byte_data(rx8010->client, RX8010_FLAG); | ||
116 | if (flagreg < 0) | ||
117 | return flagreg; | ||
118 | |||
119 | if (flagreg & RX8010_FLAG_VLF) { | ||
120 | dev_warn(dev, "Frequency stop detected\n"); | ||
121 | return -EINVAL; | ||
122 | } | ||
123 | |||
124 | err = i2c_smbus_read_i2c_block_data(rx8010->client, RX8010_SEC, | ||
125 | 7, date); | ||
126 | if (err != 7) | ||
127 | return err < 0 ? err : -EIO; | ||
128 | |||
129 | dt->tm_sec = bcd2bin(date[RX8010_SEC - RX8010_SEC] & 0x7f); | ||
130 | dt->tm_min = bcd2bin(date[RX8010_MIN - RX8010_SEC] & 0x7f); | ||
131 | dt->tm_hour = bcd2bin(date[RX8010_HOUR - RX8010_SEC] & 0x3f); | ||
132 | dt->tm_mday = bcd2bin(date[RX8010_MDAY - RX8010_SEC] & 0x3f); | ||
133 | dt->tm_mon = bcd2bin(date[RX8010_MONTH - RX8010_SEC] & 0x1f) - 1; | ||
134 | dt->tm_year = bcd2bin(date[RX8010_YEAR - RX8010_SEC]) + 100; | ||
135 | dt->tm_wday = ffs(date[RX8010_WDAY - RX8010_SEC] & 0x7f); | ||
136 | |||
137 | return rtc_valid_tm(dt); | ||
138 | } | ||
139 | |||
140 | static int rx8010_set_time(struct device *dev, struct rtc_time *dt) | ||
141 | { | ||
142 | struct rx8010_data *rx8010 = dev_get_drvdata(dev); | ||
143 | u8 date[7]; | ||
144 | int ctrl, flagreg; | ||
145 | int ret; | ||
146 | unsigned long irqflags; | ||
147 | |||
148 | if ((dt->tm_year < 100) || (dt->tm_year > 199)) | ||
149 | return -EINVAL; | ||
150 | |||
151 | /* set STOP bit before changing clock/calendar */ | ||
152 | ctrl = i2c_smbus_read_byte_data(rx8010->client, RX8010_CTRL); | ||
153 | if (ctrl < 0) | ||
154 | return ctrl; | ||
155 | rx8010->ctrlreg = ctrl | RX8010_CTRL_STOP; | ||
156 | ret = i2c_smbus_write_byte_data(rx8010->client, RX8010_CTRL, | ||
157 | rx8010->ctrlreg); | ||
158 | if (ret < 0) | ||
159 | return ret; | ||
160 | |||
161 | date[RX8010_SEC - RX8010_SEC] = bin2bcd(dt->tm_sec); | ||
162 | date[RX8010_MIN - RX8010_SEC] = bin2bcd(dt->tm_min); | ||
163 | date[RX8010_HOUR - RX8010_SEC] = bin2bcd(dt->tm_hour); | ||
164 | date[RX8010_MDAY - RX8010_SEC] = bin2bcd(dt->tm_mday); | ||
165 | date[RX8010_MONTH - RX8010_SEC] = bin2bcd(dt->tm_mon + 1); | ||
166 | date[RX8010_YEAR - RX8010_SEC] = bin2bcd(dt->tm_year - 100); | ||
167 | date[RX8010_WDAY - RX8010_SEC] = bin2bcd(1 << dt->tm_wday); | ||
168 | |||
169 | ret = i2c_smbus_write_i2c_block_data(rx8010->client, | ||
170 | RX8010_SEC, 7, date); | ||
171 | if (ret < 0) | ||
172 | return ret; | ||
173 | |||
174 | /* clear STOP bit after changing clock/calendar */ | ||
175 | ctrl = i2c_smbus_read_byte_data(rx8010->client, RX8010_CTRL); | ||
176 | if (ctrl < 0) | ||
177 | return ctrl; | ||
178 | rx8010->ctrlreg = ctrl & ~RX8010_CTRL_STOP; | ||
179 | ret = i2c_smbus_write_byte_data(rx8010->client, RX8010_CTRL, | ||
180 | rx8010->ctrlreg); | ||
181 | if (ret < 0) | ||
182 | return ret; | ||
183 | |||
184 | spin_lock_irqsave(&rx8010->flags_lock, irqflags); | ||
185 | |||
186 | flagreg = i2c_smbus_read_byte_data(rx8010->client, RX8010_FLAG); | ||
187 | if (flagreg < 0) { | ||
188 | spin_unlock_irqrestore(&rx8010->flags_lock, irqflags); | ||
189 | return flagreg; | ||
190 | } | ||
191 | |||
192 | if (flagreg & RX8010_FLAG_VLF) | ||
193 | ret = i2c_smbus_write_byte_data(rx8010->client, RX8010_FLAG, | ||
194 | flagreg & ~RX8010_FLAG_VLF); | ||
195 | |||
196 | spin_unlock_irqrestore(&rx8010->flags_lock, irqflags); | ||
197 | |||
198 | return 0; | ||
199 | } | ||
200 | |||
201 | static int rx8010_init_client(struct i2c_client *client) | ||
202 | { | ||
203 | struct rx8010_data *rx8010 = i2c_get_clientdata(client); | ||
204 | u8 ctrl[2]; | ||
205 | int need_clear = 0, err = 0; | ||
206 | |||
207 | /* Initialize reserved registers as specified in datasheet */ | ||
208 | err = i2c_smbus_write_byte_data(client, RX8010_RESV17, 0xD8); | ||
209 | if (err < 0) | ||
210 | return err; | ||
211 | |||
212 | err = i2c_smbus_write_byte_data(client, RX8010_RESV30, 0x00); | ||
213 | if (err < 0) | ||
214 | return err; | ||
215 | |||
216 | err = i2c_smbus_write_byte_data(client, RX8010_RESV31, 0x08); | ||
217 | if (err < 0) | ||
218 | return err; | ||
219 | |||
220 | err = i2c_smbus_write_byte_data(client, RX8010_IRQ, 0x00); | ||
221 | if (err < 0) | ||
222 | return err; | ||
223 | |||
224 | err = i2c_smbus_read_i2c_block_data(rx8010->client, RX8010_FLAG, | ||
225 | 2, ctrl); | ||
226 | if (err != 2) | ||
227 | return err < 0 ? err : -EIO; | ||
228 | |||
229 | if (ctrl[0] & RX8010_FLAG_VLF) | ||
230 | dev_warn(&client->dev, "Frequency stop was detected\n"); | ||
231 | |||
232 | if (ctrl[0] & RX8010_FLAG_AF) { | ||
233 | dev_warn(&client->dev, "Alarm was detected\n"); | ||
234 | need_clear = 1; | ||
235 | } | ||
236 | |||
237 | if (ctrl[0] & RX8010_FLAG_TF) | ||
238 | need_clear = 1; | ||
239 | |||
240 | if (ctrl[0] & RX8010_FLAG_UF) | ||
241 | need_clear = 1; | ||
242 | |||
243 | if (need_clear) { | ||
244 | ctrl[0] &= ~(RX8010_FLAG_AF | RX8010_FLAG_TF | RX8010_FLAG_UF); | ||
245 | err = i2c_smbus_write_byte_data(client, RX8010_FLAG, ctrl[0]); | ||
246 | if (err < 0) | ||
247 | return err; | ||
248 | } | ||
249 | |||
250 | rx8010->ctrlreg = (ctrl[1] & ~RX8010_CTRL_TEST); | ||
251 | |||
252 | return err; | ||
253 | } | ||
254 | |||
255 | static int rx8010_read_alarm(struct device *dev, struct rtc_wkalrm *t) | ||
256 | { | ||
257 | struct rx8010_data *rx8010 = dev_get_drvdata(dev); | ||
258 | struct i2c_client *client = rx8010->client; | ||
259 | u8 alarmvals[3]; | ||
260 | int flagreg; | ||
261 | int err; | ||
262 | |||
263 | err = i2c_smbus_read_i2c_block_data(client, RX8010_ALMIN, 3, alarmvals); | ||
264 | if (err != 3) | ||
265 | return err < 0 ? err : -EIO; | ||
266 | |||
267 | flagreg = i2c_smbus_read_byte_data(client, RX8010_FLAG); | ||
268 | if (flagreg < 0) | ||
269 | return flagreg; | ||
270 | |||
271 | t->time.tm_sec = 0; | ||
272 | t->time.tm_min = bcd2bin(alarmvals[0] & 0x7f); | ||
273 | t->time.tm_hour = bcd2bin(alarmvals[1] & 0x3f); | ||
274 | |||
275 | if (alarmvals[2] & RX8010_ALARM_AE) | ||
276 | t->time.tm_mday = -1; | ||
277 | else | ||
278 | t->time.tm_mday = bcd2bin(alarmvals[2] & 0x7f); | ||
279 | |||
280 | t->time.tm_wday = -1; | ||
281 | t->time.tm_mon = -1; | ||
282 | t->time.tm_year = -1; | ||
283 | |||
284 | t->enabled = !!(rx8010->ctrlreg & RX8010_CTRL_AIE); | ||
285 | t->pending = (flagreg & RX8010_FLAG_AF) && t->enabled; | ||
286 | |||
287 | return err; | ||
288 | } | ||
289 | |||
290 | static int rx8010_set_alarm(struct device *dev, struct rtc_wkalrm *t) | ||
291 | { | ||
292 | struct i2c_client *client = to_i2c_client(dev); | ||
293 | struct rx8010_data *rx8010 = dev_get_drvdata(dev); | ||
294 | u8 alarmvals[3]; | ||
295 | int extreg, flagreg; | ||
296 | int err; | ||
297 | unsigned long irqflags; | ||
298 | |||
299 | spin_lock_irqsave(&rx8010->flags_lock, irqflags); | ||
300 | flagreg = i2c_smbus_read_byte_data(client, RX8010_FLAG); | ||
301 | if (flagreg < 0) { | ||
302 | spin_unlock_irqrestore(&rx8010->flags_lock, irqflags); | ||
303 | return flagreg; | ||
304 | } | ||
305 | |||
306 | if (rx8010->ctrlreg & (RX8010_CTRL_AIE | RX8010_CTRL_UIE)) { | ||
307 | rx8010->ctrlreg &= ~(RX8010_CTRL_AIE | RX8010_CTRL_UIE); | ||
308 | err = i2c_smbus_write_byte_data(rx8010->client, RX8010_CTRL, | ||
309 | rx8010->ctrlreg); | ||
310 | if (err < 0) { | ||
311 | spin_unlock_irqrestore(&rx8010->flags_lock, irqflags); | ||
312 | return err; | ||
313 | } | ||
314 | } | ||
315 | |||
316 | flagreg &= ~RX8010_FLAG_AF; | ||
317 | err = i2c_smbus_write_byte_data(rx8010->client, RX8010_FLAG, flagreg); | ||
318 | spin_unlock_irqrestore(&rx8010->flags_lock, irqflags); | ||
319 | if (err < 0) | ||
320 | return err; | ||
321 | |||
322 | alarmvals[0] = bin2bcd(t->time.tm_min); | ||
323 | alarmvals[1] = bin2bcd(t->time.tm_hour); | ||
324 | alarmvals[2] = bin2bcd(t->time.tm_mday); | ||
325 | |||
326 | err = i2c_smbus_write_i2c_block_data(rx8010->client, RX8010_ALMIN, | ||
327 | 2, alarmvals); | ||
328 | if (err < 0) | ||
329 | return err; | ||
330 | |||
331 | extreg = i2c_smbus_read_byte_data(client, RX8010_EXT); | ||
332 | if (extreg < 0) | ||
333 | return extreg; | ||
334 | |||
335 | extreg |= RX8010_EXT_WADA; | ||
336 | err = i2c_smbus_write_byte_data(rx8010->client, RX8010_EXT, extreg); | ||
337 | if (err < 0) | ||
338 | return err; | ||
339 | |||
340 | if (alarmvals[2] == 0) | ||
341 | alarmvals[2] |= RX8010_ALARM_AE; | ||
342 | |||
343 | err = i2c_smbus_write_byte_data(rx8010->client, RX8010_ALWDAY, | ||
344 | alarmvals[2]); | ||
345 | if (err < 0) | ||
346 | return err; | ||
347 | |||
348 | if (t->enabled) { | ||
349 | if (rx8010->rtc->uie_rtctimer.enabled) | ||
350 | rx8010->ctrlreg |= RX8010_CTRL_UIE; | ||
351 | if (rx8010->rtc->aie_timer.enabled) | ||
352 | rx8010->ctrlreg |= | ||
353 | (RX8010_CTRL_AIE | RX8010_CTRL_UIE); | ||
354 | |||
355 | err = i2c_smbus_write_byte_data(rx8010->client, RX8010_CTRL, | ||
356 | rx8010->ctrlreg); | ||
357 | if (err < 0) | ||
358 | return err; | ||
359 | } | ||
360 | |||
361 | return 0; | ||
362 | } | ||
363 | |||
364 | static int rx8010_alarm_irq_enable(struct device *dev, | ||
365 | unsigned int enabled) | ||
366 | { | ||
367 | struct i2c_client *client = to_i2c_client(dev); | ||
368 | struct rx8010_data *rx8010 = dev_get_drvdata(dev); | ||
369 | int flagreg; | ||
370 | u8 ctrl; | ||
371 | int err; | ||
372 | |||
373 | ctrl = rx8010->ctrlreg; | ||
374 | |||
375 | if (enabled) { | ||
376 | if (rx8010->rtc->uie_rtctimer.enabled) | ||
377 | ctrl |= RX8010_CTRL_UIE; | ||
378 | if (rx8010->rtc->aie_timer.enabled) | ||
379 | ctrl |= (RX8010_CTRL_AIE | RX8010_CTRL_UIE); | ||
380 | } else { | ||
381 | if (!rx8010->rtc->uie_rtctimer.enabled) | ||
382 | ctrl &= ~RX8010_CTRL_UIE; | ||
383 | if (!rx8010->rtc->aie_timer.enabled) | ||
384 | ctrl &= ~RX8010_CTRL_AIE; | ||
385 | } | ||
386 | |||
387 | flagreg = i2c_smbus_read_byte_data(client, RX8010_FLAG); | ||
388 | if (flagreg < 0) | ||
389 | return flagreg; | ||
390 | |||
391 | flagreg &= ~RX8010_FLAG_AF; | ||
392 | err = i2c_smbus_write_byte_data(rx8010->client, RX8010_FLAG, flagreg); | ||
393 | if (err < 0) | ||
394 | return err; | ||
395 | |||
396 | if (ctrl != rx8010->ctrlreg) { | ||
397 | rx8010->ctrlreg = ctrl; | ||
398 | err = i2c_smbus_write_byte_data(rx8010->client, RX8010_CTRL, | ||
399 | rx8010->ctrlreg); | ||
400 | if (err < 0) | ||
401 | return err; | ||
402 | } | ||
403 | |||
404 | return 0; | ||
405 | } | ||
406 | |||
407 | static int rx8010_ioctl(struct device *dev, unsigned int cmd, unsigned long arg) | ||
408 | { | ||
409 | struct i2c_client *client = to_i2c_client(dev); | ||
410 | struct rx8010_data *rx8010 = dev_get_drvdata(dev); | ||
411 | int ret, tmp; | ||
412 | int flagreg; | ||
413 | unsigned long irqflags; | ||
414 | |||
415 | switch (cmd) { | ||
416 | case RTC_VL_READ: | ||
417 | flagreg = i2c_smbus_read_byte_data(rx8010->client, RX8010_FLAG); | ||
418 | if (flagreg < 0) | ||
419 | return flagreg; | ||
420 | |||
421 | tmp = !!(flagreg & RX8010_FLAG_VLF); | ||
422 | if (copy_to_user((void __user *)arg, &tmp, sizeof(int))) | ||
423 | return -EFAULT; | ||
424 | |||
425 | return 0; | ||
426 | |||
427 | case RTC_VL_CLR: | ||
428 | spin_lock_irqsave(&rx8010->flags_lock, irqflags); | ||
429 | flagreg = i2c_smbus_read_byte_data(rx8010->client, RX8010_FLAG); | ||
430 | if (flagreg < 0) { | ||
431 | spin_unlock_irqrestore(&rx8010->flags_lock, irqflags); | ||
432 | return flagreg; | ||
433 | } | ||
434 | |||
435 | flagreg &= ~RX8010_FLAG_VLF; | ||
436 | ret = i2c_smbus_write_byte_data(client, RX8010_FLAG, flagreg); | ||
437 | spin_unlock_irqrestore(&rx8010->flags_lock, irqflags); | ||
438 | if (ret < 0) | ||
439 | return ret; | ||
440 | |||
441 | return 0; | ||
442 | |||
443 | default: | ||
444 | return -ENOIOCTLCMD; | ||
445 | } | ||
446 | } | ||
447 | |||
448 | static struct rtc_class_ops rx8010_rtc_ops = { | ||
449 | .read_time = rx8010_get_time, | ||
450 | .set_time = rx8010_set_time, | ||
451 | .ioctl = rx8010_ioctl, | ||
452 | }; | ||
453 | |||
454 | static int rx8010_probe(struct i2c_client *client, | ||
455 | const struct i2c_device_id *id) | ||
456 | { | ||
457 | struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); | ||
458 | struct rx8010_data *rx8010; | ||
459 | int err = 0; | ||
460 | |||
461 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA | ||
462 | | I2C_FUNC_SMBUS_I2C_BLOCK)) { | ||
463 | dev_err(&adapter->dev, "doesn't support required functionality\n"); | ||
464 | return -EIO; | ||
465 | } | ||
466 | |||
467 | rx8010 = devm_kzalloc(&client->dev, sizeof(struct rx8010_data), | ||
468 | GFP_KERNEL); | ||
469 | if (!rx8010) | ||
470 | return -ENOMEM; | ||
471 | |||
472 | rx8010->client = client; | ||
473 | i2c_set_clientdata(client, rx8010); | ||
474 | |||
475 | spin_lock_init(&rx8010->flags_lock); | ||
476 | |||
477 | err = rx8010_init_client(client); | ||
478 | if (err) | ||
479 | return err; | ||
480 | |||
481 | if (client->irq > 0) { | ||
482 | dev_info(&client->dev, "IRQ %d supplied\n", client->irq); | ||
483 | err = devm_request_threaded_irq(&client->dev, client->irq, NULL, | ||
484 | rx8010_irq_1_handler, | ||
485 | IRQF_TRIGGER_LOW | IRQF_ONESHOT, | ||
486 | "rx8010", client); | ||
487 | |||
488 | if (err) { | ||
489 | dev_err(&client->dev, "unable to request IRQ\n"); | ||
490 | client->irq = 0; | ||
491 | } else { | ||
492 | rx8010_rtc_ops.read_alarm = rx8010_read_alarm; | ||
493 | rx8010_rtc_ops.set_alarm = rx8010_set_alarm; | ||
494 | rx8010_rtc_ops.alarm_irq_enable = rx8010_alarm_irq_enable; | ||
495 | } | ||
496 | } | ||
497 | |||
498 | rx8010->rtc = devm_rtc_device_register(&client->dev, client->name, | ||
499 | &rx8010_rtc_ops, THIS_MODULE); | ||
500 | |||
501 | if (IS_ERR(rx8010->rtc)) { | ||
502 | dev_err(&client->dev, "unable to register the class device\n"); | ||
503 | return PTR_ERR(rx8010->rtc); | ||
504 | } | ||
505 | |||
506 | rx8010->rtc->max_user_freq = 1; | ||
507 | |||
508 | return err; | ||
509 | } | ||
510 | |||
511 | static struct i2c_driver rx8010_driver = { | ||
512 | .driver = { | ||
513 | .name = "rtc-rx8010", | ||
514 | }, | ||
515 | .probe = rx8010_probe, | ||
516 | .id_table = rx8010_id, | ||
517 | }; | ||
518 | |||
519 | module_i2c_driver(rx8010_driver); | ||
520 | |||
521 | MODULE_AUTHOR("Akshay Bhat <akshay.bhat@timesys.com>"); | ||
522 | MODULE_DESCRIPTION("Epson RX8010SJ RTC driver"); | ||
523 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c index 0d68a85dd429..7407d7394bb4 100644 --- a/drivers/rtc/rtc-s5m.c +++ b/drivers/rtc/rtc-s5m.c | |||
@@ -38,7 +38,22 @@ | |||
38 | */ | 38 | */ |
39 | #define UDR_READ_RETRY_CNT 5 | 39 | #define UDR_READ_RETRY_CNT 5 |
40 | 40 | ||
41 | /* Registers used by the driver which are different between chipsets. */ | 41 | /* |
42 | * Registers used by the driver which are different between chipsets. | ||
43 | * | ||
44 | * Operations like read time and write alarm/time require updating | ||
45 | * specific fields in UDR register. These fields usually are auto-cleared | ||
46 | * (with some exceptions). | ||
47 | * | ||
48 | * Table of operations per device: | ||
49 | * | ||
50 | * Device | Write time | Read time | Write alarm | ||
51 | * ================================================= | ||
52 | * S5M8767 | UDR + TIME | | UDR | ||
53 | * S2MPS11/14 | WUDR | RUDR | WUDR + RUDR | ||
54 | * S2MPS13 | WUDR | RUDR | WUDR + AUDR | ||
55 | * S2MPS15 | WUDR | RUDR | AUDR | ||
56 | */ | ||
42 | struct s5m_rtc_reg_config { | 57 | struct s5m_rtc_reg_config { |
43 | /* Number of registers used for setting time/alarm0/alarm1 */ | 58 | /* Number of registers used for setting time/alarm0/alarm1 */ |
44 | unsigned int regs_count; | 59 | unsigned int regs_count; |
@@ -55,9 +70,16 @@ struct s5m_rtc_reg_config { | |||
55 | * will enable update of time or alarm register. Then it will be | 70 | * will enable update of time or alarm register. Then it will be |
56 | * auto-cleared after successful update. | 71 | * auto-cleared after successful update. |
57 | */ | 72 | */ |
58 | unsigned int rtc_udr_update; | 73 | unsigned int udr_update; |
59 | /* Mask for UDR field in 'rtc_udr_update' register */ | 74 | /* Auto-cleared mask in UDR field for writing time and alarm */ |
60 | unsigned int rtc_udr_mask; | 75 | unsigned int autoclear_udr_mask; |
76 | /* | ||
77 | * Masks in UDR field for time and alarm operations. | ||
78 | * The read time mask can be 0. Rest should not. | ||
79 | */ | ||
80 | unsigned int read_time_udr_mask; | ||
81 | unsigned int write_time_udr_mask; | ||
82 | unsigned int write_alarm_udr_mask; | ||
61 | }; | 83 | }; |
62 | 84 | ||
63 | /* Register map for S5M8763 and S5M8767 */ | 85 | /* Register map for S5M8763 and S5M8767 */ |
@@ -67,22 +89,56 @@ static const struct s5m_rtc_reg_config s5m_rtc_regs = { | |||
67 | .ctrl = S5M_ALARM1_CONF, | 89 | .ctrl = S5M_ALARM1_CONF, |
68 | .alarm0 = S5M_ALARM0_SEC, | 90 | .alarm0 = S5M_ALARM0_SEC, |
69 | .alarm1 = S5M_ALARM1_SEC, | 91 | .alarm1 = S5M_ALARM1_SEC, |
70 | .rtc_udr_update = S5M_RTC_UDR_CON, | 92 | .udr_update = S5M_RTC_UDR_CON, |
71 | .rtc_udr_mask = S5M_RTC_UDR_MASK, | 93 | .autoclear_udr_mask = S5M_RTC_UDR_MASK, |
94 | .read_time_udr_mask = 0, /* Not needed */ | ||
95 | .write_time_udr_mask = S5M_RTC_UDR_MASK | S5M_RTC_TIME_EN_MASK, | ||
96 | .write_alarm_udr_mask = S5M_RTC_UDR_MASK, | ||
97 | }; | ||
98 | |||
99 | /* Register map for S2MPS13 */ | ||
100 | static const struct s5m_rtc_reg_config s2mps13_rtc_regs = { | ||
101 | .regs_count = 7, | ||
102 | .time = S2MPS_RTC_SEC, | ||
103 | .ctrl = S2MPS_RTC_CTRL, | ||
104 | .alarm0 = S2MPS_ALARM0_SEC, | ||
105 | .alarm1 = S2MPS_ALARM1_SEC, | ||
106 | .udr_update = S2MPS_RTC_UDR_CON, | ||
107 | .autoclear_udr_mask = S2MPS_RTC_WUDR_MASK, | ||
108 | .read_time_udr_mask = S2MPS_RTC_RUDR_MASK, | ||
109 | .write_time_udr_mask = S2MPS_RTC_WUDR_MASK, | ||
110 | .write_alarm_udr_mask = S2MPS_RTC_WUDR_MASK | S2MPS13_RTC_AUDR_MASK, | ||
111 | }; | ||
112 | |||
113 | /* Register map for S2MPS11/14 */ | ||
114 | static const struct s5m_rtc_reg_config s2mps14_rtc_regs = { | ||
115 | .regs_count = 7, | ||
116 | .time = S2MPS_RTC_SEC, | ||
117 | .ctrl = S2MPS_RTC_CTRL, | ||
118 | .alarm0 = S2MPS_ALARM0_SEC, | ||
119 | .alarm1 = S2MPS_ALARM1_SEC, | ||
120 | .udr_update = S2MPS_RTC_UDR_CON, | ||
121 | .autoclear_udr_mask = S2MPS_RTC_WUDR_MASK, | ||
122 | .read_time_udr_mask = S2MPS_RTC_RUDR_MASK, | ||
123 | .write_time_udr_mask = S2MPS_RTC_WUDR_MASK, | ||
124 | .write_alarm_udr_mask = S2MPS_RTC_WUDR_MASK | S2MPS_RTC_RUDR_MASK, | ||
72 | }; | 125 | }; |
73 | 126 | ||
74 | /* | 127 | /* |
75 | * Register map for S2MPS14. | 128 | * Register map for S2MPS15 - in comparison to S2MPS14 the WUDR and AUDR bits |
76 | * It may be also suitable for S2MPS11 but this was not tested. | 129 | * are swapped. |
77 | */ | 130 | */ |
78 | static const struct s5m_rtc_reg_config s2mps_rtc_regs = { | 131 | static const struct s5m_rtc_reg_config s2mps15_rtc_regs = { |
79 | .regs_count = 7, | 132 | .regs_count = 7, |
80 | .time = S2MPS_RTC_SEC, | 133 | .time = S2MPS_RTC_SEC, |
81 | .ctrl = S2MPS_RTC_CTRL, | 134 | .ctrl = S2MPS_RTC_CTRL, |
82 | .alarm0 = S2MPS_ALARM0_SEC, | 135 | .alarm0 = S2MPS_ALARM0_SEC, |
83 | .alarm1 = S2MPS_ALARM1_SEC, | 136 | .alarm1 = S2MPS_ALARM1_SEC, |
84 | .rtc_udr_update = S2MPS_RTC_UDR_CON, | 137 | .udr_update = S2MPS_RTC_UDR_CON, |
85 | .rtc_udr_mask = S2MPS_RTC_WUDR_MASK, | 138 | .autoclear_udr_mask = S2MPS_RTC_WUDR_MASK, |
139 | .read_time_udr_mask = S2MPS_RTC_RUDR_MASK, | ||
140 | .write_time_udr_mask = S2MPS15_RTC_WUDR_MASK, | ||
141 | .write_alarm_udr_mask = S2MPS15_RTC_AUDR_MASK, | ||
86 | }; | 142 | }; |
87 | 143 | ||
88 | struct s5m_rtc_info { | 144 | struct s5m_rtc_info { |
@@ -166,9 +222,8 @@ static inline int s5m8767_wait_for_udr_update(struct s5m_rtc_info *info) | |||
166 | unsigned int data; | 222 | unsigned int data; |
167 | 223 | ||
168 | do { | 224 | do { |
169 | ret = regmap_read(info->regmap, info->regs->rtc_udr_update, | 225 | ret = regmap_read(info->regmap, info->regs->udr_update, &data); |
170 | &data); | 226 | } while (--retry && (data & info->regs->autoclear_udr_mask) && !ret); |
171 | } while (--retry && (data & info->regs->rtc_udr_mask) && !ret); | ||
172 | 227 | ||
173 | if (!retry) | 228 | if (!retry) |
174 | dev_err(info->dev, "waiting for UDR update, reached max number of retries\n"); | 229 | dev_err(info->dev, "waiting for UDR update, reached max number of retries\n"); |
@@ -214,30 +269,15 @@ static inline int s5m8767_rtc_set_time_reg(struct s5m_rtc_info *info) | |||
214 | int ret; | 269 | int ret; |
215 | unsigned int data; | 270 | unsigned int data; |
216 | 271 | ||
217 | ret = regmap_read(info->regmap, info->regs->rtc_udr_update, &data); | 272 | ret = regmap_read(info->regmap, info->regs->udr_update, &data); |
218 | if (ret < 0) { | 273 | if (ret < 0) { |
219 | dev_err(info->dev, "failed to read update reg(%d)\n", ret); | 274 | dev_err(info->dev, "failed to read update reg(%d)\n", ret); |
220 | return ret; | 275 | return ret; |
221 | } | 276 | } |
222 | 277 | ||
223 | switch (info->device_type) { | 278 | data |= info->regs->write_time_udr_mask; |
224 | case S5M8763X: | ||
225 | case S5M8767X: | ||
226 | data |= info->regs->rtc_udr_mask | S5M_RTC_TIME_EN_MASK; | ||
227 | case S2MPS15X: | ||
228 | /* As per UM, for write time register, set WUDR bit to high */ | ||
229 | data |= S2MPS15_RTC_WUDR_MASK; | ||
230 | break; | ||
231 | case S2MPS14X: | ||
232 | case S2MPS13X: | ||
233 | data |= info->regs->rtc_udr_mask; | ||
234 | break; | ||
235 | default: | ||
236 | return -EINVAL; | ||
237 | } | ||
238 | 279 | ||
239 | 280 | ret = regmap_write(info->regmap, info->regs->udr_update, data); | |
240 | ret = regmap_write(info->regmap, info->regs->rtc_udr_update, data); | ||
241 | if (ret < 0) { | 281 | if (ret < 0) { |
242 | dev_err(info->dev, "failed to write update reg(%d)\n", ret); | 282 | dev_err(info->dev, "failed to write update reg(%d)\n", ret); |
243 | return ret; | 283 | return ret; |
@@ -253,35 +293,29 @@ static inline int s5m8767_rtc_set_alarm_reg(struct s5m_rtc_info *info) | |||
253 | int ret; | 293 | int ret; |
254 | unsigned int data; | 294 | unsigned int data; |
255 | 295 | ||
256 | ret = regmap_read(info->regmap, info->regs->rtc_udr_update, &data); | 296 | ret = regmap_read(info->regmap, info->regs->udr_update, &data); |
257 | if (ret < 0) { | 297 | if (ret < 0) { |
258 | dev_err(info->dev, "%s: fail to read update reg(%d)\n", | 298 | dev_err(info->dev, "%s: fail to read update reg(%d)\n", |
259 | __func__, ret); | 299 | __func__, ret); |
260 | return ret; | 300 | return ret; |
261 | } | 301 | } |
262 | 302 | ||
263 | data |= info->regs->rtc_udr_mask; | 303 | data |= info->regs->write_alarm_udr_mask; |
264 | switch (info->device_type) { | 304 | switch (info->device_type) { |
265 | case S5M8763X: | 305 | case S5M8763X: |
266 | case S5M8767X: | 306 | case S5M8767X: |
267 | data &= ~S5M_RTC_TIME_EN_MASK; | 307 | data &= ~S5M_RTC_TIME_EN_MASK; |
268 | break; | 308 | break; |
269 | case S2MPS15X: | 309 | case S2MPS15X: |
270 | /* As per UM, for write alarm, set A_UDR(bit[4]) to high | ||
271 | * rtc_udr_mask above sets bit[4] | ||
272 | */ | ||
273 | break; | ||
274 | case S2MPS14X: | 310 | case S2MPS14X: |
275 | data |= S2MPS_RTC_RUDR_MASK; | ||
276 | break; | ||
277 | case S2MPS13X: | 311 | case S2MPS13X: |
278 | data |= S2MPS13_RTC_AUDR_MASK; | 312 | /* No exceptions needed */ |
279 | break; | 313 | break; |
280 | default: | 314 | default: |
281 | return -EINVAL; | 315 | return -EINVAL; |
282 | } | 316 | } |
283 | 317 | ||
284 | ret = regmap_write(info->regmap, info->regs->rtc_udr_update, data); | 318 | ret = regmap_write(info->regmap, info->regs->udr_update, data); |
285 | if (ret < 0) { | 319 | if (ret < 0) { |
286 | dev_err(info->dev, "%s: fail to write update reg(%d)\n", | 320 | dev_err(info->dev, "%s: fail to write update reg(%d)\n", |
287 | __func__, ret); | 321 | __func__, ret); |
@@ -292,7 +326,7 @@ static inline int s5m8767_rtc_set_alarm_reg(struct s5m_rtc_info *info) | |||
292 | 326 | ||
293 | /* On S2MPS13 the AUDR is not auto-cleared */ | 327 | /* On S2MPS13 the AUDR is not auto-cleared */ |
294 | if (info->device_type == S2MPS13X) | 328 | if (info->device_type == S2MPS13X) |
295 | regmap_update_bits(info->regmap, info->regs->rtc_udr_update, | 329 | regmap_update_bits(info->regmap, info->regs->udr_update, |
296 | S2MPS13_RTC_AUDR_MASK, 0); | 330 | S2MPS13_RTC_AUDR_MASK, 0); |
297 | 331 | ||
298 | return ret; | 332 | return ret; |
@@ -336,11 +370,11 @@ static int s5m_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
336 | u8 data[info->regs->regs_count]; | 370 | u8 data[info->regs->regs_count]; |
337 | int ret; | 371 | int ret; |
338 | 372 | ||
339 | if (info->device_type == S2MPS15X || info->device_type == S2MPS14X || | 373 | if (info->regs->read_time_udr_mask) { |
340 | info->device_type == S2MPS13X) { | ||
341 | ret = regmap_update_bits(info->regmap, | 374 | ret = regmap_update_bits(info->regmap, |
342 | info->regs->rtc_udr_update, | 375 | info->regs->udr_update, |
343 | S2MPS_RTC_RUDR_MASK, S2MPS_RTC_RUDR_MASK); | 376 | info->regs->read_time_udr_mask, |
377 | info->regs->read_time_udr_mask); | ||
344 | if (ret) { | 378 | if (ret) { |
345 | dev_err(dev, | 379 | dev_err(dev, |
346 | "Failed to prepare registers for time reading: %d\n", | 380 | "Failed to prepare registers for time reading: %d\n", |
@@ -707,10 +741,18 @@ static int s5m_rtc_probe(struct platform_device *pdev) | |||
707 | 741 | ||
708 | switch (platform_get_device_id(pdev)->driver_data) { | 742 | switch (platform_get_device_id(pdev)->driver_data) { |
709 | case S2MPS15X: | 743 | case S2MPS15X: |
744 | regmap_cfg = &s2mps14_rtc_regmap_config; | ||
745 | info->regs = &s2mps15_rtc_regs; | ||
746 | alarm_irq = S2MPS14_IRQ_RTCA0; | ||
747 | break; | ||
710 | case S2MPS14X: | 748 | case S2MPS14X: |
749 | regmap_cfg = &s2mps14_rtc_regmap_config; | ||
750 | info->regs = &s2mps14_rtc_regs; | ||
751 | alarm_irq = S2MPS14_IRQ_RTCA0; | ||
752 | break; | ||
711 | case S2MPS13X: | 753 | case S2MPS13X: |
712 | regmap_cfg = &s2mps14_rtc_regmap_config; | 754 | regmap_cfg = &s2mps14_rtc_regmap_config; |
713 | info->regs = &s2mps_rtc_regs; | 755 | info->regs = &s2mps13_rtc_regs; |
714 | alarm_irq = S2MPS14_IRQ_RTCA0; | 756 | alarm_irq = S2MPS14_IRQ_RTCA0; |
715 | break; | 757 | break; |
716 | case S5M8763X: | 758 | case S5M8763X: |
diff --git a/drivers/rtc/rtc-sunxi.c b/drivers/rtc/rtc-sunxi.c index 52543ae37c98..abada609ddc7 100644 --- a/drivers/rtc/rtc-sunxi.c +++ b/drivers/rtc/rtc-sunxi.c | |||
@@ -133,7 +133,7 @@ struct sunxi_rtc_data_year { | |||
133 | unsigned char leap_shift; /* bit shift to get the leap year */ | 133 | unsigned char leap_shift; /* bit shift to get the leap year */ |
134 | }; | 134 | }; |
135 | 135 | ||
136 | static struct sunxi_rtc_data_year data_year_param[] = { | 136 | static const struct sunxi_rtc_data_year data_year_param[] = { |
137 | [0] = { | 137 | [0] = { |
138 | .min = 2010, | 138 | .min = 2010, |
139 | .max = 2073, | 139 | .max = 2073, |
@@ -151,7 +151,7 @@ static struct sunxi_rtc_data_year data_year_param[] = { | |||
151 | struct sunxi_rtc_dev { | 151 | struct sunxi_rtc_dev { |
152 | struct rtc_device *rtc; | 152 | struct rtc_device *rtc; |
153 | struct device *dev; | 153 | struct device *dev; |
154 | struct sunxi_rtc_data_year *data_year; | 154 | const struct sunxi_rtc_data_year *data_year; |
155 | void __iomem *base; | 155 | void __iomem *base; |
156 | int irq; | 156 | int irq; |
157 | }; | 157 | }; |
@@ -175,7 +175,7 @@ static irqreturn_t sunxi_rtc_alarmirq(int irq, void *id) | |||
175 | return IRQ_NONE; | 175 | return IRQ_NONE; |
176 | } | 176 | } |
177 | 177 | ||
178 | static void sunxi_rtc_setaie(int to, struct sunxi_rtc_dev *chip) | 178 | static void sunxi_rtc_setaie(unsigned int to, struct sunxi_rtc_dev *chip) |
179 | { | 179 | { |
180 | u32 alrm_val = 0; | 180 | u32 alrm_val = 0; |
181 | u32 alrm_irq_val = 0; | 181 | u32 alrm_irq_val = 0; |
@@ -343,7 +343,7 @@ static int sunxi_rtc_settime(struct device *dev, struct rtc_time *rtc_tm) | |||
343 | struct sunxi_rtc_dev *chip = dev_get_drvdata(dev); | 343 | struct sunxi_rtc_dev *chip = dev_get_drvdata(dev); |
344 | u32 date = 0; | 344 | u32 date = 0; |
345 | u32 time = 0; | 345 | u32 time = 0; |
346 | int year; | 346 | unsigned int year; |
347 | 347 | ||
348 | /* | 348 | /* |
349 | * the input rtc_tm->tm_year is the offset relative to 1900. We use | 349 | * the input rtc_tm->tm_year is the offset relative to 1900. We use |
@@ -353,8 +353,8 @@ static int sunxi_rtc_settime(struct device *dev, struct rtc_time *rtc_tm) | |||
353 | 353 | ||
354 | year = rtc_tm->tm_year + 1900; | 354 | year = rtc_tm->tm_year + 1900; |
355 | if (year < chip->data_year->min || year > chip->data_year->max) { | 355 | if (year < chip->data_year->min || year > chip->data_year->max) { |
356 | dev_err(dev, "rtc only supports year in range %d - %d\n", | 356 | dev_err(dev, "rtc only supports year in range %u - %u\n", |
357 | chip->data_year->min, chip->data_year->max); | 357 | chip->data_year->min, chip->data_year->max); |
358 | return -EINVAL; | 358 | return -EINVAL; |
359 | } | 359 | } |
360 | 360 | ||
@@ -436,7 +436,6 @@ static int sunxi_rtc_probe(struct platform_device *pdev) | |||
436 | { | 436 | { |
437 | struct sunxi_rtc_dev *chip; | 437 | struct sunxi_rtc_dev *chip; |
438 | struct resource *res; | 438 | struct resource *res; |
439 | const struct of_device_id *of_id; | ||
440 | int ret; | 439 | int ret; |
441 | 440 | ||
442 | chip = devm_kzalloc(&pdev->dev, sizeof(*chip), GFP_KERNEL); | 441 | chip = devm_kzalloc(&pdev->dev, sizeof(*chip), GFP_KERNEL); |
@@ -463,12 +462,11 @@ static int sunxi_rtc_probe(struct platform_device *pdev) | |||
463 | return ret; | 462 | return ret; |
464 | } | 463 | } |
465 | 464 | ||
466 | of_id = of_match_device(sunxi_rtc_dt_ids, &pdev->dev); | 465 | chip->data_year = of_device_get_match_data(&pdev->dev); |
467 | if (!of_id) { | 466 | if (!chip->data_year) { |
468 | dev_err(&pdev->dev, "Unable to setup RTC data\n"); | 467 | dev_err(&pdev->dev, "Unable to setup RTC data\n"); |
469 | return -ENODEV; | 468 | return -ENODEV; |
470 | } | 469 | } |
471 | chip->data_year = (struct sunxi_rtc_data_year *) of_id->data; | ||
472 | 470 | ||
473 | /* clear the alarm count value */ | 471 | /* clear the alarm count value */ |
474 | writel(0, chip->base + SUNXI_ALRM_DHMS); | 472 | writel(0, chip->base + SUNXI_ALRM_DHMS); |
diff --git a/drivers/rtc/rtc-sysfs.c b/drivers/rtc/rtc-sysfs.c index 7273855ed02e..463e286064ab 100644 --- a/drivers/rtc/rtc-sysfs.c +++ b/drivers/rtc/rtc-sysfs.c | |||
@@ -91,7 +91,12 @@ max_user_freq_store(struct device *dev, struct device_attribute *attr, | |||
91 | const char *buf, size_t n) | 91 | const char *buf, size_t n) |
92 | { | 92 | { |
93 | struct rtc_device *rtc = to_rtc_device(dev); | 93 | struct rtc_device *rtc = to_rtc_device(dev); |
94 | unsigned long val = simple_strtoul(buf, NULL, 0); | 94 | unsigned long val; |
95 | int err; | ||
96 | |||
97 | err = kstrtoul(buf, 0, &val); | ||
98 | if (err) | ||
99 | return err; | ||
95 | 100 | ||
96 | if (val >= 4096 || val == 0) | 101 | if (val >= 4096 || val == 0) |
97 | return -EINVAL; | 102 | return -EINVAL; |
@@ -175,7 +180,9 @@ wakealarm_store(struct device *dev, struct device_attribute *attr, | |||
175 | } else | 180 | } else |
176 | adjust = 1; | 181 | adjust = 1; |
177 | } | 182 | } |
178 | alarm = simple_strtoul(buf_ptr, NULL, 0); | 183 | retval = kstrtoul(buf_ptr, 0, &alarm); |
184 | if (retval) | ||
185 | return retval; | ||
179 | if (adjust) { | 186 | if (adjust) { |
180 | alarm += now; | 187 | alarm += now; |
181 | } | 188 | } |
diff --git a/drivers/rtc/rtc-v3020.c b/drivers/rtc/rtc-v3020.c index f9f97098c254..7a0436329d6c 100644 --- a/drivers/rtc/rtc-v3020.c +++ b/drivers/rtc/rtc-v3020.c | |||
@@ -57,7 +57,7 @@ struct v3020 { | |||
57 | /* GPIO access */ | 57 | /* GPIO access */ |
58 | struct gpio *gpio; | 58 | struct gpio *gpio; |
59 | 59 | ||
60 | struct v3020_chip_ops *ops; | 60 | const struct v3020_chip_ops *ops; |
61 | 61 | ||
62 | struct rtc_device *rtc; | 62 | struct rtc_device *rtc; |
63 | }; | 63 | }; |
@@ -95,7 +95,7 @@ static unsigned char v3020_mmio_read_bit(struct v3020 *chip) | |||
95 | return !!(readl(chip->ioaddress) & (1 << chip->leftshift)); | 95 | return !!(readl(chip->ioaddress) & (1 << chip->leftshift)); |
96 | } | 96 | } |
97 | 97 | ||
98 | static struct v3020_chip_ops v3020_mmio_ops = { | 98 | static const struct v3020_chip_ops v3020_mmio_ops = { |
99 | .map_io = v3020_mmio_map, | 99 | .map_io = v3020_mmio_map, |
100 | .unmap_io = v3020_mmio_unmap, | 100 | .unmap_io = v3020_mmio_unmap, |
101 | .read_bit = v3020_mmio_read_bit, | 101 | .read_bit = v3020_mmio_read_bit, |
@@ -158,7 +158,7 @@ static unsigned char v3020_gpio_read_bit(struct v3020 *chip) | |||
158 | return bit; | 158 | return bit; |
159 | } | 159 | } |
160 | 160 | ||
161 | static struct v3020_chip_ops v3020_gpio_ops = { | 161 | static const struct v3020_chip_ops v3020_gpio_ops = { |
162 | .map_io = v3020_gpio_map, | 162 | .map_io = v3020_gpio_map, |
163 | .unmap_io = v3020_gpio_unmap, | 163 | .unmap_io = v3020_gpio_unmap, |
164 | .read_bit = v3020_gpio_read_bit, | 164 | .read_bit = v3020_gpio_read_bit, |
diff --git a/include/linux/mfd/samsung/rtc.h b/include/linux/mfd/samsung/rtc.h index a65e4655d470..48c3c5be7eb1 100644 --- a/include/linux/mfd/samsung/rtc.h +++ b/include/linux/mfd/samsung/rtc.h | |||
@@ -105,6 +105,8 @@ enum s2mps_rtc_reg { | |||
105 | #define S5M_RTC_UDR_MASK (1 << S5M_RTC_UDR_SHIFT) | 105 | #define S5M_RTC_UDR_MASK (1 << S5M_RTC_UDR_SHIFT) |
106 | #define S2MPS_RTC_WUDR_SHIFT 4 | 106 | #define S2MPS_RTC_WUDR_SHIFT 4 |
107 | #define S2MPS_RTC_WUDR_MASK (1 << S2MPS_RTC_WUDR_SHIFT) | 107 | #define S2MPS_RTC_WUDR_MASK (1 << S2MPS_RTC_WUDR_SHIFT) |
108 | #define S2MPS15_RTC_AUDR_SHIFT 4 | ||
109 | #define S2MPS15_RTC_AUDR_MASK (1 << S2MPS15_RTC_AUDR_SHIFT) | ||
108 | #define S2MPS13_RTC_AUDR_SHIFT 1 | 110 | #define S2MPS13_RTC_AUDR_SHIFT 1 |
109 | #define S2MPS13_RTC_AUDR_MASK (1 << S2MPS13_RTC_AUDR_SHIFT) | 111 | #define S2MPS13_RTC_AUDR_MASK (1 << S2MPS13_RTC_AUDR_SHIFT) |
110 | #define S2MPS15_RTC_WUDR_SHIFT 1 | 112 | #define S2MPS15_RTC_WUDR_SHIFT 1 |