diff options
123 files changed, 1810 insertions, 1084 deletions
diff --git a/Documentation/ABI/testing/sysfs-class-rtc b/Documentation/ABI/testing/sysfs-class-rtc index cf60412882f0..95984289a4ee 100644 --- a/Documentation/ABI/testing/sysfs-class-rtc +++ b/Documentation/ABI/testing/sysfs-class-rtc | |||
@@ -43,6 +43,14 @@ Contact: linux-rtc@vger.kernel.org | |||
43 | Description: | 43 | Description: |
44 | (RO) The name of the RTC corresponding to this sysfs directory | 44 | (RO) The name of the RTC corresponding to this sysfs directory |
45 | 45 | ||
46 | What: /sys/class/rtc/rtcX/range | ||
47 | Date: January 2018 | ||
48 | KernelVersion: 4.16 | ||
49 | Contact: linux-rtc@vger.kernel.org | ||
50 | Description: | ||
51 | Valid time range for the RTC, as seconds from epoch, formatted | ||
52 | as [min, max] | ||
53 | |||
46 | What: /sys/class/rtc/rtcX/since_epoch | 54 | What: /sys/class/rtc/rtcX/since_epoch |
47 | Date: March 2006 | 55 | Date: March 2006 |
48 | KernelVersion: 2.6.17 | 56 | KernelVersion: 2.6.17 |
@@ -57,14 +65,6 @@ Contact: linux-rtc@vger.kernel.org | |||
57 | Description: | 65 | Description: |
58 | (RO) RTC-provided time in 24-hour notation (hh:mm:ss) | 66 | (RO) RTC-provided time in 24-hour notation (hh:mm:ss) |
59 | 67 | ||
60 | What: /sys/class/rtc/rtcX/*/nvmem | ||
61 | Date: February 2016 | ||
62 | KernelVersion: 4.6 | ||
63 | Contact: linux-rtc@vger.kernel.org | ||
64 | Description: | ||
65 | (RW) The non volatile storage exported as a raw file, as | ||
66 | described in Documentation/nvmem/nvmem.txt | ||
67 | |||
68 | What: /sys/class/rtc/rtcX/offset | 68 | What: /sys/class/rtc/rtcX/offset |
69 | Date: February 2016 | 69 | Date: February 2016 |
70 | KernelVersion: 4.6 | 70 | KernelVersion: 4.6 |
diff --git a/Documentation/devicetree/bindings/rtc/isil,isl12026.txt b/Documentation/devicetree/bindings/rtc/isil,isl12026.txt new file mode 100644 index 000000000000..2e0be45193bb --- /dev/null +++ b/Documentation/devicetree/bindings/rtc/isil,isl12026.txt | |||
@@ -0,0 +1,28 @@ | |||
1 | ISL12026 I2C RTC/EEPROM | ||
2 | |||
3 | ISL12026 is an I2C RTC/EEPROM combination device. The RTC and control | ||
4 | registers respond at bus address 0x6f, and the EEPROM array responds | ||
5 | at bus address 0x57. The canonical "reg" value will be for the RTC portion. | ||
6 | |||
7 | Required properties supported by the device: | ||
8 | |||
9 | - "compatible": must be "isil,isl12026" | ||
10 | - "reg": I2C bus address of the device (always 0x6f) | ||
11 | |||
12 | Optional properties: | ||
13 | |||
14 | - "isil,pwr-bsw": If present PWR.BSW bit must be set to the specified | ||
15 | value for proper operation. | ||
16 | |||
17 | - "isil,pwr-sbib": If present PWR.SBIB bit must be set to the specified | ||
18 | value for proper operation. | ||
19 | |||
20 | |||
21 | Example: | ||
22 | |||
23 | rtc@6f { | ||
24 | compatible = "isil,isl12026"; | ||
25 | reg = <0x6f>; | ||
26 | isil,pwr-bsw = <0>; | ||
27 | isil,pwr-sbib = <1>; | ||
28 | } | ||
diff --git a/MAINTAINERS b/MAINTAINERS index 6d296bdce328..dd7ce9171ac0 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -11810,7 +11810,7 @@ X: kernel/torture.c | |||
11810 | 11810 | ||
11811 | REAL TIME CLOCK (RTC) SUBSYSTEM | 11811 | REAL TIME CLOCK (RTC) SUBSYSTEM |
11812 | M: Alessandro Zummo <a.zummo@towertech.it> | 11812 | M: Alessandro Zummo <a.zummo@towertech.it> |
11813 | M: Alexandre Belloni <alexandre.belloni@free-electrons.com> | 11813 | M: Alexandre Belloni <alexandre.belloni@bootlin.com> |
11814 | L: linux-rtc@vger.kernel.org | 11814 | L: linux-rtc@vger.kernel.org |
11815 | Q: http://patchwork.ozlabs.org/project/rtc-linux/list/ | 11815 | Q: http://patchwork.ozlabs.org/project/rtc-linux/list/ |
11816 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux.git | 11816 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux.git |
diff --git a/arch/parisc/kernel/time.c b/arch/parisc/kernel/time.c index f7e684560186..c3830400ca28 100644 --- a/arch/parisc/kernel/time.c +++ b/arch/parisc/kernel/time.c | |||
@@ -174,7 +174,7 @@ static int rtc_generic_get_time(struct device *dev, struct rtc_time *tm) | |||
174 | 174 | ||
175 | /* we treat tod_sec as unsigned, so this can work until year 2106 */ | 175 | /* we treat tod_sec as unsigned, so this can work until year 2106 */ |
176 | rtc_time64_to_tm(tod_data.tod_sec, tm); | 176 | rtc_time64_to_tm(tod_data.tod_sec, tm); |
177 | return rtc_valid_tm(tm); | 177 | return 0; |
178 | } | 178 | } |
179 | 179 | ||
180 | static int rtc_generic_set_time(struct device *dev, struct rtc_time *tm) | 180 | static int rtc_generic_set_time(struct device *dev, struct rtc_time *tm) |
diff --git a/drivers/char/rtc.c b/drivers/char/rtc.c index 0c858d027bf3..57dc546628b5 100644 --- a/drivers/char/rtc.c +++ b/drivers/char/rtc.c | |||
@@ -809,89 +809,6 @@ static __poll_t rtc_poll(struct file *file, poll_table *wait) | |||
809 | } | 809 | } |
810 | #endif | 810 | #endif |
811 | 811 | ||
812 | int rtc_register(rtc_task_t *task) | ||
813 | { | ||
814 | #ifndef RTC_IRQ | ||
815 | return -EIO; | ||
816 | #else | ||
817 | if (task == NULL || task->func == NULL) | ||
818 | return -EINVAL; | ||
819 | spin_lock_irq(&rtc_lock); | ||
820 | if (rtc_status & RTC_IS_OPEN) { | ||
821 | spin_unlock_irq(&rtc_lock); | ||
822 | return -EBUSY; | ||
823 | } | ||
824 | spin_lock(&rtc_task_lock); | ||
825 | if (rtc_callback) { | ||
826 | spin_unlock(&rtc_task_lock); | ||
827 | spin_unlock_irq(&rtc_lock); | ||
828 | return -EBUSY; | ||
829 | } | ||
830 | rtc_status |= RTC_IS_OPEN; | ||
831 | rtc_callback = task; | ||
832 | spin_unlock(&rtc_task_lock); | ||
833 | spin_unlock_irq(&rtc_lock); | ||
834 | return 0; | ||
835 | #endif | ||
836 | } | ||
837 | EXPORT_SYMBOL(rtc_register); | ||
838 | |||
839 | int rtc_unregister(rtc_task_t *task) | ||
840 | { | ||
841 | #ifndef RTC_IRQ | ||
842 | return -EIO; | ||
843 | #else | ||
844 | unsigned char tmp; | ||
845 | |||
846 | spin_lock_irq(&rtc_lock); | ||
847 | spin_lock(&rtc_task_lock); | ||
848 | if (rtc_callback != task) { | ||
849 | spin_unlock(&rtc_task_lock); | ||
850 | spin_unlock_irq(&rtc_lock); | ||
851 | return -ENXIO; | ||
852 | } | ||
853 | rtc_callback = NULL; | ||
854 | |||
855 | /* disable controls */ | ||
856 | if (!hpet_mask_rtc_irq_bit(RTC_PIE | RTC_AIE | RTC_UIE)) { | ||
857 | tmp = CMOS_READ(RTC_CONTROL); | ||
858 | tmp &= ~RTC_PIE; | ||
859 | tmp &= ~RTC_AIE; | ||
860 | tmp &= ~RTC_UIE; | ||
861 | CMOS_WRITE(tmp, RTC_CONTROL); | ||
862 | CMOS_READ(RTC_INTR_FLAGS); | ||
863 | } | ||
864 | if (rtc_status & RTC_TIMER_ON) { | ||
865 | rtc_status &= ~RTC_TIMER_ON; | ||
866 | del_timer(&rtc_irq_timer); | ||
867 | } | ||
868 | rtc_status &= ~RTC_IS_OPEN; | ||
869 | spin_unlock(&rtc_task_lock); | ||
870 | spin_unlock_irq(&rtc_lock); | ||
871 | return 0; | ||
872 | #endif | ||
873 | } | ||
874 | EXPORT_SYMBOL(rtc_unregister); | ||
875 | |||
876 | int rtc_control(rtc_task_t *task, unsigned int cmd, unsigned long arg) | ||
877 | { | ||
878 | #ifndef RTC_IRQ | ||
879 | return -EIO; | ||
880 | #else | ||
881 | unsigned long flags; | ||
882 | if (cmd != RTC_PIE_ON && cmd != RTC_PIE_OFF && cmd != RTC_IRQP_SET) | ||
883 | return -EINVAL; | ||
884 | spin_lock_irqsave(&rtc_task_lock, flags); | ||
885 | if (rtc_callback != task) { | ||
886 | spin_unlock_irqrestore(&rtc_task_lock, flags); | ||
887 | return -ENXIO; | ||
888 | } | ||
889 | spin_unlock_irqrestore(&rtc_task_lock, flags); | ||
890 | return rtc_do_ioctl(cmd, arg, 1); | ||
891 | #endif | ||
892 | } | ||
893 | EXPORT_SYMBOL(rtc_control); | ||
894 | |||
895 | /* | 812 | /* |
896 | * The various file operations we support. | 813 | * The various file operations we support. |
897 | */ | 814 | */ |
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 319e3c8976d5..59e6dede3db3 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig | |||
@@ -407,6 +407,16 @@ config RTC_DRV_ISL12022 | |||
407 | This driver can also be built as a module. If so, the module | 407 | This driver can also be built as a module. If so, the module |
408 | will be called rtc-isl12022. | 408 | will be called rtc-isl12022. |
409 | 409 | ||
410 | config RTC_DRV_ISL12026 | ||
411 | tristate "Intersil ISL12026" | ||
412 | depends on OF || COMPILE_TEST | ||
413 | help | ||
414 | If you say yes here you get support for the | ||
415 | Intersil ISL12026 RTC chip. | ||
416 | |||
417 | This driver can also be built as a module. If so, the module | ||
418 | will be called rtc-isl12026. | ||
419 | |||
410 | config RTC_DRV_X1205 | 420 | config RTC_DRV_X1205 |
411 | tristate "Xicor/Intersil X1205" | 421 | tristate "Xicor/Intersil X1205" |
412 | help | 422 | help |
@@ -1413,6 +1423,7 @@ config RTC_DRV_AT91RM9200 | |||
1413 | config RTC_DRV_AT91SAM9 | 1423 | config RTC_DRV_AT91SAM9 |
1414 | tristate "AT91SAM9 RTT as RTC" | 1424 | tristate "AT91SAM9 RTT as RTC" |
1415 | depends on ARCH_AT91 || COMPILE_TEST | 1425 | depends on ARCH_AT91 || COMPILE_TEST |
1426 | depends on HAS_IOMEM | ||
1416 | select MFD_SYSCON | 1427 | select MFD_SYSCON |
1417 | help | 1428 | help |
1418 | Some AT91SAM9 SoCs provide an RTT (Real Time Timer) block which | 1429 | Some AT91SAM9 SoCs provide an RTT (Real Time Timer) block which |
@@ -1502,7 +1513,7 @@ config RTC_DRV_STARFIRE | |||
1502 | 1513 | ||
1503 | config RTC_DRV_TX4939 | 1514 | config RTC_DRV_TX4939 |
1504 | tristate "TX4939 SoC" | 1515 | tristate "TX4939 SoC" |
1505 | depends on SOC_TX4939 | 1516 | depends on SOC_TX4939 || COMPILE_TEST |
1506 | help | 1517 | help |
1507 | Driver for the internal RTC (Realtime Clock) module found on | 1518 | Driver for the internal RTC (Realtime Clock) module found on |
1508 | Toshiba TX4939 SoC. | 1519 | Toshiba TX4939 SoC. |
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index ee0206becd9f..5ff2fc0c361a 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile | |||
@@ -75,6 +75,7 @@ obj-$(CONFIG_RTC_DRV_HID_SENSOR_TIME) += rtc-hid-sensor-time.o | |||
75 | obj-$(CONFIG_RTC_DRV_HYM8563) += rtc-hym8563.o | 75 | obj-$(CONFIG_RTC_DRV_HYM8563) += rtc-hym8563.o |
76 | obj-$(CONFIG_RTC_DRV_IMXDI) += rtc-imxdi.o | 76 | obj-$(CONFIG_RTC_DRV_IMXDI) += rtc-imxdi.o |
77 | obj-$(CONFIG_RTC_DRV_ISL12022) += rtc-isl12022.o | 77 | obj-$(CONFIG_RTC_DRV_ISL12022) += rtc-isl12022.o |
78 | obj-$(CONFIG_RTC_DRV_ISL12026) += rtc-isl12026.o | ||
78 | obj-$(CONFIG_RTC_DRV_ISL1208) += rtc-isl1208.o | 79 | obj-$(CONFIG_RTC_DRV_ISL1208) += rtc-isl1208.o |
79 | obj-$(CONFIG_RTC_DRV_JZ4740) += rtc-jz4740.o | 80 | obj-$(CONFIG_RTC_DRV_JZ4740) += rtc-jz4740.o |
80 | obj-$(CONFIG_RTC_DRV_LP8788) += rtc-lp8788.o | 81 | obj-$(CONFIG_RTC_DRV_LP8788) += rtc-lp8788.o |
diff --git a/drivers/rtc/class.c b/drivers/rtc/class.c index 722d683e0b0f..d37588f08055 100644 --- a/drivers/rtc/class.c +++ b/drivers/rtc/class.c | |||
@@ -211,6 +211,73 @@ static int rtc_device_get_id(struct device *dev) | |||
211 | return id; | 211 | return id; |
212 | } | 212 | } |
213 | 213 | ||
214 | static void rtc_device_get_offset(struct rtc_device *rtc) | ||
215 | { | ||
216 | time64_t range_secs; | ||
217 | u32 start_year; | ||
218 | int ret; | ||
219 | |||
220 | /* | ||
221 | * If RTC driver did not implement the range of RTC hardware device, | ||
222 | * then we can not expand the RTC range by adding or subtracting one | ||
223 | * offset. | ||
224 | */ | ||
225 | if (rtc->range_min == rtc->range_max) | ||
226 | return; | ||
227 | |||
228 | ret = device_property_read_u32(rtc->dev.parent, "start-year", | ||
229 | &start_year); | ||
230 | if (!ret) { | ||
231 | rtc->start_secs = mktime64(start_year, 1, 1, 0, 0, 0); | ||
232 | rtc->set_start_time = true; | ||
233 | } | ||
234 | |||
235 | /* | ||
236 | * If user did not implement the start time for RTC driver, then no | ||
237 | * need to expand the RTC range. | ||
238 | */ | ||
239 | if (!rtc->set_start_time) | ||
240 | return; | ||
241 | |||
242 | range_secs = rtc->range_max - rtc->range_min + 1; | ||
243 | |||
244 | /* | ||
245 | * If the start_secs is larger than the maximum seconds (rtc->range_max) | ||
246 | * supported by RTC hardware or the maximum seconds of new expanded | ||
247 | * range (start_secs + rtc->range_max - rtc->range_min) is less than | ||
248 | * rtc->range_min, which means the minimum seconds (rtc->range_min) of | ||
249 | * RTC hardware will be mapped to start_secs by adding one offset, so | ||
250 | * the offset seconds calculation formula should be: | ||
251 | * rtc->offset_secs = rtc->start_secs - rtc->range_min; | ||
252 | * | ||
253 | * If the start_secs is larger than the minimum seconds (rtc->range_min) | ||
254 | * supported by RTC hardware, then there is one region is overlapped | ||
255 | * between the original RTC hardware range and the new expanded range, | ||
256 | * and this overlapped region do not need to be mapped into the new | ||
257 | * expanded range due to it is valid for RTC device. So the minimum | ||
258 | * seconds of RTC hardware (rtc->range_min) should be mapped to | ||
259 | * rtc->range_max + 1, then the offset seconds formula should be: | ||
260 | * rtc->offset_secs = rtc->range_max - rtc->range_min + 1; | ||
261 | * | ||
262 | * If the start_secs is less than the minimum seconds (rtc->range_min), | ||
263 | * which is similar to case 2. So the start_secs should be mapped to | ||
264 | * start_secs + rtc->range_max - rtc->range_min + 1, then the | ||
265 | * offset seconds formula should be: | ||
266 | * rtc->offset_secs = -(rtc->range_max - rtc->range_min + 1); | ||
267 | * | ||
268 | * Otherwise the offset seconds should be 0. | ||
269 | */ | ||
270 | if (rtc->start_secs > rtc->range_max || | ||
271 | rtc->start_secs + range_secs - 1 < rtc->range_min) | ||
272 | rtc->offset_secs = rtc->start_secs - rtc->range_min; | ||
273 | else if (rtc->start_secs > rtc->range_min) | ||
274 | rtc->offset_secs = range_secs; | ||
275 | else if (rtc->start_secs < rtc->range_min) | ||
276 | rtc->offset_secs = -range_secs; | ||
277 | else | ||
278 | rtc->offset_secs = 0; | ||
279 | } | ||
280 | |||
214 | /** | 281 | /** |
215 | * rtc_device_register - register w/ RTC class | 282 | * rtc_device_register - register w/ RTC class |
216 | * @dev: the device to register | 283 | * @dev: the device to register |
@@ -247,6 +314,8 @@ struct rtc_device *rtc_device_register(const char *name, struct device *dev, | |||
247 | 314 | ||
248 | dev_set_name(&rtc->dev, "rtc%d", id); | 315 | dev_set_name(&rtc->dev, "rtc%d", id); |
249 | 316 | ||
317 | rtc_device_get_offset(rtc); | ||
318 | |||
250 | /* Check to see if there is an ALARM already set in hw */ | 319 | /* Check to see if there is an ALARM already set in hw */ |
251 | err = __rtc_read_alarm(rtc, &alrm); | 320 | err = __rtc_read_alarm(rtc, &alrm); |
252 | 321 | ||
@@ -293,8 +362,6 @@ EXPORT_SYMBOL_GPL(rtc_device_register); | |||
293 | */ | 362 | */ |
294 | void rtc_device_unregister(struct rtc_device *rtc) | 363 | void rtc_device_unregister(struct rtc_device *rtc) |
295 | { | 364 | { |
296 | rtc_nvmem_unregister(rtc); | ||
297 | |||
298 | mutex_lock(&rtc->ops_lock); | 365 | mutex_lock(&rtc->ops_lock); |
299 | /* | 366 | /* |
300 | * Remove innards of this RTC, then disable it, before | 367 | * Remove innards of this RTC, then disable it, before |
@@ -312,6 +379,7 @@ static void devm_rtc_device_release(struct device *dev, void *res) | |||
312 | { | 379 | { |
313 | struct rtc_device *rtc = *(struct rtc_device **)res; | 380 | struct rtc_device *rtc = *(struct rtc_device **)res; |
314 | 381 | ||
382 | rtc_nvmem_unregister(rtc); | ||
315 | rtc_device_unregister(rtc); | 383 | rtc_device_unregister(rtc); |
316 | } | 384 | } |
317 | 385 | ||
@@ -382,6 +450,8 @@ static void devm_rtc_release_device(struct device *dev, void *res) | |||
382 | { | 450 | { |
383 | struct rtc_device *rtc = *(struct rtc_device **)res; | 451 | struct rtc_device *rtc = *(struct rtc_device **)res; |
384 | 452 | ||
453 | rtc_nvmem_unregister(rtc); | ||
454 | |||
385 | if (rtc->registered) | 455 | if (rtc->registered) |
386 | rtc_device_unregister(rtc); | 456 | rtc_device_unregister(rtc); |
387 | else | 457 | else |
@@ -435,6 +505,7 @@ int __rtc_register_device(struct module *owner, struct rtc_device *rtc) | |||
435 | return -EINVAL; | 505 | return -EINVAL; |
436 | 506 | ||
437 | rtc->owner = owner; | 507 | rtc->owner = owner; |
508 | rtc_device_get_offset(rtc); | ||
438 | 509 | ||
439 | /* Check to see if there is an ALARM already set in hw */ | 510 | /* Check to see if there is an ALARM already set in hw */ |
440 | err = __rtc_read_alarm(rtc, &alrm); | 511 | err = __rtc_read_alarm(rtc, &alrm); |
@@ -453,8 +524,6 @@ int __rtc_register_device(struct module *owner, struct rtc_device *rtc) | |||
453 | 524 | ||
454 | rtc_proc_add_device(rtc); | 525 | rtc_proc_add_device(rtc); |
455 | 526 | ||
456 | rtc_nvmem_register(rtc); | ||
457 | |||
458 | rtc->registered = true; | 527 | rtc->registered = true; |
459 | dev_info(rtc->dev.parent, "registered as %s\n", | 528 | dev_info(rtc->dev.parent, "registered as %s\n", |
460 | dev_name(&rtc->dev)); | 529 | dev_name(&rtc->dev)); |
diff --git a/drivers/rtc/hctosys.c b/drivers/rtc/hctosys.c index e1cfa06810ef..e79f2a181ad2 100644 --- a/drivers/rtc/hctosys.c +++ b/drivers/rtc/hctosys.c | |||
@@ -49,6 +49,11 @@ static int __init rtc_hctosys(void) | |||
49 | 49 | ||
50 | tv64.tv_sec = rtc_tm_to_time64(&tm); | 50 | tv64.tv_sec = rtc_tm_to_time64(&tm); |
51 | 51 | ||
52 | #if BITS_PER_LONG == 32 | ||
53 | if (tv64.tv_sec > INT_MAX) | ||
54 | goto err_read; | ||
55 | #endif | ||
56 | |||
52 | err = do_settimeofday64(&tv64); | 57 | err = do_settimeofday64(&tv64); |
53 | 58 | ||
54 | dev_info(rtc->dev.parent, | 59 | dev_info(rtc->dev.parent, |
diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c index 672b192f8153..7cbdc9228dd5 100644 --- a/drivers/rtc/interface.c +++ b/drivers/rtc/interface.c | |||
@@ -17,9 +17,73 @@ | |||
17 | #include <linux/log2.h> | 17 | #include <linux/log2.h> |
18 | #include <linux/workqueue.h> | 18 | #include <linux/workqueue.h> |
19 | 19 | ||
20 | #define CREATE_TRACE_POINTS | ||
21 | #include <trace/events/rtc.h> | ||
22 | |||
20 | static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer); | 23 | static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer); |
21 | static void rtc_timer_remove(struct rtc_device *rtc, struct rtc_timer *timer); | 24 | static void rtc_timer_remove(struct rtc_device *rtc, struct rtc_timer *timer); |
22 | 25 | ||
26 | static void rtc_add_offset(struct rtc_device *rtc, struct rtc_time *tm) | ||
27 | { | ||
28 | time64_t secs; | ||
29 | |||
30 | if (!rtc->offset_secs) | ||
31 | return; | ||
32 | |||
33 | secs = rtc_tm_to_time64(tm); | ||
34 | |||
35 | /* | ||
36 | * Since the reading time values from RTC device are always in the RTC | ||
37 | * original valid range, but we need to skip the overlapped region | ||
38 | * between expanded range and original range, which is no need to add | ||
39 | * the offset. | ||
40 | */ | ||
41 | if ((rtc->start_secs > rtc->range_min && secs >= rtc->start_secs) || | ||
42 | (rtc->start_secs < rtc->range_min && | ||
43 | secs <= (rtc->start_secs + rtc->range_max - rtc->range_min))) | ||
44 | return; | ||
45 | |||
46 | rtc_time64_to_tm(secs + rtc->offset_secs, tm); | ||
47 | } | ||
48 | |||
49 | static void rtc_subtract_offset(struct rtc_device *rtc, struct rtc_time *tm) | ||
50 | { | ||
51 | time64_t secs; | ||
52 | |||
53 | if (!rtc->offset_secs) | ||
54 | return; | ||
55 | |||
56 | secs = rtc_tm_to_time64(tm); | ||
57 | |||
58 | /* | ||
59 | * If the setting time values are in the valid range of RTC hardware | ||
60 | * device, then no need to subtract the offset when setting time to RTC | ||
61 | * device. Otherwise we need to subtract the offset to make the time | ||
62 | * values are valid for RTC hardware device. | ||
63 | */ | ||
64 | if (secs >= rtc->range_min && secs <= rtc->range_max) | ||
65 | return; | ||
66 | |||
67 | rtc_time64_to_tm(secs - rtc->offset_secs, tm); | ||
68 | } | ||
69 | |||
70 | static int rtc_valid_range(struct rtc_device *rtc, struct rtc_time *tm) | ||
71 | { | ||
72 | if (rtc->range_min != rtc->range_max) { | ||
73 | time64_t time = rtc_tm_to_time64(tm); | ||
74 | time64_t range_min = rtc->set_start_time ? rtc->start_secs : | ||
75 | rtc->range_min; | ||
76 | time64_t range_max = rtc->set_start_time ? | ||
77 | (rtc->start_secs + rtc->range_max - rtc->range_min) : | ||
78 | rtc->range_max; | ||
79 | |||
80 | if (time < range_min || time > range_max) | ||
81 | return -ERANGE; | ||
82 | } | ||
83 | |||
84 | return 0; | ||
85 | } | ||
86 | |||
23 | static int __rtc_read_time(struct rtc_device *rtc, struct rtc_time *tm) | 87 | static int __rtc_read_time(struct rtc_device *rtc, struct rtc_time *tm) |
24 | { | 88 | { |
25 | int err; | 89 | int err; |
@@ -36,6 +100,8 @@ static int __rtc_read_time(struct rtc_device *rtc, struct rtc_time *tm) | |||
36 | return err; | 100 | return err; |
37 | } | 101 | } |
38 | 102 | ||
103 | rtc_add_offset(rtc, tm); | ||
104 | |||
39 | err = rtc_valid_tm(tm); | 105 | err = rtc_valid_tm(tm); |
40 | if (err < 0) | 106 | if (err < 0) |
41 | dev_dbg(&rtc->dev, "read_time: rtc_time isn't valid\n"); | 107 | dev_dbg(&rtc->dev, "read_time: rtc_time isn't valid\n"); |
@@ -53,6 +119,8 @@ int rtc_read_time(struct rtc_device *rtc, struct rtc_time *tm) | |||
53 | 119 | ||
54 | err = __rtc_read_time(rtc, tm); | 120 | err = __rtc_read_time(rtc, tm); |
55 | mutex_unlock(&rtc->ops_lock); | 121 | mutex_unlock(&rtc->ops_lock); |
122 | |||
123 | trace_rtc_read_time(rtc_tm_to_time64(tm), err); | ||
56 | return err; | 124 | return err; |
57 | } | 125 | } |
58 | EXPORT_SYMBOL_GPL(rtc_read_time); | 126 | EXPORT_SYMBOL_GPL(rtc_read_time); |
@@ -65,6 +133,12 @@ int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm) | |||
65 | if (err != 0) | 133 | if (err != 0) |
66 | return err; | 134 | return err; |
67 | 135 | ||
136 | err = rtc_valid_range(rtc, tm); | ||
137 | if (err) | ||
138 | return err; | ||
139 | |||
140 | rtc_subtract_offset(rtc, tm); | ||
141 | |||
68 | err = mutex_lock_interruptible(&rtc->ops_lock); | 142 | err = mutex_lock_interruptible(&rtc->ops_lock); |
69 | if (err) | 143 | if (err) |
70 | return err; | 144 | return err; |
@@ -87,6 +161,8 @@ int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm) | |||
87 | mutex_unlock(&rtc->ops_lock); | 161 | mutex_unlock(&rtc->ops_lock); |
88 | /* A timer might have just expired */ | 162 | /* A timer might have just expired */ |
89 | schedule_work(&rtc->irqwork); | 163 | schedule_work(&rtc->irqwork); |
164 | |||
165 | trace_rtc_set_time(rtc_tm_to_time64(tm), err); | ||
90 | return err; | 166 | return err; |
91 | } | 167 | } |
92 | EXPORT_SYMBOL_GPL(rtc_set_time); | 168 | EXPORT_SYMBOL_GPL(rtc_set_time); |
@@ -119,6 +195,8 @@ static int rtc_read_alarm_internal(struct rtc_device *rtc, struct rtc_wkalrm *al | |||
119 | } | 195 | } |
120 | 196 | ||
121 | mutex_unlock(&rtc->ops_lock); | 197 | mutex_unlock(&rtc->ops_lock); |
198 | |||
199 | trace_rtc_read_alarm(rtc_tm_to_time64(&alarm->time), err); | ||
122 | return err; | 200 | return err; |
123 | } | 201 | } |
124 | 202 | ||
@@ -316,6 +394,7 @@ int rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm) | |||
316 | } | 394 | } |
317 | mutex_unlock(&rtc->ops_lock); | 395 | mutex_unlock(&rtc->ops_lock); |
318 | 396 | ||
397 | trace_rtc_read_alarm(rtc_tm_to_time64(&alarm->time), err); | ||
319 | return err; | 398 | return err; |
320 | } | 399 | } |
321 | EXPORT_SYMBOL_GPL(rtc_read_alarm); | 400 | EXPORT_SYMBOL_GPL(rtc_read_alarm); |
@@ -329,6 +408,8 @@ static int __rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm) | |||
329 | err = rtc_valid_tm(&alarm->time); | 408 | err = rtc_valid_tm(&alarm->time); |
330 | if (err) | 409 | if (err) |
331 | return err; | 410 | return err; |
411 | |||
412 | rtc_subtract_offset(rtc, &alarm->time); | ||
332 | scheduled = rtc_tm_to_time64(&alarm->time); | 413 | scheduled = rtc_tm_to_time64(&alarm->time); |
333 | 414 | ||
334 | /* Make sure we're not setting alarms in the past */ | 415 | /* Make sure we're not setting alarms in the past */ |
@@ -352,6 +433,7 @@ static int __rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm) | |||
352 | else | 433 | else |
353 | err = rtc->ops->set_alarm(rtc->dev.parent, alarm); | 434 | err = rtc->ops->set_alarm(rtc->dev.parent, alarm); |
354 | 435 | ||
436 | trace_rtc_set_alarm(rtc_tm_to_time64(&alarm->time), err); | ||
355 | return err; | 437 | return err; |
356 | } | 438 | } |
357 | 439 | ||
@@ -363,6 +445,10 @@ int rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm) | |||
363 | if (err != 0) | 445 | if (err != 0) |
364 | return err; | 446 | return err; |
365 | 447 | ||
448 | err = rtc_valid_range(rtc, &alarm->time); | ||
449 | if (err) | ||
450 | return err; | ||
451 | |||
366 | err = mutex_lock_interruptible(&rtc->ops_lock); | 452 | err = mutex_lock_interruptible(&rtc->ops_lock); |
367 | if (err) | 453 | if (err) |
368 | return err; | 454 | return err; |
@@ -375,6 +461,8 @@ int rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm) | |||
375 | err = rtc_timer_enqueue(rtc, &rtc->aie_timer); | 461 | err = rtc_timer_enqueue(rtc, &rtc->aie_timer); |
376 | 462 | ||
377 | mutex_unlock(&rtc->ops_lock); | 463 | mutex_unlock(&rtc->ops_lock); |
464 | |||
465 | rtc_add_offset(rtc, &alarm->time); | ||
378 | return err; | 466 | return err; |
379 | } | 467 | } |
380 | EXPORT_SYMBOL_GPL(rtc_set_alarm); | 468 | EXPORT_SYMBOL_GPL(rtc_set_alarm); |
@@ -406,6 +494,7 @@ int rtc_initialize_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm) | |||
406 | 494 | ||
407 | rtc->aie_timer.enabled = 1; | 495 | rtc->aie_timer.enabled = 1; |
408 | timerqueue_add(&rtc->timerqueue, &rtc->aie_timer.node); | 496 | timerqueue_add(&rtc->timerqueue, &rtc->aie_timer.node); |
497 | trace_rtc_timer_enqueue(&rtc->aie_timer); | ||
409 | } | 498 | } |
410 | mutex_unlock(&rtc->ops_lock); | 499 | mutex_unlock(&rtc->ops_lock); |
411 | return err; | 500 | return err; |
@@ -435,6 +524,8 @@ int rtc_alarm_irq_enable(struct rtc_device *rtc, unsigned int enabled) | |||
435 | err = rtc->ops->alarm_irq_enable(rtc->dev.parent, enabled); | 524 | err = rtc->ops->alarm_irq_enable(rtc->dev.parent, enabled); |
436 | 525 | ||
437 | mutex_unlock(&rtc->ops_lock); | 526 | mutex_unlock(&rtc->ops_lock); |
527 | |||
528 | trace_rtc_alarm_irq_enable(enabled, err); | ||
438 | return err; | 529 | return err; |
439 | } | 530 | } |
440 | EXPORT_SYMBOL_GPL(rtc_alarm_irq_enable); | 531 | EXPORT_SYMBOL_GPL(rtc_alarm_irq_enable); |
@@ -709,6 +800,8 @@ retry: | |||
709 | rtc->pie_enabled = enabled; | 800 | rtc->pie_enabled = enabled; |
710 | } | 801 | } |
711 | spin_unlock_irqrestore(&rtc->irq_task_lock, flags); | 802 | spin_unlock_irqrestore(&rtc->irq_task_lock, flags); |
803 | |||
804 | trace_rtc_irq_set_state(enabled, err); | ||
712 | return err; | 805 | return err; |
713 | } | 806 | } |
714 | EXPORT_SYMBOL_GPL(rtc_irq_set_state); | 807 | EXPORT_SYMBOL_GPL(rtc_irq_set_state); |
@@ -745,6 +838,8 @@ retry: | |||
745 | } | 838 | } |
746 | } | 839 | } |
747 | spin_unlock_irqrestore(&rtc->irq_task_lock, flags); | 840 | spin_unlock_irqrestore(&rtc->irq_task_lock, flags); |
841 | |||
842 | trace_rtc_irq_set_freq(freq, err); | ||
748 | return err; | 843 | return err; |
749 | } | 844 | } |
750 | EXPORT_SYMBOL_GPL(rtc_irq_set_freq); | 845 | EXPORT_SYMBOL_GPL(rtc_irq_set_freq); |
@@ -779,6 +874,7 @@ static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer) | |||
779 | } | 874 | } |
780 | 875 | ||
781 | timerqueue_add(&rtc->timerqueue, &timer->node); | 876 | timerqueue_add(&rtc->timerqueue, &timer->node); |
877 | trace_rtc_timer_enqueue(timer); | ||
782 | if (!next || ktime_before(timer->node.expires, next->expires)) { | 878 | if (!next || ktime_before(timer->node.expires, next->expires)) { |
783 | struct rtc_wkalrm alarm; | 879 | struct rtc_wkalrm alarm; |
784 | int err; | 880 | int err; |
@@ -790,6 +886,7 @@ static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer) | |||
790 | schedule_work(&rtc->irqwork); | 886 | schedule_work(&rtc->irqwork); |
791 | } else if (err) { | 887 | } else if (err) { |
792 | timerqueue_del(&rtc->timerqueue, &timer->node); | 888 | timerqueue_del(&rtc->timerqueue, &timer->node); |
889 | trace_rtc_timer_dequeue(timer); | ||
793 | timer->enabled = 0; | 890 | timer->enabled = 0; |
794 | return err; | 891 | return err; |
795 | } | 892 | } |
@@ -803,6 +900,7 @@ static void rtc_alarm_disable(struct rtc_device *rtc) | |||
803 | return; | 900 | return; |
804 | 901 | ||
805 | rtc->ops->alarm_irq_enable(rtc->dev.parent, false); | 902 | rtc->ops->alarm_irq_enable(rtc->dev.parent, false); |
903 | trace_rtc_alarm_irq_enable(0, 0); | ||
806 | } | 904 | } |
807 | 905 | ||
808 | /** | 906 | /** |
@@ -821,6 +919,7 @@ static void rtc_timer_remove(struct rtc_device *rtc, struct rtc_timer *timer) | |||
821 | { | 919 | { |
822 | struct timerqueue_node *next = timerqueue_getnext(&rtc->timerqueue); | 920 | struct timerqueue_node *next = timerqueue_getnext(&rtc->timerqueue); |
823 | timerqueue_del(&rtc->timerqueue, &timer->node); | 921 | timerqueue_del(&rtc->timerqueue, &timer->node); |
922 | trace_rtc_timer_dequeue(timer); | ||
824 | timer->enabled = 0; | 923 | timer->enabled = 0; |
825 | if (next == &timer->node) { | 924 | if (next == &timer->node) { |
826 | struct rtc_wkalrm alarm; | 925 | struct rtc_wkalrm alarm; |
@@ -871,16 +970,19 @@ again: | |||
871 | /* expire timer */ | 970 | /* expire timer */ |
872 | timer = container_of(next, struct rtc_timer, node); | 971 | timer = container_of(next, struct rtc_timer, node); |
873 | timerqueue_del(&rtc->timerqueue, &timer->node); | 972 | timerqueue_del(&rtc->timerqueue, &timer->node); |
973 | trace_rtc_timer_dequeue(timer); | ||
874 | timer->enabled = 0; | 974 | timer->enabled = 0; |
875 | if (timer->task.func) | 975 | if (timer->task.func) |
876 | timer->task.func(timer->task.private_data); | 976 | timer->task.func(timer->task.private_data); |
877 | 977 | ||
978 | trace_rtc_timer_fired(timer); | ||
878 | /* Re-add/fwd periodic timers */ | 979 | /* Re-add/fwd periodic timers */ |
879 | if (ktime_to_ns(timer->period)) { | 980 | if (ktime_to_ns(timer->period)) { |
880 | timer->node.expires = ktime_add(timer->node.expires, | 981 | timer->node.expires = ktime_add(timer->node.expires, |
881 | timer->period); | 982 | timer->period); |
882 | timer->enabled = 1; | 983 | timer->enabled = 1; |
883 | timerqueue_add(&rtc->timerqueue, &timer->node); | 984 | timerqueue_add(&rtc->timerqueue, &timer->node); |
985 | trace_rtc_timer_enqueue(timer); | ||
884 | } | 986 | } |
885 | } | 987 | } |
886 | 988 | ||
@@ -902,6 +1004,7 @@ reprogram: | |||
902 | 1004 | ||
903 | timer = container_of(next, struct rtc_timer, node); | 1005 | timer = container_of(next, struct rtc_timer, node); |
904 | timerqueue_del(&rtc->timerqueue, &timer->node); | 1006 | timerqueue_del(&rtc->timerqueue, &timer->node); |
1007 | trace_rtc_timer_dequeue(timer); | ||
905 | timer->enabled = 0; | 1008 | timer->enabled = 0; |
906 | dev_err(&rtc->dev, "__rtc_set_alarm: err=%d\n", err); | 1009 | dev_err(&rtc->dev, "__rtc_set_alarm: err=%d\n", err); |
907 | goto again; | 1010 | goto again; |
@@ -992,6 +1095,8 @@ int rtc_read_offset(struct rtc_device *rtc, long *offset) | |||
992 | mutex_lock(&rtc->ops_lock); | 1095 | mutex_lock(&rtc->ops_lock); |
993 | ret = rtc->ops->read_offset(rtc->dev.parent, offset); | 1096 | ret = rtc->ops->read_offset(rtc->dev.parent, offset); |
994 | mutex_unlock(&rtc->ops_lock); | 1097 | mutex_unlock(&rtc->ops_lock); |
1098 | |||
1099 | trace_rtc_read_offset(*offset, ret); | ||
995 | return ret; | 1100 | return ret; |
996 | } | 1101 | } |
997 | 1102 | ||
@@ -1025,5 +1130,7 @@ int rtc_set_offset(struct rtc_device *rtc, long offset) | |||
1025 | mutex_lock(&rtc->ops_lock); | 1130 | mutex_lock(&rtc->ops_lock); |
1026 | ret = rtc->ops->set_offset(rtc->dev.parent, offset); | 1131 | ret = rtc->ops->set_offset(rtc->dev.parent, offset); |
1027 | mutex_unlock(&rtc->ops_lock); | 1132 | mutex_unlock(&rtc->ops_lock); |
1133 | |||
1134 | trace_rtc_set_offset(offset, ret); | ||
1028 | return ret; | 1135 | return ret; |
1029 | } | 1136 | } |
diff --git a/drivers/rtc/nvmem.c b/drivers/rtc/nvmem.c index 8567b4ed9ac6..17ec4c8d0fad 100644 --- a/drivers/rtc/nvmem.c +++ b/drivers/rtc/nvmem.c | |||
@@ -14,8 +14,6 @@ | |||
14 | #include <linux/rtc.h> | 14 | #include <linux/rtc.h> |
15 | #include <linux/sysfs.h> | 15 | #include <linux/sysfs.h> |
16 | 16 | ||
17 | #include "rtc-core.h" | ||
18 | |||
19 | /* | 17 | /* |
20 | * Deprecated ABI compatibility, this should be removed at some point | 18 | * Deprecated ABI compatibility, this should be removed at some point |
21 | */ | 19 | */ |
@@ -46,7 +44,7 @@ rtc_nvram_write(struct file *filp, struct kobject *kobj, | |||
46 | return nvmem_device_write(rtc->nvmem, off, count, buf); | 44 | return nvmem_device_write(rtc->nvmem, off, count, buf); |
47 | } | 45 | } |
48 | 46 | ||
49 | static int rtc_nvram_register(struct rtc_device *rtc) | 47 | static int rtc_nvram_register(struct rtc_device *rtc, size_t size) |
50 | { | 48 | { |
51 | int err; | 49 | int err; |
52 | 50 | ||
@@ -64,7 +62,7 @@ static int rtc_nvram_register(struct rtc_device *rtc) | |||
64 | 62 | ||
65 | rtc->nvram->read = rtc_nvram_read; | 63 | rtc->nvram->read = rtc_nvram_read; |
66 | rtc->nvram->write = rtc_nvram_write; | 64 | rtc->nvram->write = rtc_nvram_write; |
67 | rtc->nvram->size = rtc->nvmem_config->size; | 65 | rtc->nvram->size = size; |
68 | 66 | ||
69 | err = sysfs_create_bin_file(&rtc->dev.parent->kobj, | 67 | err = sysfs_create_bin_file(&rtc->dev.parent->kobj, |
70 | rtc->nvram); | 68 | rtc->nvram); |
@@ -84,21 +82,28 @@ static void rtc_nvram_unregister(struct rtc_device *rtc) | |||
84 | /* | 82 | /* |
85 | * New ABI, uses nvmem | 83 | * New ABI, uses nvmem |
86 | */ | 84 | */ |
87 | void rtc_nvmem_register(struct rtc_device *rtc) | 85 | int rtc_nvmem_register(struct rtc_device *rtc, |
86 | struct nvmem_config *nvmem_config) | ||
88 | { | 87 | { |
89 | if (!rtc->nvmem_config) | 88 | if (!IS_ERR_OR_NULL(rtc->nvmem)) |
90 | return; | 89 | return -EBUSY; |
90 | |||
91 | if (!nvmem_config) | ||
92 | return -ENODEV; | ||
91 | 93 | ||
92 | rtc->nvmem_config->dev = &rtc->dev; | 94 | nvmem_config->dev = rtc->dev.parent; |
93 | rtc->nvmem_config->owner = rtc->owner; | 95 | nvmem_config->owner = rtc->owner; |
94 | rtc->nvmem = nvmem_register(rtc->nvmem_config); | 96 | rtc->nvmem = nvmem_register(nvmem_config); |
95 | if (IS_ERR_OR_NULL(rtc->nvmem)) | 97 | if (IS_ERR_OR_NULL(rtc->nvmem)) |
96 | return; | 98 | return PTR_ERR(rtc->nvmem); |
97 | 99 | ||
98 | /* Register the old ABI */ | 100 | /* Register the old ABI */ |
99 | if (rtc->nvram_old_abi) | 101 | if (rtc->nvram_old_abi) |
100 | rtc_nvram_register(rtc); | 102 | rtc_nvram_register(rtc, nvmem_config->size); |
103 | |||
104 | return 0; | ||
101 | } | 105 | } |
106 | EXPORT_SYMBOL_GPL(rtc_nvmem_register); | ||
102 | 107 | ||
103 | void rtc_nvmem_unregister(struct rtc_device *rtc) | 108 | void rtc_nvmem_unregister(struct rtc_device *rtc) |
104 | { | 109 | { |
diff --git a/drivers/rtc/rtc-88pm80x.c b/drivers/rtc/rtc-88pm80x.c index 466bf7f9a285..6cbafefa80a2 100644 --- a/drivers/rtc/rtc-88pm80x.c +++ b/drivers/rtc/rtc-88pm80x.c | |||
@@ -134,9 +134,9 @@ static int pm80x_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
134 | struct pm80x_rtc_info *info = dev_get_drvdata(dev); | 134 | struct pm80x_rtc_info *info = dev_get_drvdata(dev); |
135 | unsigned char buf[4]; | 135 | unsigned char buf[4]; |
136 | unsigned long ticks, base, data; | 136 | unsigned long ticks, base, data; |
137 | if ((tm->tm_year < 70) || (tm->tm_year > 138)) { | 137 | if (tm->tm_year > 206) { |
138 | dev_dbg(info->dev, | 138 | dev_dbg(info->dev, |
139 | "Set time %d out of range. Please set time between 1970 to 2038.\n", | 139 | "Set time %d out of range. Please set time between 1970 to 2106.\n", |
140 | 1900 + tm->tm_year); | 140 | 1900 + tm->tm_year); |
141 | return -EINVAL; | 141 | return -EINVAL; |
142 | } | 142 | } |
diff --git a/drivers/rtc/rtc-88pm860x.c b/drivers/rtc/rtc-88pm860x.c index 19e53b3b8e00..01ffc0ef8033 100644 --- a/drivers/rtc/rtc-88pm860x.c +++ b/drivers/rtc/rtc-88pm860x.c | |||
@@ -135,9 +135,9 @@ static int pm860x_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
135 | unsigned char buf[4]; | 135 | unsigned char buf[4]; |
136 | unsigned long ticks, base, data; | 136 | unsigned long ticks, base, data; |
137 | 137 | ||
138 | if ((tm->tm_year < 70) || (tm->tm_year > 138)) { | 138 | if (tm->tm_year > 206) { |
139 | dev_dbg(info->dev, "Set time %d out of range. " | 139 | dev_dbg(info->dev, "Set time %d out of range. " |
140 | "Please set time between 1970 to 2038.\n", | 140 | "Please set time between 1970 to 2106.\n", |
141 | 1900 + tm->tm_year); | 141 | 1900 + tm->tm_year); |
142 | return -EINVAL; | 142 | return -EINVAL; |
143 | } | 143 | } |
diff --git a/drivers/rtc/rtc-ab-b5ze-s3.c b/drivers/rtc/rtc-ab-b5ze-s3.c index ef5c16dfabfa..8dc451932446 100644 --- a/drivers/rtc/rtc-ab-b5ze-s3.c +++ b/drivers/rtc/rtc-ab-b5ze-s3.c | |||
@@ -217,7 +217,7 @@ static int _abb5zes3_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
217 | { | 217 | { |
218 | struct abb5zes3_rtc_data *data = dev_get_drvdata(dev); | 218 | struct abb5zes3_rtc_data *data = dev_get_drvdata(dev); |
219 | u8 regs[ABB5ZES3_REG_RTC_SC + ABB5ZES3_RTC_SEC_LEN]; | 219 | u8 regs[ABB5ZES3_REG_RTC_SC + ABB5ZES3_RTC_SEC_LEN]; |
220 | int ret; | 220 | int ret = 0; |
221 | 221 | ||
222 | /* | 222 | /* |
223 | * As we need to read CTRL1 register anyway to access 24/12h | 223 | * As we need to read CTRL1 register anyway to access 24/12h |
@@ -255,8 +255,6 @@ static int _abb5zes3_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
255 | tm->tm_mon = bcd2bin(regs[ABB5ZES3_REG_RTC_MO]) - 1; /* starts at 1 */ | 255 | tm->tm_mon = bcd2bin(regs[ABB5ZES3_REG_RTC_MO]) - 1; /* starts at 1 */ |
256 | tm->tm_year = bcd2bin(regs[ABB5ZES3_REG_RTC_YR]) + 100; | 256 | tm->tm_year = bcd2bin(regs[ABB5ZES3_REG_RTC_YR]) + 100; |
257 | 257 | ||
258 | ret = rtc_valid_tm(tm); | ||
259 | |||
260 | err: | 258 | err: |
261 | return ret; | 259 | return ret; |
262 | } | 260 | } |
diff --git a/drivers/rtc/rtc-ab3100.c b/drivers/rtc/rtc-ab3100.c index 9b725c553058..821ff52a2222 100644 --- a/drivers/rtc/rtc-ab3100.c +++ b/drivers/rtc/rtc-ab3100.c | |||
@@ -106,7 +106,7 @@ static int ab3100_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
106 | 106 | ||
107 | rtc_time64_to_tm(time, tm); | 107 | rtc_time64_to_tm(time, tm); |
108 | 108 | ||
109 | return rtc_valid_tm(tm); | 109 | return 0; |
110 | } | 110 | } |
111 | 111 | ||
112 | static int ab3100_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm) | 112 | static int ab3100_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm) |
diff --git a/drivers/rtc/rtc-ab8500.c b/drivers/rtc/rtc-ab8500.c index 24a0af650a1b..e28f4401fd35 100644 --- a/drivers/rtc/rtc-ab8500.c +++ b/drivers/rtc/rtc-ab8500.c | |||
@@ -36,10 +36,6 @@ | |||
36 | #define AB8500_RTC_FORCE_BKUP_REG 0x0D | 36 | #define AB8500_RTC_FORCE_BKUP_REG 0x0D |
37 | #define AB8500_RTC_CALIB_REG 0x0E | 37 | #define AB8500_RTC_CALIB_REG 0x0E |
38 | #define AB8500_RTC_SWITCH_STAT_REG 0x0F | 38 | #define AB8500_RTC_SWITCH_STAT_REG 0x0F |
39 | #define AB8540_RTC_ALRM_SEC 0x22 | ||
40 | #define AB8540_RTC_ALRM_MIN_LOW_REG 0x23 | ||
41 | #define AB8540_RTC_ALRM_MIN_MID_REG 0x24 | ||
42 | #define AB8540_RTC_ALRM_MIN_HI_REG 0x25 | ||
43 | 39 | ||
44 | /* RtcReadRequest bits */ | 40 | /* RtcReadRequest bits */ |
45 | #define RTC_READ_REQUEST 0x01 | 41 | #define RTC_READ_REQUEST 0x01 |
@@ -63,11 +59,6 @@ static const u8 ab8500_rtc_alarm_regs[] = { | |||
63 | AB8500_RTC_ALRM_MIN_LOW_REG | 59 | AB8500_RTC_ALRM_MIN_LOW_REG |
64 | }; | 60 | }; |
65 | 61 | ||
66 | static const u8 ab8540_rtc_alarm_regs[] = { | ||
67 | AB8540_RTC_ALRM_MIN_HI_REG, AB8540_RTC_ALRM_MIN_MID_REG, | ||
68 | AB8540_RTC_ALRM_MIN_LOW_REG, AB8540_RTC_ALRM_SEC | ||
69 | }; | ||
70 | |||
71 | /* Calculate the seconds from 1970 to 01-01-2000 00:00:00 */ | 62 | /* Calculate the seconds from 1970 to 01-01-2000 00:00:00 */ |
72 | static unsigned long get_elapsed_seconds(int year) | 63 | static unsigned long get_elapsed_seconds(int year) |
73 | { | 64 | { |
@@ -131,7 +122,7 @@ static int ab8500_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
131 | secs += get_elapsed_seconds(AB8500_RTC_EPOCH); | 122 | secs += get_elapsed_seconds(AB8500_RTC_EPOCH); |
132 | 123 | ||
133 | rtc_time_to_tm(secs, tm); | 124 | rtc_time_to_tm(secs, tm); |
134 | return rtc_valid_tm(tm); | 125 | return 0; |
135 | } | 126 | } |
136 | 127 | ||
137 | static int ab8500_rtc_set_time(struct device *dev, struct rtc_time *tm) | 128 | static int ab8500_rtc_set_time(struct device *dev, struct rtc_time *tm) |
@@ -277,43 +268,6 @@ static int ab8500_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm) | |||
277 | return ab8500_rtc_irq_enable(dev, alarm->enabled); | 268 | return ab8500_rtc_irq_enable(dev, alarm->enabled); |
278 | } | 269 | } |
279 | 270 | ||
280 | static int ab8540_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm) | ||
281 | { | ||
282 | int retval, i; | ||
283 | unsigned char buf[ARRAY_SIZE(ab8540_rtc_alarm_regs)]; | ||
284 | unsigned long mins, secs = 0; | ||
285 | |||
286 | if (alarm->time.tm_year < (AB8500_RTC_EPOCH - 1900)) { | ||
287 | dev_dbg(dev, "year should be equal to or greater than %d\n", | ||
288 | AB8500_RTC_EPOCH); | ||
289 | return -EINVAL; | ||
290 | } | ||
291 | |||
292 | /* Get the number of seconds since 1970 */ | ||
293 | rtc_tm_to_time(&alarm->time, &secs); | ||
294 | |||
295 | /* | ||
296 | * Convert it to the number of seconds since 01-01-2000 00:00:00 | ||
297 | */ | ||
298 | secs -= get_elapsed_seconds(AB8500_RTC_EPOCH); | ||
299 | mins = secs / 60; | ||
300 | |||
301 | buf[3] = secs % 60; | ||
302 | buf[2] = mins & 0xFF; | ||
303 | buf[1] = (mins >> 8) & 0xFF; | ||
304 | buf[0] = (mins >> 16) & 0xFF; | ||
305 | |||
306 | /* Set the alarm time */ | ||
307 | for (i = 0; i < ARRAY_SIZE(ab8540_rtc_alarm_regs); i++) { | ||
308 | retval = abx500_set_register_interruptible(dev, AB8500_RTC, | ||
309 | ab8540_rtc_alarm_regs[i], buf[i]); | ||
310 | if (retval < 0) | ||
311 | return retval; | ||
312 | } | ||
313 | |||
314 | return ab8500_rtc_irq_enable(dev, alarm->enabled); | ||
315 | } | ||
316 | |||
317 | static int ab8500_rtc_set_calibration(struct device *dev, int calibration) | 271 | static int ab8500_rtc_set_calibration(struct device *dev, int calibration) |
318 | { | 272 | { |
319 | int retval; | 273 | int retval; |
@@ -435,17 +389,8 @@ static const struct rtc_class_ops ab8500_rtc_ops = { | |||
435 | .alarm_irq_enable = ab8500_rtc_irq_enable, | 389 | .alarm_irq_enable = ab8500_rtc_irq_enable, |
436 | }; | 390 | }; |
437 | 391 | ||
438 | static const struct rtc_class_ops ab8540_rtc_ops = { | ||
439 | .read_time = ab8500_rtc_read_time, | ||
440 | .set_time = ab8500_rtc_set_time, | ||
441 | .read_alarm = ab8500_rtc_read_alarm, | ||
442 | .set_alarm = ab8540_rtc_set_alarm, | ||
443 | .alarm_irq_enable = ab8500_rtc_irq_enable, | ||
444 | }; | ||
445 | |||
446 | static const struct platform_device_id ab85xx_rtc_ids[] = { | 392 | static const struct platform_device_id ab85xx_rtc_ids[] = { |
447 | { "ab8500-rtc", (kernel_ulong_t)&ab8500_rtc_ops, }, | 393 | { "ab8500-rtc", (kernel_ulong_t)&ab8500_rtc_ops, }, |
448 | { "ab8540-rtc", (kernel_ulong_t)&ab8540_rtc_ops, }, | ||
449 | { /* sentinel */ } | 394 | { /* sentinel */ } |
450 | }; | 395 | }; |
451 | MODULE_DEVICE_TABLE(platform, ab85xx_rtc_ids); | 396 | MODULE_DEVICE_TABLE(platform, ab85xx_rtc_ids); |
diff --git a/drivers/rtc/rtc-abx80x.c b/drivers/rtc/rtc-abx80x.c index b033bc556f5d..2cefa67a1132 100644 --- a/drivers/rtc/rtc-abx80x.c +++ b/drivers/rtc/rtc-abx80x.c | |||
@@ -172,11 +172,7 @@ static int abx80x_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
172 | tm->tm_mon = bcd2bin(buf[ABX8XX_REG_MO] & 0x1F) - 1; | 172 | tm->tm_mon = bcd2bin(buf[ABX8XX_REG_MO] & 0x1F) - 1; |
173 | tm->tm_year = bcd2bin(buf[ABX8XX_REG_YR]) + 100; | 173 | tm->tm_year = bcd2bin(buf[ABX8XX_REG_YR]) + 100; |
174 | 174 | ||
175 | err = rtc_valid_tm(tm); | 175 | return 0; |
176 | if (err < 0) | ||
177 | dev_err(&client->dev, "retrieved date/time is not valid.\n"); | ||
178 | |||
179 | return err; | ||
180 | } | 176 | } |
181 | 177 | ||
182 | static int abx80x_rtc_set_time(struct device *dev, struct rtc_time *tm) | 178 | static int abx80x_rtc_set_time(struct device *dev, struct rtc_time *tm) |
diff --git a/drivers/rtc/rtc-ac100.c b/drivers/rtc/rtc-ac100.c index 8ff9dc3fe5bf..3fe576fdd45e 100644 --- a/drivers/rtc/rtc-ac100.c +++ b/drivers/rtc/rtc-ac100.c | |||
@@ -183,7 +183,29 @@ static int ac100_clkout_determine_rate(struct clk_hw *hw, | |||
183 | 183 | ||
184 | for (i = 0; i < num_parents; i++) { | 184 | for (i = 0; i < num_parents; i++) { |
185 | struct clk_hw *parent = clk_hw_get_parent_by_index(hw, i); | 185 | struct clk_hw *parent = clk_hw_get_parent_by_index(hw, i); |
186 | unsigned long tmp, prate = clk_hw_get_rate(parent); | 186 | unsigned long tmp, prate; |
187 | |||
188 | /* | ||
189 | * The clock has two parents, one is a fixed clock which is | ||
190 | * internally registered by the ac100 driver. The other parent | ||
191 | * is a clock from the codec side of the chip, which we | ||
192 | * properly declare and reference in the devicetree and is | ||
193 | * not implemented in any driver right now. | ||
194 | * If the clock core looks for the parent of that second | ||
195 | * missing clock, it can't find one that is registered and | ||
196 | * returns NULL. | ||
197 | * So we end up in a situation where clk_hw_get_num_parents | ||
198 | * returns the amount of clocks we can be parented to, but | ||
199 | * clk_hw_get_parent_by_index will not return the orphan | ||
200 | * clocks. | ||
201 | * Thus we need to check if the parent exists before | ||
202 | * we get the parent rate, so we could use the RTC | ||
203 | * without waiting for the codec to be supported. | ||
204 | */ | ||
205 | if (!parent) | ||
206 | continue; | ||
207 | |||
208 | prate = clk_hw_get_rate(parent); | ||
187 | 209 | ||
188 | tmp = ac100_clkout_round_rate(hw, req->rate, prate); | 210 | tmp = ac100_clkout_round_rate(hw, req->rate, prate); |
189 | 211 | ||
@@ -387,7 +409,7 @@ static int ac100_rtc_get_time(struct device *dev, struct rtc_time *rtc_tm) | |||
387 | rtc_tm->tm_year = bcd2bin(reg[6] & AC100_RTC_YEA_MASK) + | 409 | rtc_tm->tm_year = bcd2bin(reg[6] & AC100_RTC_YEA_MASK) + |
388 | AC100_YEAR_OFF; | 410 | AC100_YEAR_OFF; |
389 | 411 | ||
390 | return rtc_valid_tm(rtc_tm); | 412 | return 0; |
391 | } | 413 | } |
392 | 414 | ||
393 | static int ac100_rtc_set_time(struct device *dev, struct rtc_time *rtc_tm) | 415 | static int ac100_rtc_set_time(struct device *dev, struct rtc_time *rtc_tm) |
diff --git a/drivers/rtc/rtc-at91sam9.c b/drivers/rtc/rtc-at91sam9.c index 7418a763ce52..ee71e647fd43 100644 --- a/drivers/rtc/rtc-at91sam9.c +++ b/drivers/rtc/rtc-at91sam9.c | |||
@@ -349,6 +349,7 @@ static const struct rtc_class_ops at91_rtc_ops = { | |||
349 | }; | 349 | }; |
350 | 350 | ||
351 | static const struct regmap_config gpbr_regmap_config = { | 351 | static const struct regmap_config gpbr_regmap_config = { |
352 | .name = "gpbr", | ||
352 | .reg_bits = 32, | 353 | .reg_bits = 32, |
353 | .val_bits = 32, | 354 | .val_bits = 32, |
354 | .reg_stride = 4, | 355 | .reg_stride = 4, |
diff --git a/drivers/rtc/rtc-au1xxx.c b/drivers/rtc/rtc-au1xxx.c index 2ba44ccb9c3a..7c5530c71285 100644 --- a/drivers/rtc/rtc-au1xxx.c +++ b/drivers/rtc/rtc-au1xxx.c | |||
@@ -36,7 +36,7 @@ static int au1xtoy_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
36 | 36 | ||
37 | rtc_time_to_tm(t, tm); | 37 | rtc_time_to_tm(t, tm); |
38 | 38 | ||
39 | return rtc_valid_tm(tm); | 39 | return 0; |
40 | } | 40 | } |
41 | 41 | ||
42 | static int au1xtoy_rtc_set_time(struct device *dev, struct rtc_time *tm) | 42 | static int au1xtoy_rtc_set_time(struct device *dev, struct rtc_time *tm) |
diff --git a/drivers/rtc/rtc-bq32k.c b/drivers/rtc/rtc-bq32k.c index 98ac8d5c7901..ef52741000a8 100644 --- a/drivers/rtc/rtc-bq32k.c +++ b/drivers/rtc/rtc-bq32k.c | |||
@@ -36,6 +36,10 @@ | |||
36 | #define BQ32K_CFG2 0x09 /* Trickle charger control */ | 36 | #define BQ32K_CFG2 0x09 /* Trickle charger control */ |
37 | #define BQ32K_TCFE BIT(6) /* Trickle charge FET bypass */ | 37 | #define BQ32K_TCFE BIT(6) /* Trickle charge FET bypass */ |
38 | 38 | ||
39 | #define MAX_LEN 10 /* Maximum number of consecutive | ||
40 | * register for this particular RTC. | ||
41 | */ | ||
42 | |||
39 | struct bq32k_regs { | 43 | struct bq32k_regs { |
40 | uint8_t seconds; | 44 | uint8_t seconds; |
41 | uint8_t minutes; | 45 | uint8_t minutes; |
@@ -74,7 +78,7 @@ static int bq32k_read(struct device *dev, void *data, uint8_t off, uint8_t len) | |||
74 | static int bq32k_write(struct device *dev, void *data, uint8_t off, uint8_t len) | 78 | static int bq32k_write(struct device *dev, void *data, uint8_t off, uint8_t len) |
75 | { | 79 | { |
76 | struct i2c_client *client = to_i2c_client(dev); | 80 | struct i2c_client *client = to_i2c_client(dev); |
77 | uint8_t buffer[len + 1]; | 81 | uint8_t buffer[MAX_LEN + 1]; |
78 | 82 | ||
79 | buffer[0] = off; | 83 | buffer[0] = off; |
80 | memcpy(&buffer[1], data, len); | 84 | memcpy(&buffer[1], data, len); |
@@ -110,7 +114,7 @@ static int bq32k_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
110 | tm->tm_year = bcd2bin(regs.years) + | 114 | tm->tm_year = bcd2bin(regs.years) + |
111 | ((regs.cent_hours & BQ32K_CENT) ? 100 : 0); | 115 | ((regs.cent_hours & BQ32K_CENT) ? 100 : 0); |
112 | 116 | ||
113 | return rtc_valid_tm(tm); | 117 | return 0; |
114 | } | 118 | } |
115 | 119 | ||
116 | static int bq32k_rtc_set_time(struct device *dev, struct rtc_time *tm) | 120 | static int bq32k_rtc_set_time(struct device *dev, struct rtc_time *tm) |
diff --git a/drivers/rtc/rtc-brcmstb-waketimer.c b/drivers/rtc/rtc-brcmstb-waketimer.c index 6cee61201c30..bdd6674a1054 100644 --- a/drivers/rtc/rtc-brcmstb-waketimer.c +++ b/drivers/rtc/rtc-brcmstb-waketimer.c | |||
@@ -60,6 +60,9 @@ static void brcmstb_waketmr_set_alarm(struct brcmstb_waketmr *timer, | |||
60 | { | 60 | { |
61 | brcmstb_waketmr_clear_alarm(timer); | 61 | brcmstb_waketmr_clear_alarm(timer); |
62 | 62 | ||
63 | /* Make sure we are actually counting in seconds */ | ||
64 | writel_relaxed(timer->rate, timer->base + BRCMSTB_WKTMR_PRESCALER); | ||
65 | |||
63 | writel_relaxed(secs + 1, timer->base + BRCMSTB_WKTMR_ALARM); | 66 | writel_relaxed(secs + 1, timer->base + BRCMSTB_WKTMR_ALARM); |
64 | } | 67 | } |
65 | 68 | ||
diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index f7c0f72abb56..1b3738a11702 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c | |||
@@ -541,11 +541,10 @@ static const struct rtc_class_ops cmos_rtc_ops = { | |||
541 | 541 | ||
542 | #define NVRAM_OFFSET (RTC_REG_D + 1) | 542 | #define NVRAM_OFFSET (RTC_REG_D + 1) |
543 | 543 | ||
544 | static ssize_t | 544 | static int cmos_nvram_read(void *priv, unsigned int off, void *val, |
545 | cmos_nvram_read(struct file *filp, struct kobject *kobj, | 545 | size_t count) |
546 | struct bin_attribute *attr, | ||
547 | char *buf, loff_t off, size_t count) | ||
548 | { | 546 | { |
547 | unsigned char *buf = val; | ||
549 | int retval; | 548 | int retval; |
550 | 549 | ||
551 | off += NVRAM_OFFSET; | 550 | off += NVRAM_OFFSET; |
@@ -563,16 +562,13 @@ cmos_nvram_read(struct file *filp, struct kobject *kobj, | |||
563 | return retval; | 562 | return retval; |
564 | } | 563 | } |
565 | 564 | ||
566 | static ssize_t | 565 | static int cmos_nvram_write(void *priv, unsigned int off, void *val, |
567 | cmos_nvram_write(struct file *filp, struct kobject *kobj, | 566 | size_t count) |
568 | struct bin_attribute *attr, | ||
569 | char *buf, loff_t off, size_t count) | ||
570 | { | 567 | { |
571 | struct cmos_rtc *cmos; | 568 | struct cmos_rtc *cmos = priv; |
569 | unsigned char *buf = val; | ||
572 | int retval; | 570 | int retval; |
573 | 571 | ||
574 | cmos = dev_get_drvdata(container_of(kobj, struct device, kobj)); | ||
575 | |||
576 | /* NOTE: on at least PCs and Ataris, the boot firmware uses a | 572 | /* NOTE: on at least PCs and Ataris, the boot firmware uses a |
577 | * checksum on part of the NVRAM data. That's currently ignored | 573 | * checksum on part of the NVRAM data. That's currently ignored |
578 | * here. If userspace is smart enough to know what fields of | 574 | * here. If userspace is smart enough to know what fields of |
@@ -598,17 +594,6 @@ cmos_nvram_write(struct file *filp, struct kobject *kobj, | |||
598 | return retval; | 594 | return retval; |
599 | } | 595 | } |
600 | 596 | ||
601 | static struct bin_attribute nvram = { | ||
602 | .attr = { | ||
603 | .name = "nvram", | ||
604 | .mode = S_IRUGO | S_IWUSR, | ||
605 | }, | ||
606 | |||
607 | .read = cmos_nvram_read, | ||
608 | .write = cmos_nvram_write, | ||
609 | /* size gets set up later */ | ||
610 | }; | ||
611 | |||
612 | /*----------------------------------------------------------------*/ | 597 | /*----------------------------------------------------------------*/ |
613 | 598 | ||
614 | static struct cmos_rtc cmos_rtc; | 599 | static struct cmos_rtc cmos_rtc; |
@@ -675,6 +660,14 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq) | |||
675 | unsigned char rtc_control; | 660 | unsigned char rtc_control; |
676 | unsigned address_space; | 661 | unsigned address_space; |
677 | u32 flags = 0; | 662 | u32 flags = 0; |
663 | struct nvmem_config nvmem_cfg = { | ||
664 | .name = "cmos_nvram", | ||
665 | .word_size = 1, | ||
666 | .stride = 1, | ||
667 | .reg_read = cmos_nvram_read, | ||
668 | .reg_write = cmos_nvram_write, | ||
669 | .priv = &cmos_rtc, | ||
670 | }; | ||
678 | 671 | ||
679 | /* there can be only one ... */ | 672 | /* there can be only one ... */ |
680 | if (cmos_rtc.dev) | 673 | if (cmos_rtc.dev) |
@@ -751,8 +744,7 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq) | |||
751 | cmos_rtc.dev = dev; | 744 | cmos_rtc.dev = dev; |
752 | dev_set_drvdata(dev, &cmos_rtc); | 745 | dev_set_drvdata(dev, &cmos_rtc); |
753 | 746 | ||
754 | cmos_rtc.rtc = rtc_device_register(driver_name, dev, | 747 | cmos_rtc.rtc = devm_rtc_allocate_device(dev); |
755 | &cmos_rtc_ops, THIS_MODULE); | ||
756 | if (IS_ERR(cmos_rtc.rtc)) { | 748 | if (IS_ERR(cmos_rtc.rtc)) { |
757 | retval = PTR_ERR(cmos_rtc.rtc); | 749 | retval = PTR_ERR(cmos_rtc.rtc); |
758 | goto cleanup0; | 750 | goto cleanup0; |
@@ -814,22 +806,25 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq) | |||
814 | } | 806 | } |
815 | } | 807 | } |
816 | 808 | ||
817 | /* export at least the first block of NVRAM */ | 809 | cmos_rtc.rtc->ops = &cmos_rtc_ops; |
818 | nvram.size = address_space - NVRAM_OFFSET; | 810 | cmos_rtc.rtc->nvram_old_abi = true; |
819 | retval = sysfs_create_bin_file(&dev->kobj, &nvram); | 811 | retval = rtc_register_device(cmos_rtc.rtc); |
820 | if (retval < 0) { | 812 | if (retval) |
821 | dev_dbg(dev, "can't create nvram file? %d\n", retval); | ||
822 | goto cleanup2; | 813 | goto cleanup2; |
823 | } | ||
824 | 814 | ||
825 | dev_info(dev, "%s%s, %zd bytes nvram%s\n", | 815 | /* export at least the first block of NVRAM */ |
826 | !is_valid_irq(rtc_irq) ? "no alarms" : | 816 | nvmem_cfg.size = address_space - NVRAM_OFFSET; |
827 | cmos_rtc.mon_alrm ? "alarms up to one year" : | 817 | if (rtc_nvmem_register(cmos_rtc.rtc, &nvmem_cfg)) |
828 | cmos_rtc.day_alrm ? "alarms up to one month" : | 818 | dev_err(dev, "nvmem registration failed\n"); |
829 | "alarms up to one day", | 819 | |
830 | cmos_rtc.century ? ", y3k" : "", | 820 | dev_info(dev, "%s%s, %d bytes nvram%s\n", |
831 | nvram.size, | 821 | !is_valid_irq(rtc_irq) ? "no alarms" : |
832 | is_hpet_enabled() ? ", hpet irqs" : ""); | 822 | cmos_rtc.mon_alrm ? "alarms up to one year" : |
823 | cmos_rtc.day_alrm ? "alarms up to one month" : | ||
824 | "alarms up to one day", | ||
825 | cmos_rtc.century ? ", y3k" : "", | ||
826 | nvmem_cfg.size, | ||
827 | is_hpet_enabled() ? ", hpet irqs" : ""); | ||
833 | 828 | ||
834 | return 0; | 829 | return 0; |
835 | 830 | ||
@@ -838,7 +833,6 @@ cleanup2: | |||
838 | free_irq(rtc_irq, cmos_rtc.rtc); | 833 | free_irq(rtc_irq, cmos_rtc.rtc); |
839 | cleanup1: | 834 | cleanup1: |
840 | cmos_rtc.dev = NULL; | 835 | cmos_rtc.dev = NULL; |
841 | rtc_device_unregister(cmos_rtc.rtc); | ||
842 | cleanup0: | 836 | cleanup0: |
843 | if (RTC_IOMAPPED) | 837 | if (RTC_IOMAPPED) |
844 | release_region(ports->start, resource_size(ports)); | 838 | release_region(ports->start, resource_size(ports)); |
@@ -862,14 +856,11 @@ static void cmos_do_remove(struct device *dev) | |||
862 | 856 | ||
863 | cmos_do_shutdown(cmos->irq); | 857 | cmos_do_shutdown(cmos->irq); |
864 | 858 | ||
865 | sysfs_remove_bin_file(&dev->kobj, &nvram); | ||
866 | |||
867 | if (is_valid_irq(cmos->irq)) { | 859 | if (is_valid_irq(cmos->irq)) { |
868 | free_irq(cmos->irq, cmos->rtc); | 860 | free_irq(cmos->irq, cmos->rtc); |
869 | hpet_unregister_irq_handler(cmos_interrupt); | 861 | hpet_unregister_irq_handler(cmos_interrupt); |
870 | } | 862 | } |
871 | 863 | ||
872 | rtc_device_unregister(cmos->rtc); | ||
873 | cmos->rtc = NULL; | 864 | cmos->rtc = NULL; |
874 | 865 | ||
875 | ports = cmos->iomem; | 866 | ports = cmos->iomem; |
@@ -1271,8 +1262,6 @@ MODULE_DEVICE_TABLE(of, of_cmos_match); | |||
1271 | static __init void cmos_of_init(struct platform_device *pdev) | 1262 | static __init void cmos_of_init(struct platform_device *pdev) |
1272 | { | 1263 | { |
1273 | struct device_node *node = pdev->dev.of_node; | 1264 | struct device_node *node = pdev->dev.of_node; |
1274 | struct rtc_time time; | ||
1275 | int ret; | ||
1276 | const __be32 *val; | 1265 | const __be32 *val; |
1277 | 1266 | ||
1278 | if (!node) | 1267 | if (!node) |
@@ -1285,16 +1274,6 @@ static __init void cmos_of_init(struct platform_device *pdev) | |||
1285 | val = of_get_property(node, "freq-reg", NULL); | 1274 | val = of_get_property(node, "freq-reg", NULL); |
1286 | if (val) | 1275 | if (val) |
1287 | CMOS_WRITE(be32_to_cpup(val), RTC_FREQ_SELECT); | 1276 | CMOS_WRITE(be32_to_cpup(val), RTC_FREQ_SELECT); |
1288 | |||
1289 | cmos_read_time(&pdev->dev, &time); | ||
1290 | ret = rtc_valid_tm(&time); | ||
1291 | if (ret) { | ||
1292 | struct rtc_time def_time = { | ||
1293 | .tm_year = 1, | ||
1294 | .tm_mday = 1, | ||
1295 | }; | ||
1296 | cmos_set_time(&pdev->dev, &def_time); | ||
1297 | } | ||
1298 | } | 1277 | } |
1299 | #else | 1278 | #else |
1300 | static inline void cmos_of_init(struct platform_device *pdev) {} | 1279 | static inline void cmos_of_init(struct platform_device *pdev) {} |
diff --git a/drivers/rtc/rtc-coh901331.c b/drivers/rtc/rtc-coh901331.c index cfc4141d99cd..2fc517498a5d 100644 --- a/drivers/rtc/rtc-coh901331.c +++ b/drivers/rtc/rtc-coh901331.c | |||
@@ -82,7 +82,7 @@ static int coh901331_read_time(struct device *dev, struct rtc_time *tm) | |||
82 | if (readl(rtap->virtbase + COH901331_VALID)) { | 82 | if (readl(rtap->virtbase + COH901331_VALID)) { |
83 | rtc_time_to_tm(readl(rtap->virtbase + COH901331_CUR_TIME), tm); | 83 | rtc_time_to_tm(readl(rtap->virtbase + COH901331_CUR_TIME), tm); |
84 | clk_disable(rtap->clk); | 84 | clk_disable(rtap->clk); |
85 | return rtc_valid_tm(tm); | 85 | return 0; |
86 | } | 86 | } |
87 | clk_disable(rtap->clk); | 87 | clk_disable(rtap->clk); |
88 | return -EINVAL; | 88 | return -EINVAL; |
diff --git a/drivers/rtc/rtc-core.h b/drivers/rtc/rtc-core.h index 513b9bedd2c8..0abf98983e13 100644 --- a/drivers/rtc/rtc-core.h +++ b/drivers/rtc/rtc-core.h | |||
@@ -46,11 +46,3 @@ static inline const struct attribute_group **rtc_get_dev_attribute_groups(void) | |||
46 | return NULL; | 46 | return NULL; |
47 | } | 47 | } |
48 | #endif | 48 | #endif |
49 | |||
50 | #ifdef CONFIG_RTC_NVMEM | ||
51 | void rtc_nvmem_register(struct rtc_device *rtc); | ||
52 | void rtc_nvmem_unregister(struct rtc_device *rtc); | ||
53 | #else | ||
54 | static inline void rtc_nvmem_register(struct rtc_device *rtc) {} | ||
55 | static inline void rtc_nvmem_unregister(struct rtc_device *rtc) {} | ||
56 | #endif | ||
diff --git a/drivers/rtc/rtc-cpcap.c b/drivers/rtc/rtc-cpcap.c index 3a0333e1f21a..a8856f2b9bc2 100644 --- a/drivers/rtc/rtc-cpcap.c +++ b/drivers/rtc/rtc-cpcap.c | |||
@@ -119,7 +119,7 @@ static int cpcap_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
119 | 119 | ||
120 | cpcap2rtc_time(tm, &cpcap_tm); | 120 | cpcap2rtc_time(tm, &cpcap_tm); |
121 | 121 | ||
122 | return rtc_valid_tm(tm); | 122 | return 0; |
123 | } | 123 | } |
124 | 124 | ||
125 | static int cpcap_rtc_set_time(struct device *dev, struct rtc_time *tm) | 125 | static int cpcap_rtc_set_time(struct device *dev, struct rtc_time *tm) |
diff --git a/drivers/rtc/rtc-cros-ec.c b/drivers/rtc/rtc-cros-ec.c index f0ea6899c731..bf7ced095c94 100644 --- a/drivers/rtc/rtc-cros-ec.c +++ b/drivers/rtc/rtc-cros-ec.c | |||
@@ -197,10 +197,10 @@ static int cros_ec_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
197 | cros_ec_rtc->saved_alarm = (u32)alarm_time; | 197 | cros_ec_rtc->saved_alarm = (u32)alarm_time; |
198 | } else { | 198 | } else { |
199 | /* Don't set an alarm in the past. */ | 199 | /* Don't set an alarm in the past. */ |
200 | if ((u32)alarm_time < current_time) | 200 | if ((u32)alarm_time <= current_time) |
201 | alarm_offset = EC_RTC_ALARM_CLEAR; | 201 | return -ETIME; |
202 | else | 202 | |
203 | alarm_offset = (u32)alarm_time - current_time; | 203 | alarm_offset = (u32)alarm_time - current_time; |
204 | } | 204 | } |
205 | 205 | ||
206 | ret = cros_ec_rtc_set(cros_ec, EC_CMD_RTC_SET_ALARM, alarm_offset); | 206 | ret = cros_ec_rtc_set(cros_ec, EC_CMD_RTC_SET_ALARM, alarm_offset); |
diff --git a/drivers/rtc/rtc-da9052.c b/drivers/rtc/rtc-da9052.c index 4273377562ec..03044e1bc497 100644 --- a/drivers/rtc/rtc-da9052.c +++ b/drivers/rtc/rtc-da9052.c | |||
@@ -187,8 +187,7 @@ static int da9052_rtc_read_time(struct device *dev, struct rtc_time *rtc_tm) | |||
187 | rtc_tm->tm_min = v[0][1] & DA9052_RTC_MIN; | 187 | rtc_tm->tm_min = v[0][1] & DA9052_RTC_MIN; |
188 | rtc_tm->tm_sec = v[0][0] & DA9052_RTC_SEC; | 188 | rtc_tm->tm_sec = v[0][0] & DA9052_RTC_SEC; |
189 | 189 | ||
190 | ret = rtc_valid_tm(rtc_tm); | 190 | return 0; |
191 | return ret; | ||
192 | } | 191 | } |
193 | 192 | ||
194 | idx = (1-idx); | 193 | idx = (1-idx); |
diff --git a/drivers/rtc/rtc-da9055.c b/drivers/rtc/rtc-da9055.c index 678af8648c45..e08cd8130c23 100644 --- a/drivers/rtc/rtc-da9055.c +++ b/drivers/rtc/rtc-da9055.c | |||
@@ -158,7 +158,7 @@ static int da9055_rtc_read_time(struct device *dev, struct rtc_time *rtc_tm) | |||
158 | rtc_tm->tm_min = v[1] & DA9055_RTC_MIN; | 158 | rtc_tm->tm_min = v[1] & DA9055_RTC_MIN; |
159 | rtc_tm->tm_sec = v[0] & DA9055_RTC_SEC; | 159 | rtc_tm->tm_sec = v[0] & DA9055_RTC_SEC; |
160 | 160 | ||
161 | return rtc_valid_tm(rtc_tm); | 161 | return 0; |
162 | } | 162 | } |
163 | 163 | ||
164 | static int da9055_rtc_set_time(struct device *dev, struct rtc_time *tm) | 164 | static int da9055_rtc_set_time(struct device *dev, struct rtc_time *tm) |
diff --git a/drivers/rtc/rtc-da9063.c b/drivers/rtc/rtc-da9063.c index f85cae240f12..b4e054c64bad 100644 --- a/drivers/rtc/rtc-da9063.c +++ b/drivers/rtc/rtc-da9063.c | |||
@@ -256,7 +256,7 @@ static int da9063_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
256 | else | 256 | else |
257 | rtc->rtc_sync = false; | 257 | rtc->rtc_sync = false; |
258 | 258 | ||
259 | return rtc_valid_tm(tm); | 259 | return 0; |
260 | } | 260 | } |
261 | 261 | ||
262 | static int da9063_rtc_set_time(struct device *dev, struct rtc_time *tm) | 262 | static int da9063_rtc_set_time(struct device *dev, struct rtc_time *tm) |
diff --git a/drivers/rtc/rtc-ds1216.c b/drivers/rtc/rtc-ds1216.c index 9c82b1da2d45..5f158715fb4c 100644 --- a/drivers/rtc/rtc-ds1216.c +++ b/drivers/rtc/rtc-ds1216.c | |||
@@ -99,7 +99,7 @@ static int ds1216_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
99 | if (tm->tm_year < 70) | 99 | if (tm->tm_year < 70) |
100 | tm->tm_year += 100; | 100 | tm->tm_year += 100; |
101 | 101 | ||
102 | return rtc_valid_tm(tm); | 102 | return 0; |
103 | } | 103 | } |
104 | 104 | ||
105 | static int ds1216_rtc_set_time(struct device *dev, struct rtc_time *tm) | 105 | static int ds1216_rtc_set_time(struct device *dev, struct rtc_time *tm) |
diff --git a/drivers/rtc/rtc-ds1286.c b/drivers/rtc/rtc-ds1286.c index ef75c349dff9..0744916b79c5 100644 --- a/drivers/rtc/rtc-ds1286.c +++ b/drivers/rtc/rtc-ds1286.c | |||
@@ -211,7 +211,7 @@ static int ds1286_read_time(struct device *dev, struct rtc_time *tm) | |||
211 | 211 | ||
212 | tm->tm_mon--; | 212 | tm->tm_mon--; |
213 | 213 | ||
214 | return rtc_valid_tm(tm); | 214 | return 0; |
215 | } | 215 | } |
216 | 216 | ||
217 | static int ds1286_set_time(struct device *dev, struct rtc_time *tm) | 217 | static int ds1286_set_time(struct device *dev, struct rtc_time *tm) |
diff --git a/drivers/rtc/rtc-ds1302.c b/drivers/rtc/rtc-ds1302.c index 0ec4be62322b..2a881150d51c 100644 --- a/drivers/rtc/rtc-ds1302.c +++ b/drivers/rtc/rtc-ds1302.c | |||
@@ -43,7 +43,7 @@ static int ds1302_rtc_set_time(struct device *dev, struct rtc_time *time) | |||
43 | { | 43 | { |
44 | struct spi_device *spi = dev_get_drvdata(dev); | 44 | struct spi_device *spi = dev_get_drvdata(dev); |
45 | u8 buf[1 + RTC_CLCK_LEN]; | 45 | u8 buf[1 + RTC_CLCK_LEN]; |
46 | u8 *bp = buf; | 46 | u8 *bp; |
47 | int status; | 47 | int status; |
48 | 48 | ||
49 | /* Enable writing */ | 49 | /* Enable writing */ |
@@ -98,8 +98,7 @@ static int ds1302_rtc_get_time(struct device *dev, struct rtc_time *time) | |||
98 | time->tm_mon = bcd2bin(buf[RTC_ADDR_MON]) - 1; | 98 | time->tm_mon = bcd2bin(buf[RTC_ADDR_MON]) - 1; |
99 | time->tm_year = bcd2bin(buf[RTC_ADDR_YEAR]) + 100; | 99 | time->tm_year = bcd2bin(buf[RTC_ADDR_YEAR]) + 100; |
100 | 100 | ||
101 | /* Time may not be set */ | 101 | return 0; |
102 | return rtc_valid_tm(time); | ||
103 | } | 102 | } |
104 | 103 | ||
105 | static const struct rtc_class_ops ds1302_rtc_ops = { | 104 | static const struct rtc_class_ops ds1302_rtc_ops = { |
@@ -112,7 +111,7 @@ static int ds1302_probe(struct spi_device *spi) | |||
112 | struct rtc_device *rtc; | 111 | struct rtc_device *rtc; |
113 | u8 addr; | 112 | u8 addr; |
114 | u8 buf[4]; | 113 | u8 buf[4]; |
115 | u8 *bp = buf; | 114 | u8 *bp; |
116 | int status; | 115 | int status; |
117 | 116 | ||
118 | /* Sanity check board setup data. This may be hooked up | 117 | /* Sanity check board setup data. This may be hooked up |
diff --git a/drivers/rtc/rtc-ds1305.c b/drivers/rtc/rtc-ds1305.c index d8df2e9e14ad..2d502fc85698 100644 --- a/drivers/rtc/rtc-ds1305.c +++ b/drivers/rtc/rtc-ds1305.c | |||
@@ -203,8 +203,7 @@ static int ds1305_get_time(struct device *dev, struct rtc_time *time) | |||
203 | time->tm_hour, time->tm_mday, | 203 | time->tm_hour, time->tm_mday, |
204 | time->tm_mon, time->tm_year, time->tm_wday); | 204 | time->tm_mon, time->tm_year, time->tm_wday); |
205 | 205 | ||
206 | /* Time may not be set */ | 206 | return 0; |
207 | return rtc_valid_tm(time); | ||
208 | } | 207 | } |
209 | 208 | ||
210 | static int ds1305_set_time(struct device *dev, struct rtc_time *time) | 209 | static int ds1305_set_time(struct device *dev, struct rtc_time *time) |
@@ -544,15 +543,6 @@ static int ds1305_nvram_write(void *priv, unsigned int off, void *buf, | |||
544 | return spi_sync(spi, &m); | 543 | return spi_sync(spi, &m); |
545 | } | 544 | } |
546 | 545 | ||
547 | static struct nvmem_config ds1305_nvmem_cfg = { | ||
548 | .name = "ds1305_nvram", | ||
549 | .word_size = 1, | ||
550 | .stride = 1, | ||
551 | .size = DS1305_NVRAM_LEN, | ||
552 | .reg_read = ds1305_nvram_read, | ||
553 | .reg_write = ds1305_nvram_write, | ||
554 | }; | ||
555 | |||
556 | /*----------------------------------------------------------------------*/ | 546 | /*----------------------------------------------------------------------*/ |
557 | 547 | ||
558 | /* | 548 | /* |
@@ -566,6 +556,14 @@ static int ds1305_probe(struct spi_device *spi) | |||
566 | u8 addr, value; | 556 | u8 addr, value; |
567 | struct ds1305_platform_data *pdata = dev_get_platdata(&spi->dev); | 557 | struct ds1305_platform_data *pdata = dev_get_platdata(&spi->dev); |
568 | bool write_ctrl = false; | 558 | bool write_ctrl = false; |
559 | struct nvmem_config ds1305_nvmem_cfg = { | ||
560 | .name = "ds1305_nvram", | ||
561 | .word_size = 1, | ||
562 | .stride = 1, | ||
563 | .size = DS1305_NVRAM_LEN, | ||
564 | .reg_read = ds1305_nvram_read, | ||
565 | .reg_write = ds1305_nvram_write, | ||
566 | }; | ||
569 | 567 | ||
570 | /* Sanity check board setup data. This may be hooked up | 568 | /* Sanity check board setup data. This may be hooked up |
571 | * in 3wire mode, but we don't care. Note that unless | 569 | * in 3wire mode, but we don't care. Note that unless |
@@ -703,15 +701,15 @@ static int ds1305_probe(struct spi_device *spi) | |||
703 | ds1305->rtc->ops = &ds1305_ops; | 701 | ds1305->rtc->ops = &ds1305_ops; |
704 | 702 | ||
705 | ds1305_nvmem_cfg.priv = ds1305; | 703 | ds1305_nvmem_cfg.priv = ds1305; |
706 | ds1305->rtc->nvmem_config = &ds1305_nvmem_cfg; | ||
707 | ds1305->rtc->nvram_old_abi = true; | 704 | ds1305->rtc->nvram_old_abi = true; |
708 | |||
709 | status = rtc_register_device(ds1305->rtc); | 705 | status = rtc_register_device(ds1305->rtc); |
710 | if (status) { | 706 | if (status) { |
711 | dev_dbg(&spi->dev, "register rtc --> %d\n", status); | 707 | dev_dbg(&spi->dev, "register rtc --> %d\n", status); |
712 | return status; | 708 | return status; |
713 | } | 709 | } |
714 | 710 | ||
711 | rtc_nvmem_register(ds1305->rtc, &ds1305_nvmem_cfg); | ||
712 | |||
715 | /* Maybe set up alarm IRQ; be ready to handle it triggering right | 713 | /* Maybe set up alarm IRQ; be ready to handle it triggering right |
716 | * away. NOTE that we don't share this. The signal is active low, | 714 | * away. NOTE that we don't share this. The signal is active low, |
717 | * and we can't ack it before a SPI message delay. We temporarily | 715 | * and we can't ack it before a SPI message delay. We temporarily |
diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c index 923dde912f60..a13e59edff53 100644 --- a/drivers/rtc/rtc-ds1307.c +++ b/drivers/rtc/rtc-ds1307.c | |||
@@ -114,7 +114,6 @@ enum ds_type { | |||
114 | # define RX8025_BIT_XST 0x20 | 114 | # define RX8025_BIT_XST 0x20 |
115 | 115 | ||
116 | struct ds1307 { | 116 | struct ds1307 { |
117 | struct nvmem_config nvmem_cfg; | ||
118 | enum ds_type type; | 117 | enum ds_type type; |
119 | unsigned long flags; | 118 | unsigned long flags; |
120 | #define HAS_NVRAM 0 /* bit 0 == sysfs file active */ | 119 | #define HAS_NVRAM 0 /* bit 0 == sysfs file active */ |
@@ -438,8 +437,7 @@ static int ds1307_get_time(struct device *dev, struct rtc_time *t) | |||
438 | t->tm_hour, t->tm_mday, | 437 | t->tm_hour, t->tm_mday, |
439 | t->tm_mon, t->tm_year, t->tm_wday); | 438 | t->tm_mon, t->tm_year, t->tm_wday); |
440 | 439 | ||
441 | /* initial clock setting can be undefined */ | 440 | return 0; |
442 | return rtc_valid_tm(t); | ||
443 | } | 441 | } |
444 | 442 | ||
445 | static int ds1307_set_time(struct device *dev, struct rtc_time *t) | 443 | static int ds1307_set_time(struct device *dev, struct rtc_time *t) |
@@ -1696,24 +1694,26 @@ read_rtc: | |||
1696 | } | 1694 | } |
1697 | } | 1695 | } |
1698 | 1696 | ||
1699 | if (chip->nvram_size) { | ||
1700 | ds1307->nvmem_cfg.name = "ds1307_nvram"; | ||
1701 | ds1307->nvmem_cfg.word_size = 1; | ||
1702 | ds1307->nvmem_cfg.stride = 1; | ||
1703 | ds1307->nvmem_cfg.size = chip->nvram_size; | ||
1704 | ds1307->nvmem_cfg.reg_read = ds1307_nvram_read; | ||
1705 | ds1307->nvmem_cfg.reg_write = ds1307_nvram_write; | ||
1706 | ds1307->nvmem_cfg.priv = ds1307; | ||
1707 | |||
1708 | ds1307->rtc->nvmem_config = &ds1307->nvmem_cfg; | ||
1709 | ds1307->rtc->nvram_old_abi = true; | ||
1710 | } | ||
1711 | |||
1712 | ds1307->rtc->ops = chip->rtc_ops ?: &ds13xx_rtc_ops; | 1697 | ds1307->rtc->ops = chip->rtc_ops ?: &ds13xx_rtc_ops; |
1713 | err = rtc_register_device(ds1307->rtc); | 1698 | err = rtc_register_device(ds1307->rtc); |
1714 | if (err) | 1699 | if (err) |
1715 | return err; | 1700 | return err; |
1716 | 1701 | ||
1702 | if (chip->nvram_size) { | ||
1703 | struct nvmem_config nvmem_cfg = { | ||
1704 | .name = "ds1307_nvram", | ||
1705 | .word_size = 1, | ||
1706 | .stride = 1, | ||
1707 | .size = chip->nvram_size, | ||
1708 | .reg_read = ds1307_nvram_read, | ||
1709 | .reg_write = ds1307_nvram_write, | ||
1710 | .priv = ds1307, | ||
1711 | }; | ||
1712 | |||
1713 | ds1307->rtc->nvram_old_abi = true; | ||
1714 | rtc_nvmem_register(ds1307->rtc, &nvmem_cfg); | ||
1715 | } | ||
1716 | |||
1717 | ds1307_hwmon_register(ds1307); | 1717 | ds1307_hwmon_register(ds1307); |
1718 | ds1307_clks_register(ds1307); | 1718 | ds1307_clks_register(ds1307); |
1719 | 1719 | ||
diff --git a/drivers/rtc/rtc-ds1343.c b/drivers/rtc/rtc-ds1343.c index 895fbeeb47fe..5208da4cf94a 100644 --- a/drivers/rtc/rtc-ds1343.c +++ b/drivers/rtc/rtc-ds1343.c | |||
@@ -153,120 +153,22 @@ static ssize_t ds1343_store_glitchfilter(struct device *dev, | |||
153 | static DEVICE_ATTR(glitch_filter, S_IRUGO | S_IWUSR, ds1343_show_glitchfilter, | 153 | static DEVICE_ATTR(glitch_filter, S_IRUGO | S_IWUSR, ds1343_show_glitchfilter, |
154 | ds1343_store_glitchfilter); | 154 | ds1343_store_glitchfilter); |
155 | 155 | ||
156 | static ssize_t ds1343_nvram_write(struct file *filp, struct kobject *kobj, | 156 | static int ds1343_nvram_write(void *priv, unsigned int off, void *val, |
157 | struct bin_attribute *attr, | 157 | size_t bytes) |
158 | char *buf, loff_t off, size_t count) | ||
159 | { | 158 | { |
160 | int ret; | 159 | struct ds1343_priv *ds1343 = priv; |
161 | unsigned char address; | ||
162 | struct device *dev = kobj_to_dev(kobj); | ||
163 | struct ds1343_priv *priv = dev_get_drvdata(dev); | ||
164 | |||
165 | address = DS1343_NVRAM + off; | ||
166 | |||
167 | ret = regmap_bulk_write(priv->map, address, buf, count); | ||
168 | if (ret < 0) | ||
169 | dev_err(&priv->spi->dev, "Error in nvram write %d", ret); | ||
170 | 160 | ||
171 | return (ret < 0) ? ret : count; | 161 | return regmap_bulk_write(ds1343->map, DS1343_NVRAM + off, val, bytes); |
172 | } | 162 | } |
173 | 163 | ||
174 | 164 | static int ds1343_nvram_read(void *priv, unsigned int off, void *val, | |
175 | static ssize_t ds1343_nvram_read(struct file *filp, struct kobject *kobj, | 165 | size_t bytes) |
176 | struct bin_attribute *attr, | ||
177 | char *buf, loff_t off, size_t count) | ||
178 | { | 166 | { |
179 | int ret; | 167 | struct ds1343_priv *ds1343 = priv; |
180 | unsigned char address; | ||
181 | struct device *dev = kobj_to_dev(kobj); | ||
182 | struct ds1343_priv *priv = dev_get_drvdata(dev); | ||
183 | 168 | ||
184 | address = DS1343_NVRAM + off; | 169 | return regmap_bulk_read(ds1343->map, DS1343_NVRAM + off, val, bytes); |
185 | |||
186 | ret = regmap_bulk_read(priv->map, address, buf, count); | ||
187 | if (ret < 0) | ||
188 | dev_err(&priv->spi->dev, "Error in nvram read %d\n", ret); | ||
189 | |||
190 | return (ret < 0) ? ret : count; | ||
191 | } | 170 | } |
192 | 171 | ||
193 | |||
194 | static struct bin_attribute nvram_attr = { | ||
195 | .attr.name = "nvram", | ||
196 | .attr.mode = S_IRUGO | S_IWUSR, | ||
197 | .read = ds1343_nvram_read, | ||
198 | .write = ds1343_nvram_write, | ||
199 | .size = DS1343_NVRAM_LEN, | ||
200 | }; | ||
201 | |||
202 | static ssize_t ds1343_show_alarmstatus(struct device *dev, | ||
203 | struct device_attribute *attr, char *buf) | ||
204 | { | ||
205 | struct ds1343_priv *priv = dev_get_drvdata(dev); | ||
206 | int alarmstatus, data; | ||
207 | |||
208 | regmap_read(priv->map, DS1343_CONTROL_REG, &data); | ||
209 | |||
210 | alarmstatus = !!(data & DS1343_A0IE); | ||
211 | |||
212 | if (alarmstatus) | ||
213 | return sprintf(buf, "enabled\n"); | ||
214 | else | ||
215 | return sprintf(buf, "disabled\n"); | ||
216 | } | ||
217 | |||
218 | static DEVICE_ATTR(alarm_status, S_IRUGO, ds1343_show_alarmstatus, NULL); | ||
219 | |||
220 | static ssize_t ds1343_show_alarmmode(struct device *dev, | ||
221 | struct device_attribute *attr, char *buf) | ||
222 | { | ||
223 | struct ds1343_priv *priv = dev_get_drvdata(dev); | ||
224 | int alarm_mode, data; | ||
225 | char *alarm_str; | ||
226 | |||
227 | regmap_read(priv->map, DS1343_ALM0_SEC_REG, &data); | ||
228 | alarm_mode = (data & 0x80) >> 4; | ||
229 | |||
230 | regmap_read(priv->map, DS1343_ALM0_MIN_REG, &data); | ||
231 | alarm_mode |= (data & 0x80) >> 5; | ||
232 | |||
233 | regmap_read(priv->map, DS1343_ALM0_HOUR_REG, &data); | ||
234 | alarm_mode |= (data & 0x80) >> 6; | ||
235 | |||
236 | regmap_read(priv->map, DS1343_ALM0_DAY_REG, &data); | ||
237 | alarm_mode |= (data & 0x80) >> 7; | ||
238 | |||
239 | switch (alarm_mode) { | ||
240 | case 15: | ||
241 | alarm_str = "each second"; | ||
242 | break; | ||
243 | |||
244 | case 7: | ||
245 | alarm_str = "seconds match"; | ||
246 | break; | ||
247 | |||
248 | case 3: | ||
249 | alarm_str = "minutes and seconds match"; | ||
250 | break; | ||
251 | |||
252 | case 1: | ||
253 | alarm_str = "hours, minutes and seconds match"; | ||
254 | break; | ||
255 | |||
256 | case 0: | ||
257 | alarm_str = "day, hours, minutes and seconds match"; | ||
258 | break; | ||
259 | |||
260 | default: | ||
261 | alarm_str = "invalid"; | ||
262 | break; | ||
263 | } | ||
264 | |||
265 | return sprintf(buf, "%s\n", alarm_str); | ||
266 | } | ||
267 | |||
268 | static DEVICE_ATTR(alarm_mode, S_IRUGO, ds1343_show_alarmmode, NULL); | ||
269 | |||
270 | static ssize_t ds1343_show_tricklecharger(struct device *dev, | 172 | static ssize_t ds1343_show_tricklecharger(struct device *dev, |
271 | struct device_attribute *attr, char *buf) | 173 | struct device_attribute *attr, char *buf) |
272 | { | 174 | { |
@@ -313,7 +215,6 @@ static DEVICE_ATTR(trickle_charger, S_IRUGO, ds1343_show_tricklecharger, NULL); | |||
313 | 215 | ||
314 | static int ds1343_sysfs_register(struct device *dev) | 216 | static int ds1343_sysfs_register(struct device *dev) |
315 | { | 217 | { |
316 | struct ds1343_priv *priv = dev_get_drvdata(dev); | ||
317 | int err; | 218 | int err; |
318 | 219 | ||
319 | err = device_create_file(dev, &dev_attr_glitch_filter); | 220 | err = device_create_file(dev, &dev_attr_glitch_filter); |
@@ -321,33 +222,9 @@ static int ds1343_sysfs_register(struct device *dev) | |||
321 | return err; | 222 | return err; |
322 | 223 | ||
323 | err = device_create_file(dev, &dev_attr_trickle_charger); | 224 | err = device_create_file(dev, &dev_attr_trickle_charger); |
324 | if (err) | ||
325 | goto error1; | ||
326 | |||
327 | err = device_create_bin_file(dev, &nvram_attr); | ||
328 | if (err) | ||
329 | goto error2; | ||
330 | |||
331 | if (priv->irq <= 0) | ||
332 | return err; | ||
333 | |||
334 | err = device_create_file(dev, &dev_attr_alarm_mode); | ||
335 | if (err) | ||
336 | goto error3; | ||
337 | |||
338 | err = device_create_file(dev, &dev_attr_alarm_status); | ||
339 | if (!err) | 225 | if (!err) |
340 | return err; | 226 | return 0; |
341 | 227 | ||
342 | device_remove_file(dev, &dev_attr_alarm_mode); | ||
343 | |||
344 | error3: | ||
345 | device_remove_bin_file(dev, &nvram_attr); | ||
346 | |||
347 | error2: | ||
348 | device_remove_file(dev, &dev_attr_trickle_charger); | ||
349 | |||
350 | error1: | ||
351 | device_remove_file(dev, &dev_attr_glitch_filter); | 228 | device_remove_file(dev, &dev_attr_glitch_filter); |
352 | 229 | ||
353 | return err; | 230 | return err; |
@@ -355,17 +232,8 @@ error1: | |||
355 | 232 | ||
356 | static void ds1343_sysfs_unregister(struct device *dev) | 233 | static void ds1343_sysfs_unregister(struct device *dev) |
357 | { | 234 | { |
358 | struct ds1343_priv *priv = dev_get_drvdata(dev); | ||
359 | |||
360 | device_remove_file(dev, &dev_attr_glitch_filter); | 235 | device_remove_file(dev, &dev_attr_glitch_filter); |
361 | device_remove_file(dev, &dev_attr_trickle_charger); | 236 | device_remove_file(dev, &dev_attr_trickle_charger); |
362 | device_remove_bin_file(dev, &nvram_attr); | ||
363 | |||
364 | if (priv->irq <= 0) | ||
365 | return; | ||
366 | |||
367 | device_remove_file(dev, &dev_attr_alarm_status); | ||
368 | device_remove_file(dev, &dev_attr_alarm_mode); | ||
369 | } | 237 | } |
370 | 238 | ||
371 | static int ds1343_read_time(struct device *dev, struct rtc_time *dt) | 239 | static int ds1343_read_time(struct device *dev, struct rtc_time *dt) |
@@ -386,7 +254,7 @@ static int ds1343_read_time(struct device *dev, struct rtc_time *dt) | |||
386 | dt->tm_mon = bcd2bin(buf[5] & 0x1F) - 1; | 254 | dt->tm_mon = bcd2bin(buf[5] & 0x1F) - 1; |
387 | dt->tm_year = bcd2bin(buf[6]) + 100; /* year offset from 1900 */ | 255 | dt->tm_year = bcd2bin(buf[6]) + 100; /* year offset from 1900 */ |
388 | 256 | ||
389 | return rtc_valid_tm(dt); | 257 | return 0; |
390 | } | 258 | } |
391 | 259 | ||
392 | static int ds1343_set_time(struct device *dev, struct rtc_time *dt) | 260 | static int ds1343_set_time(struct device *dev, struct rtc_time *dt) |
@@ -599,14 +467,18 @@ static const struct rtc_class_ops ds1343_rtc_ops = { | |||
599 | static int ds1343_probe(struct spi_device *spi) | 467 | static int ds1343_probe(struct spi_device *spi) |
600 | { | 468 | { |
601 | struct ds1343_priv *priv; | 469 | struct ds1343_priv *priv; |
602 | struct regmap_config config; | 470 | struct regmap_config config = { .reg_bits = 8, .val_bits = 8, |
471 | .write_flag_mask = 0x80, }; | ||
603 | unsigned int data; | 472 | unsigned int data; |
604 | int res; | 473 | int res; |
605 | 474 | struct nvmem_config nvmem_cfg = { | |
606 | memset(&config, 0, sizeof(config)); | 475 | .name = "ds1343-", |
607 | config.reg_bits = 8; | 476 | .word_size = 1, |
608 | config.val_bits = 8; | 477 | .stride = 1, |
609 | config.write_flag_mask = 0x80; | 478 | .size = DS1343_NVRAM_LEN, |
479 | .reg_read = ds1343_nvram_read, | ||
480 | .reg_write = ds1343_nvram_write, | ||
481 | }; | ||
610 | 482 | ||
611 | priv = devm_kzalloc(&spi->dev, sizeof(struct ds1343_priv), GFP_KERNEL); | 483 | priv = devm_kzalloc(&spi->dev, sizeof(struct ds1343_priv), GFP_KERNEL); |
612 | if (!priv) | 484 | if (!priv) |
@@ -646,12 +518,19 @@ static int ds1343_probe(struct spi_device *spi) | |||
646 | data &= ~(DS1343_OSF | DS1343_IRQF1 | DS1343_IRQF0); | 518 | data &= ~(DS1343_OSF | DS1343_IRQF1 | DS1343_IRQF0); |
647 | regmap_write(priv->map, DS1343_STATUS_REG, data); | 519 | regmap_write(priv->map, DS1343_STATUS_REG, data); |
648 | 520 | ||
649 | priv->rtc = devm_rtc_device_register(&spi->dev, "ds1343", | 521 | priv->rtc = devm_rtc_allocate_device(&spi->dev); |
650 | &ds1343_rtc_ops, THIS_MODULE); | 522 | if (IS_ERR(priv->rtc)) |
651 | if (IS_ERR(priv->rtc)) { | ||
652 | dev_err(&spi->dev, "unable to register rtc ds1343\n"); | ||
653 | return PTR_ERR(priv->rtc); | 523 | return PTR_ERR(priv->rtc); |
654 | } | 524 | |
525 | priv->rtc->nvram_old_abi = true; | ||
526 | priv->rtc->ops = &ds1343_rtc_ops; | ||
527 | |||
528 | res = rtc_register_device(priv->rtc); | ||
529 | if (res) | ||
530 | return res; | ||
531 | |||
532 | nvmem_cfg.priv = priv; | ||
533 | rtc_nvmem_register(priv->rtc, &nvmem_cfg); | ||
655 | 534 | ||
656 | priv->irq = spi->irq; | 535 | priv->irq = spi->irq; |
657 | 536 | ||
diff --git a/drivers/rtc/rtc-ds1347.c b/drivers/rtc/rtc-ds1347.c index ccfc9d43eb1e..938512c676ee 100644 --- a/drivers/rtc/rtc-ds1347.c +++ b/drivers/rtc/rtc-ds1347.c | |||
@@ -66,7 +66,7 @@ static int ds1347_read_time(struct device *dev, struct rtc_time *dt) | |||
66 | dt->tm_wday = bcd2bin(buf[5]) - 1; | 66 | dt->tm_wday = bcd2bin(buf[5]) - 1; |
67 | dt->tm_year = bcd2bin(buf[6]) + 100; | 67 | dt->tm_year = bcd2bin(buf[6]) + 100; |
68 | 68 | ||
69 | return rtc_valid_tm(dt); | 69 | return 0; |
70 | } | 70 | } |
71 | 71 | ||
72 | static int ds1347_set_time(struct device *dev, struct rtc_time *dt) | 72 | static int ds1347_set_time(struct device *dev, struct rtc_time *dt) |
diff --git a/drivers/rtc/rtc-ds1390.c b/drivers/rtc/rtc-ds1390.c index 4d5b007d7fc6..3b095401f848 100644 --- a/drivers/rtc/rtc-ds1390.c +++ b/drivers/rtc/rtc-ds1390.c | |||
@@ -153,7 +153,7 @@ static int ds1390_read_time(struct device *dev, struct rtc_time *dt) | |||
153 | /* adjust for century bit */ | 153 | /* adjust for century bit */ |
154 | dt->tm_year = bcd2bin(chip->txrx_buf[6]) + ((chip->txrx_buf[5] & 0x80) ? 100 : 0); | 154 | dt->tm_year = bcd2bin(chip->txrx_buf[6]) + ((chip->txrx_buf[5] & 0x80) ? 100 : 0); |
155 | 155 | ||
156 | return rtc_valid_tm(dt); | 156 | return 0; |
157 | } | 157 | } |
158 | 158 | ||
159 | static int ds1390_set_time(struct device *dev, struct rtc_time *dt) | 159 | static int ds1390_set_time(struct device *dev, struct rtc_time *dt) |
diff --git a/drivers/rtc/rtc-ds1511.c b/drivers/rtc/rtc-ds1511.c index 1e95312a6f2e..a7d5ca428d68 100644 --- a/drivers/rtc/rtc-ds1511.c +++ b/drivers/rtc/rtc-ds1511.c | |||
@@ -277,10 +277,6 @@ static int ds1511_rtc_read_time(struct device *dev, struct rtc_time *rtc_tm) | |||
277 | 277 | ||
278 | rtc_tm->tm_mon--; | 278 | rtc_tm->tm_mon--; |
279 | 279 | ||
280 | if (rtc_valid_tm(rtc_tm) < 0) { | ||
281 | dev_err(dev, "retrieved date/time is not valid.\n"); | ||
282 | rtc_time_to_tm(0, rtc_tm); | ||
283 | } | ||
284 | return 0; | 280 | return 0; |
285 | } | 281 | } |
286 | 282 | ||
@@ -422,20 +418,20 @@ static int ds1511_nvram_write(void *priv, unsigned int pos, void *buf, | |||
422 | return 0; | 418 | return 0; |
423 | } | 419 | } |
424 | 420 | ||
425 | static struct nvmem_config ds1511_nvmem_cfg = { | ||
426 | .name = "ds1511_nvram", | ||
427 | .word_size = 1, | ||
428 | .stride = 1, | ||
429 | .size = DS1511_RAM_MAX, | ||
430 | .reg_read = ds1511_nvram_read, | ||
431 | .reg_write = ds1511_nvram_write, | ||
432 | }; | ||
433 | |||
434 | static int ds1511_rtc_probe(struct platform_device *pdev) | 421 | static int ds1511_rtc_probe(struct platform_device *pdev) |
435 | { | 422 | { |
436 | struct resource *res; | 423 | struct resource *res; |
437 | struct rtc_plat_data *pdata; | 424 | struct rtc_plat_data *pdata; |
438 | int ret = 0; | 425 | int ret = 0; |
426 | struct nvmem_config ds1511_nvmem_cfg = { | ||
427 | .name = "ds1511_nvram", | ||
428 | .word_size = 1, | ||
429 | .stride = 1, | ||
430 | .size = DS1511_RAM_MAX, | ||
431 | .reg_read = ds1511_nvram_read, | ||
432 | .reg_write = ds1511_nvram_write, | ||
433 | .priv = &pdev->dev, | ||
434 | }; | ||
439 | 435 | ||
440 | pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); | 436 | pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); |
441 | if (!pdata) | 437 | if (!pdata) |
@@ -478,14 +474,14 @@ static int ds1511_rtc_probe(struct platform_device *pdev) | |||
478 | 474 | ||
479 | pdata->rtc->ops = &ds1511_rtc_ops; | 475 | pdata->rtc->ops = &ds1511_rtc_ops; |
480 | 476 | ||
481 | ds1511_nvmem_cfg.priv = &pdev->dev; | ||
482 | pdata->rtc->nvmem_config = &ds1511_nvmem_cfg; | ||
483 | pdata->rtc->nvram_old_abi = true; | 477 | pdata->rtc->nvram_old_abi = true; |
484 | 478 | ||
485 | ret = rtc_register_device(pdata->rtc); | 479 | ret = rtc_register_device(pdata->rtc); |
486 | if (ret) | 480 | if (ret) |
487 | return ret; | 481 | return ret; |
488 | 482 | ||
483 | rtc_nvmem_register(pdata->rtc, &ds1511_nvmem_cfg); | ||
484 | |||
489 | /* | 485 | /* |
490 | * if the platform has an interrupt in mind for this device, | 486 | * if the platform has an interrupt in mind for this device, |
491 | * then by all means, set it | 487 | * then by all means, set it |
diff --git a/drivers/rtc/rtc-ds1553.c b/drivers/rtc/rtc-ds1553.c index 9961ec646fd2..2441b9a2b366 100644 --- a/drivers/rtc/rtc-ds1553.c +++ b/drivers/rtc/rtc-ds1553.c | |||
@@ -127,10 +127,6 @@ static int ds1553_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
127 | /* year is 1900 + tm->tm_year */ | 127 | /* year is 1900 + tm->tm_year */ |
128 | tm->tm_year = bcd2bin(year) + bcd2bin(century) * 100 - 1900; | 128 | tm->tm_year = bcd2bin(year) + bcd2bin(century) * 100 - 1900; |
129 | 129 | ||
130 | if (rtc_valid_tm(tm) < 0) { | ||
131 | dev_err(dev, "retrieved date/time is not valid.\n"); | ||
132 | rtc_time_to_tm(0, tm); | ||
133 | } | ||
134 | return 0; | 130 | return 0; |
135 | } | 131 | } |
136 | 132 | ||
@@ -233,46 +229,32 @@ static const struct rtc_class_ops ds1553_rtc_ops = { | |||
233 | .alarm_irq_enable = ds1553_rtc_alarm_irq_enable, | 229 | .alarm_irq_enable = ds1553_rtc_alarm_irq_enable, |
234 | }; | 230 | }; |
235 | 231 | ||
236 | static ssize_t ds1553_nvram_read(struct file *filp, struct kobject *kobj, | 232 | static int ds1553_nvram_read(void *priv, unsigned int pos, void *val, |
237 | struct bin_attribute *bin_attr, | 233 | size_t bytes) |
238 | char *buf, loff_t pos, size_t size) | ||
239 | { | 234 | { |
240 | struct device *dev = container_of(kobj, struct device, kobj); | 235 | struct platform_device *pdev = priv; |
241 | struct platform_device *pdev = to_platform_device(dev); | ||
242 | struct rtc_plat_data *pdata = platform_get_drvdata(pdev); | 236 | struct rtc_plat_data *pdata = platform_get_drvdata(pdev); |
243 | void __iomem *ioaddr = pdata->ioaddr; | 237 | void __iomem *ioaddr = pdata->ioaddr; |
244 | ssize_t count; | 238 | u8 *buf = val; |
245 | 239 | ||
246 | for (count = 0; count < size; count++) | 240 | for (; bytes; bytes--) |
247 | *buf++ = readb(ioaddr + pos++); | 241 | *buf++ = readb(ioaddr + pos++); |
248 | return count; | 242 | return 0; |
249 | } | 243 | } |
250 | 244 | ||
251 | static ssize_t ds1553_nvram_write(struct file *filp, struct kobject *kobj, | 245 | static int ds1553_nvram_write(void *priv, unsigned int pos, void *val, |
252 | struct bin_attribute *bin_attr, | 246 | size_t bytes) |
253 | char *buf, loff_t pos, size_t size) | ||
254 | { | 247 | { |
255 | struct device *dev = container_of(kobj, struct device, kobj); | 248 | struct platform_device *pdev = priv; |
256 | struct platform_device *pdev = to_platform_device(dev); | ||
257 | struct rtc_plat_data *pdata = platform_get_drvdata(pdev); | 249 | struct rtc_plat_data *pdata = platform_get_drvdata(pdev); |
258 | void __iomem *ioaddr = pdata->ioaddr; | 250 | void __iomem *ioaddr = pdata->ioaddr; |
259 | ssize_t count; | 251 | u8 *buf = val; |
260 | 252 | ||
261 | for (count = 0; count < size; count++) | 253 | for (; bytes; bytes--) |
262 | writeb(*buf++, ioaddr + pos++); | 254 | writeb(*buf++, ioaddr + pos++); |
263 | return count; | 255 | return 0; |
264 | } | 256 | } |
265 | 257 | ||
266 | static struct bin_attribute ds1553_nvram_attr = { | ||
267 | .attr = { | ||
268 | .name = "nvram", | ||
269 | .mode = S_IRUGO | S_IWUSR, | ||
270 | }, | ||
271 | .size = RTC_OFFSET, | ||
272 | .read = ds1553_nvram_read, | ||
273 | .write = ds1553_nvram_write, | ||
274 | }; | ||
275 | |||
276 | static int ds1553_rtc_probe(struct platform_device *pdev) | 258 | static int ds1553_rtc_probe(struct platform_device *pdev) |
277 | { | 259 | { |
278 | struct resource *res; | 260 | struct resource *res; |
@@ -280,6 +262,15 @@ static int ds1553_rtc_probe(struct platform_device *pdev) | |||
280 | struct rtc_plat_data *pdata; | 262 | struct rtc_plat_data *pdata; |
281 | void __iomem *ioaddr; | 263 | void __iomem *ioaddr; |
282 | int ret = 0; | 264 | int ret = 0; |
265 | struct nvmem_config nvmem_cfg = { | ||
266 | .name = "ds1553_nvram", | ||
267 | .word_size = 1, | ||
268 | .stride = 1, | ||
269 | .size = RTC_OFFSET, | ||
270 | .reg_read = ds1553_nvram_read, | ||
271 | .reg_write = ds1553_nvram_write, | ||
272 | .priv = pdev, | ||
273 | }; | ||
283 | 274 | ||
284 | pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); | 275 | pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); |
285 | if (!pdata) | 276 | if (!pdata) |
@@ -308,11 +299,17 @@ static int ds1553_rtc_probe(struct platform_device *pdev) | |||
308 | pdata->last_jiffies = jiffies; | 299 | pdata->last_jiffies = jiffies; |
309 | platform_set_drvdata(pdev, pdata); | 300 | platform_set_drvdata(pdev, pdata); |
310 | 301 | ||
311 | pdata->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, | 302 | pdata->rtc = devm_rtc_allocate_device(&pdev->dev); |
312 | &ds1553_rtc_ops, THIS_MODULE); | ||
313 | if (IS_ERR(pdata->rtc)) | 303 | if (IS_ERR(pdata->rtc)) |
314 | return PTR_ERR(pdata->rtc); | 304 | return PTR_ERR(pdata->rtc); |
315 | 305 | ||
306 | pdata->rtc->ops = &ds1553_rtc_ops; | ||
307 | pdata->rtc->nvram_old_abi = true; | ||
308 | |||
309 | ret = rtc_register_device(pdata->rtc); | ||
310 | if (ret) | ||
311 | return ret; | ||
312 | |||
316 | if (pdata->irq > 0) { | 313 | if (pdata->irq > 0) { |
317 | writeb(0, ioaddr + RTC_INTERRUPTS); | 314 | writeb(0, ioaddr + RTC_INTERRUPTS); |
318 | if (devm_request_irq(&pdev->dev, pdata->irq, | 315 | if (devm_request_irq(&pdev->dev, pdata->irq, |
@@ -323,21 +320,9 @@ static int ds1553_rtc_probe(struct platform_device *pdev) | |||
323 | } | 320 | } |
324 | } | 321 | } |
325 | 322 | ||
326 | ret = sysfs_create_bin_file(&pdev->dev.kobj, &ds1553_nvram_attr); | 323 | if (rtc_nvmem_register(pdata->rtc, &nvmem_cfg)) |
327 | if (ret) | 324 | dev_err(&pdev->dev, "unable to register nvmem\n"); |
328 | dev_err(&pdev->dev, "unable to create sysfs file: %s\n", | ||
329 | ds1553_nvram_attr.attr.name); | ||
330 | |||
331 | return 0; | ||
332 | } | ||
333 | |||
334 | static int ds1553_rtc_remove(struct platform_device *pdev) | ||
335 | { | ||
336 | struct rtc_plat_data *pdata = platform_get_drvdata(pdev); | ||
337 | 325 | ||
338 | sysfs_remove_bin_file(&pdev->dev.kobj, &ds1553_nvram_attr); | ||
339 | if (pdata->irq > 0) | ||
340 | writeb(0, pdata->ioaddr + RTC_INTERRUPTS); | ||
341 | return 0; | 326 | return 0; |
342 | } | 327 | } |
343 | 328 | ||
@@ -346,7 +331,6 @@ MODULE_ALIAS("platform:rtc-ds1553"); | |||
346 | 331 | ||
347 | static struct platform_driver ds1553_rtc_driver = { | 332 | static struct platform_driver ds1553_rtc_driver = { |
348 | .probe = ds1553_rtc_probe, | 333 | .probe = ds1553_rtc_probe, |
349 | .remove = ds1553_rtc_remove, | ||
350 | .driver = { | 334 | .driver = { |
351 | .name = "rtc-ds1553", | 335 | .name = "rtc-ds1553", |
352 | }, | 336 | }, |
diff --git a/drivers/rtc/rtc-ds1685.c b/drivers/rtc/rtc-ds1685.c index ed43b4311660..1a39829d2b40 100644 --- a/drivers/rtc/rtc-ds1685.c +++ b/drivers/rtc/rtc-ds1685.c | |||
@@ -306,7 +306,7 @@ ds1685_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
306 | tm->tm_yday = rtc_year_days(tm->tm_mday, tm->tm_mon, tm->tm_year); | 306 | tm->tm_yday = rtc_year_days(tm->tm_mday, tm->tm_mon, tm->tm_year); |
307 | tm->tm_isdst = 0; /* RTC has hardcoded timezone, so don't use. */ | 307 | tm->tm_isdst = 0; /* RTC has hardcoded timezone, so don't use. */ |
308 | 308 | ||
309 | return rtc_valid_tm(tm); | 309 | return 0; |
310 | } | 310 | } |
311 | 311 | ||
312 | /** | 312 | /** |
diff --git a/drivers/rtc/rtc-ds1742.c b/drivers/rtc/rtc-ds1742.c index 3abf1cbfb8ce..2d781180e968 100644 --- a/drivers/rtc/rtc-ds1742.c +++ b/drivers/rtc/rtc-ds1742.c | |||
@@ -53,9 +53,7 @@ | |||
53 | struct rtc_plat_data { | 53 | struct rtc_plat_data { |
54 | void __iomem *ioaddr_nvram; | 54 | void __iomem *ioaddr_nvram; |
55 | void __iomem *ioaddr_rtc; | 55 | void __iomem *ioaddr_rtc; |
56 | size_t size_nvram; | ||
57 | unsigned long last_jiffies; | 56 | unsigned long last_jiffies; |
58 | struct bin_attribute nvram_attr; | ||
59 | }; | 57 | }; |
60 | 58 | ||
61 | static int ds1742_rtc_set_time(struct device *dev, struct rtc_time *tm) | 59 | static int ds1742_rtc_set_time(struct device *dev, struct rtc_time *tm) |
@@ -114,7 +112,7 @@ static int ds1742_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
114 | /* year is 1900 + tm->tm_year */ | 112 | /* year is 1900 + tm->tm_year */ |
115 | tm->tm_year = bcd2bin(year) + bcd2bin(century) * 100 - 1900; | 113 | tm->tm_year = bcd2bin(year) + bcd2bin(century) * 100 - 1900; |
116 | 114 | ||
117 | return rtc_valid_tm(tm); | 115 | return 0; |
118 | } | 116 | } |
119 | 117 | ||
120 | static const struct rtc_class_ops ds1742_rtc_ops = { | 118 | static const struct rtc_class_ops ds1742_rtc_ops = { |
@@ -122,34 +120,28 @@ static const struct rtc_class_ops ds1742_rtc_ops = { | |||
122 | .set_time = ds1742_rtc_set_time, | 120 | .set_time = ds1742_rtc_set_time, |
123 | }; | 121 | }; |
124 | 122 | ||
125 | static ssize_t ds1742_nvram_read(struct file *filp, struct kobject *kobj, | 123 | static int ds1742_nvram_read(void *priv, unsigned int pos, void *val, |
126 | struct bin_attribute *bin_attr, | 124 | size_t bytes) |
127 | char *buf, loff_t pos, size_t size) | ||
128 | { | 125 | { |
129 | struct device *dev = container_of(kobj, struct device, kobj); | 126 | struct rtc_plat_data *pdata = priv; |
130 | struct platform_device *pdev = to_platform_device(dev); | ||
131 | struct rtc_plat_data *pdata = platform_get_drvdata(pdev); | ||
132 | void __iomem *ioaddr = pdata->ioaddr_nvram; | 127 | void __iomem *ioaddr = pdata->ioaddr_nvram; |
133 | ssize_t count; | 128 | u8 *buf = val; |
134 | 129 | ||
135 | for (count = 0; count < size; count++) | 130 | for (; bytes; bytes--) |
136 | *buf++ = readb(ioaddr + pos++); | 131 | *buf++ = readb(ioaddr + pos++); |
137 | return count; | 132 | return 0; |
138 | } | 133 | } |
139 | 134 | ||
140 | static ssize_t ds1742_nvram_write(struct file *filp, struct kobject *kobj, | 135 | static int ds1742_nvram_write(void *priv, unsigned int pos, void *val, |
141 | struct bin_attribute *bin_attr, | 136 | size_t bytes) |
142 | char *buf, loff_t pos, size_t size) | ||
143 | { | 137 | { |
144 | struct device *dev = container_of(kobj, struct device, kobj); | 138 | struct rtc_plat_data *pdata = priv; |
145 | struct platform_device *pdev = to_platform_device(dev); | ||
146 | struct rtc_plat_data *pdata = platform_get_drvdata(pdev); | ||
147 | void __iomem *ioaddr = pdata->ioaddr_nvram; | 139 | void __iomem *ioaddr = pdata->ioaddr_nvram; |
148 | ssize_t count; | 140 | u8 *buf = val; |
149 | 141 | ||
150 | for (count = 0; count < size; count++) | 142 | for (; bytes; bytes--) |
151 | writeb(*buf++, ioaddr + pos++); | 143 | writeb(*buf++, ioaddr + pos++); |
152 | return count; | 144 | return 0; |
153 | } | 145 | } |
154 | 146 | ||
155 | static int ds1742_rtc_probe(struct platform_device *pdev) | 147 | static int ds1742_rtc_probe(struct platform_device *pdev) |
@@ -160,6 +152,14 @@ static int ds1742_rtc_probe(struct platform_device *pdev) | |||
160 | struct rtc_plat_data *pdata; | 152 | struct rtc_plat_data *pdata; |
161 | void __iomem *ioaddr; | 153 | void __iomem *ioaddr; |
162 | int ret = 0; | 154 | int ret = 0; |
155 | struct nvmem_config nvmem_cfg = { | ||
156 | .name = "ds1742_nvram", | ||
157 | .word_size = 1, | ||
158 | .stride = 1, | ||
159 | .reg_read = ds1742_nvram_read, | ||
160 | .reg_write = ds1742_nvram_write, | ||
161 | }; | ||
162 | |||
163 | 163 | ||
164 | pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); | 164 | pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); |
165 | if (!pdata) | 165 | if (!pdata) |
@@ -171,15 +171,10 @@ static int ds1742_rtc_probe(struct platform_device *pdev) | |||
171 | return PTR_ERR(ioaddr); | 171 | return PTR_ERR(ioaddr); |
172 | 172 | ||
173 | pdata->ioaddr_nvram = ioaddr; | 173 | pdata->ioaddr_nvram = ioaddr; |
174 | pdata->size_nvram = resource_size(res) - RTC_SIZE; | 174 | pdata->ioaddr_rtc = ioaddr + resource_size(res) - RTC_SIZE; |
175 | pdata->ioaddr_rtc = ioaddr + pdata->size_nvram; | ||
176 | 175 | ||
177 | sysfs_bin_attr_init(&pdata->nvram_attr); | 176 | nvmem_cfg.size = resource_size(res) - RTC_SIZE; |
178 | pdata->nvram_attr.attr.name = "nvram"; | 177 | nvmem_cfg.priv = pdata; |
179 | pdata->nvram_attr.attr.mode = S_IRUGO | S_IWUSR; | ||
180 | pdata->nvram_attr.read = ds1742_nvram_read; | ||
181 | pdata->nvram_attr.write = ds1742_nvram_write; | ||
182 | pdata->nvram_attr.size = pdata->size_nvram; | ||
183 | 178 | ||
184 | /* turn RTC on if it was not on */ | 179 | /* turn RTC on if it was not on */ |
185 | ioaddr = pdata->ioaddr_rtc; | 180 | ioaddr = pdata->ioaddr_rtc; |
@@ -196,24 +191,21 @@ static int ds1742_rtc_probe(struct platform_device *pdev) | |||
196 | 191 | ||
197 | pdata->last_jiffies = jiffies; | 192 | pdata->last_jiffies = jiffies; |
198 | platform_set_drvdata(pdev, pdata); | 193 | platform_set_drvdata(pdev, pdata); |
199 | rtc = devm_rtc_device_register(&pdev->dev, pdev->name, | 194 | |
200 | &ds1742_rtc_ops, THIS_MODULE); | 195 | rtc = devm_rtc_allocate_device(&pdev->dev); |
201 | if (IS_ERR(rtc)) | 196 | if (IS_ERR(rtc)) |
202 | return PTR_ERR(rtc); | 197 | return PTR_ERR(rtc); |
203 | 198 | ||
204 | ret = sysfs_create_bin_file(&pdev->dev.kobj, &pdata->nvram_attr); | 199 | rtc->ops = &ds1742_rtc_ops; |
205 | if (ret) | 200 | rtc->nvram_old_abi = true; |
206 | dev_err(&pdev->dev, "Unable to create sysfs entry: %s\n", | ||
207 | pdata->nvram_attr.attr.name); | ||
208 | 201 | ||
209 | return 0; | 202 | ret = rtc_register_device(rtc); |
210 | } | 203 | if (ret) |
204 | return ret; | ||
211 | 205 | ||
212 | static int ds1742_rtc_remove(struct platform_device *pdev) | 206 | if (rtc_nvmem_register(rtc, &nvmem_cfg)) |
213 | { | 207 | dev_err(&pdev->dev, "Unable to register nvmem\n"); |
214 | struct rtc_plat_data *pdata = platform_get_drvdata(pdev); | ||
215 | 208 | ||
216 | sysfs_remove_bin_file(&pdev->dev.kobj, &pdata->nvram_attr); | ||
217 | return 0; | 209 | return 0; |
218 | } | 210 | } |
219 | 211 | ||
@@ -225,7 +217,6 @@ MODULE_DEVICE_TABLE(of, ds1742_rtc_of_match); | |||
225 | 217 | ||
226 | static struct platform_driver ds1742_rtc_driver = { | 218 | static struct platform_driver ds1742_rtc_driver = { |
227 | .probe = ds1742_rtc_probe, | 219 | .probe = ds1742_rtc_probe, |
228 | .remove = ds1742_rtc_remove, | ||
229 | .driver = { | 220 | .driver = { |
230 | .name = "rtc-ds1742", | 221 | .name = "rtc-ds1742", |
231 | .of_match_table = of_match_ptr(ds1742_rtc_of_match), | 222 | .of_match_table = of_match_ptr(ds1742_rtc_of_match), |
diff --git a/drivers/rtc/rtc-ds2404.c b/drivers/rtc/rtc-ds2404.c index 9a1582ed7070..b886b6a5c178 100644 --- a/drivers/rtc/rtc-ds2404.c +++ b/drivers/rtc/rtc-ds2404.c | |||
@@ -207,7 +207,7 @@ static int ds2404_read_time(struct device *dev, struct rtc_time *dt) | |||
207 | time = le32_to_cpu(time); | 207 | time = le32_to_cpu(time); |
208 | 208 | ||
209 | rtc_time_to_tm(time, dt); | 209 | rtc_time_to_tm(time, dt); |
210 | return rtc_valid_tm(dt); | 210 | return 0; |
211 | } | 211 | } |
212 | 212 | ||
213 | static int ds2404_set_mmss(struct device *dev, unsigned long secs) | 213 | static int ds2404_set_mmss(struct device *dev, unsigned long secs) |
diff --git a/drivers/rtc/rtc-ds3232.c b/drivers/rtc/rtc-ds3232.c index 0550f7ba464f..7184e5145f12 100644 --- a/drivers/rtc/rtc-ds3232.c +++ b/drivers/rtc/rtc-ds3232.c | |||
@@ -145,7 +145,7 @@ static int ds3232_read_time(struct device *dev, struct rtc_time *time) | |||
145 | 145 | ||
146 | time->tm_year = bcd2bin(year) + add_century; | 146 | time->tm_year = bcd2bin(year) + add_century; |
147 | 147 | ||
148 | return rtc_valid_tm(time); | 148 | return 0; |
149 | } | 149 | } |
150 | 150 | ||
151 | static int ds3232_set_time(struct device *dev, struct rtc_time *time) | 151 | static int ds3232_set_time(struct device *dev, struct rtc_time *time) |
diff --git a/drivers/rtc/rtc-efi.c b/drivers/rtc/rtc-efi.c index 0130afd7fe88..3454e7814524 100644 --- a/drivers/rtc/rtc-efi.c +++ b/drivers/rtc/rtc-efi.c | |||
@@ -176,7 +176,7 @@ static int efi_read_time(struct device *dev, struct rtc_time *tm) | |||
176 | if (!convert_from_efi_time(&eft, tm)) | 176 | if (!convert_from_efi_time(&eft, tm)) |
177 | return -EIO; | 177 | return -EIO; |
178 | 178 | ||
179 | return rtc_valid_tm(tm); | 179 | return 0; |
180 | } | 180 | } |
181 | 181 | ||
182 | static int efi_set_time(struct device *dev, struct rtc_time *tm) | 182 | static int efi_set_time(struct device *dev, struct rtc_time *tm) |
diff --git a/drivers/rtc/rtc-fm3130.c b/drivers/rtc/rtc-fm3130.c index 576eadbba296..e1137670d4d2 100644 --- a/drivers/rtc/rtc-fm3130.c +++ b/drivers/rtc/rtc-fm3130.c | |||
@@ -136,8 +136,7 @@ static int fm3130_get_time(struct device *dev, struct rtc_time *t) | |||
136 | t->tm_hour, t->tm_mday, | 136 | t->tm_hour, t->tm_mday, |
137 | t->tm_mon, t->tm_year, t->tm_wday); | 137 | t->tm_mon, t->tm_year, t->tm_wday); |
138 | 138 | ||
139 | /* initial clock setting can be undefined */ | 139 | return 0; |
140 | return rtc_valid_tm(t); | ||
141 | } | 140 | } |
142 | 141 | ||
143 | 142 | ||
diff --git a/drivers/rtc/rtc-goldfish.c b/drivers/rtc/rtc-goldfish.c index d67769265185..a1c44d0c8557 100644 --- a/drivers/rtc/rtc-goldfish.c +++ b/drivers/rtc/rtc-goldfish.c | |||
@@ -235,3 +235,5 @@ static struct platform_driver goldfish_rtc = { | |||
235 | }; | 235 | }; |
236 | 236 | ||
237 | module_platform_driver(goldfish_rtc); | 237 | module_platform_driver(goldfish_rtc); |
238 | |||
239 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/rtc/rtc-isl12022.c b/drivers/rtc/rtc-isl12022.c index 38586a024ee8..890ccfc9e5aa 100644 --- a/drivers/rtc/rtc-isl12022.c +++ b/drivers/rtc/rtc-isl12022.c | |||
@@ -104,8 +104,9 @@ static int isl12022_write_reg(struct i2c_client *client, | |||
104 | * In the routines that deal directly with the isl12022 hardware, we use | 104 | * In the routines that deal directly with the isl12022 hardware, we use |
105 | * rtc_time -- month 0-11, hour 0-23, yr = calendar year-epoch. | 105 | * rtc_time -- month 0-11, hour 0-23, yr = calendar year-epoch. |
106 | */ | 106 | */ |
107 | static int isl12022_get_datetime(struct i2c_client *client, struct rtc_time *tm) | 107 | static int isl12022_rtc_read_time(struct device *dev, struct rtc_time *tm) |
108 | { | 108 | { |
109 | struct i2c_client *client = to_i2c_client(dev); | ||
109 | uint8_t buf[ISL12022_REG_INT + 1]; | 110 | uint8_t buf[ISL12022_REG_INT + 1]; |
110 | int ret; | 111 | int ret; |
111 | 112 | ||
@@ -149,11 +150,12 @@ static int isl12022_get_datetime(struct i2c_client *client, struct rtc_time *tm) | |||
149 | tm->tm_sec, tm->tm_min, tm->tm_hour, | 150 | tm->tm_sec, tm->tm_min, tm->tm_hour, |
150 | tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday); | 151 | tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday); |
151 | 152 | ||
152 | return rtc_valid_tm(tm); | 153 | return 0; |
153 | } | 154 | } |
154 | 155 | ||
155 | static int isl12022_set_datetime(struct i2c_client *client, struct rtc_time *tm) | 156 | static int isl12022_rtc_set_time(struct device *dev, struct rtc_time *tm) |
156 | { | 157 | { |
158 | struct i2c_client *client = to_i2c_client(dev); | ||
157 | struct isl12022 *isl12022 = i2c_get_clientdata(client); | 159 | struct isl12022 *isl12022 = i2c_get_clientdata(client); |
158 | size_t i; | 160 | size_t i; |
159 | int ret; | 161 | int ret; |
@@ -199,7 +201,7 @@ static int isl12022_set_datetime(struct i2c_client *client, struct rtc_time *tm) | |||
199 | return ret; | 201 | return ret; |
200 | } | 202 | } |
201 | 203 | ||
202 | isl12022->write_enabled = 1; | 204 | isl12022->write_enabled = true; |
203 | } | 205 | } |
204 | 206 | ||
205 | /* hours, minutes and seconds */ | 207 | /* hours, minutes and seconds */ |
@@ -228,16 +230,6 @@ static int isl12022_set_datetime(struct i2c_client *client, struct rtc_time *tm) | |||
228 | return 0; | 230 | return 0; |
229 | } | 231 | } |
230 | 232 | ||
231 | static int isl12022_rtc_read_time(struct device *dev, struct rtc_time *tm) | ||
232 | { | ||
233 | return isl12022_get_datetime(to_i2c_client(dev), tm); | ||
234 | } | ||
235 | |||
236 | static int isl12022_rtc_set_time(struct device *dev, struct rtc_time *tm) | ||
237 | { | ||
238 | return isl12022_set_datetime(to_i2c_client(dev), tm); | ||
239 | } | ||
240 | |||
241 | static const struct rtc_class_ops isl12022_rtc_ops = { | 233 | static const struct rtc_class_ops isl12022_rtc_ops = { |
242 | .read_time = isl12022_rtc_read_time, | 234 | .read_time = isl12022_rtc_read_time, |
243 | .set_time = isl12022_rtc_set_time, | 235 | .set_time = isl12022_rtc_set_time, |
diff --git a/drivers/rtc/rtc-isl12026.c b/drivers/rtc/rtc-isl12026.c new file mode 100644 index 000000000000..97f594f9667c --- /dev/null +++ b/drivers/rtc/rtc-isl12026.c | |||
@@ -0,0 +1,501 @@ | |||
1 | // SPDX-License-Identifier: GPL-2.0+ | ||
2 | /* | ||
3 | * An I2C driver for the Intersil ISL 12026 | ||
4 | * | ||
5 | * Copyright (c) 2018 Cavium, Inc. | ||
6 | */ | ||
7 | #include <linux/bcd.h> | ||
8 | #include <linux/delay.h> | ||
9 | #include <linux/i2c.h> | ||
10 | #include <linux/module.h> | ||
11 | #include <linux/mutex.h> | ||
12 | #include <linux/nvmem-provider.h> | ||
13 | #include <linux/of.h> | ||
14 | #include <linux/of_device.h> | ||
15 | #include <linux/rtc.h> | ||
16 | #include <linux/slab.h> | ||
17 | |||
18 | /* register offsets */ | ||
19 | #define ISL12026_REG_PWR 0x14 | ||
20 | # define ISL12026_REG_PWR_BSW BIT(6) | ||
21 | # define ISL12026_REG_PWR_SBIB BIT(7) | ||
22 | #define ISL12026_REG_SC 0x30 | ||
23 | #define ISL12026_REG_HR 0x32 | ||
24 | # define ISL12026_REG_HR_MIL BIT(7) /* military or 24 hour time */ | ||
25 | #define ISL12026_REG_SR 0x3f | ||
26 | # define ISL12026_REG_SR_RTCF BIT(0) | ||
27 | # define ISL12026_REG_SR_WEL BIT(1) | ||
28 | # define ISL12026_REG_SR_RWEL BIT(2) | ||
29 | # define ISL12026_REG_SR_MBZ BIT(3) | ||
30 | # define ISL12026_REG_SR_OSCF BIT(4) | ||
31 | |||
32 | /* The EEPROM array responds at i2c address 0x57 */ | ||
33 | #define ISL12026_EEPROM_ADDR 0x57 | ||
34 | |||
35 | #define ISL12026_PAGESIZE 16 | ||
36 | #define ISL12026_NVMEM_WRITE_TIME 20 | ||
37 | |||
38 | struct isl12026 { | ||
39 | struct rtc_device *rtc; | ||
40 | struct i2c_client *nvm_client; | ||
41 | }; | ||
42 | |||
43 | static int isl12026_read_reg(struct i2c_client *client, int reg) | ||
44 | { | ||
45 | u8 addr[] = {0, reg}; | ||
46 | u8 val; | ||
47 | int ret; | ||
48 | |||
49 | struct i2c_msg msgs[] = { | ||
50 | { | ||
51 | .addr = client->addr, | ||
52 | .flags = 0, | ||
53 | .len = sizeof(addr), | ||
54 | .buf = addr | ||
55 | }, { | ||
56 | .addr = client->addr, | ||
57 | .flags = I2C_M_RD, | ||
58 | .len = 1, | ||
59 | .buf = &val | ||
60 | } | ||
61 | }; | ||
62 | |||
63 | ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); | ||
64 | if (ret != ARRAY_SIZE(msgs)) { | ||
65 | dev_err(&client->dev, "read reg error, ret=%d\n", ret); | ||
66 | ret = ret < 0 ? ret : -EIO; | ||
67 | } else { | ||
68 | ret = val; | ||
69 | } | ||
70 | |||
71 | return ret; | ||
72 | } | ||
73 | |||
74 | static int isl12026_arm_write(struct i2c_client *client) | ||
75 | { | ||
76 | int ret; | ||
77 | u8 op[3]; | ||
78 | struct i2c_msg msg = { | ||
79 | .addr = client->addr, | ||
80 | .flags = 0, | ||
81 | .len = 1, | ||
82 | .buf = op | ||
83 | }; | ||
84 | |||
85 | /* Set SR.WEL */ | ||
86 | op[0] = 0; | ||
87 | op[1] = ISL12026_REG_SR; | ||
88 | op[2] = ISL12026_REG_SR_WEL; | ||
89 | msg.len = 3; | ||
90 | ret = i2c_transfer(client->adapter, &msg, 1); | ||
91 | if (ret != 1) { | ||
92 | dev_err(&client->dev, "write error SR.WEL, ret=%d\n", ret); | ||
93 | ret = ret < 0 ? ret : -EIO; | ||
94 | goto out; | ||
95 | } | ||
96 | |||
97 | /* Set SR.WEL and SR.RWEL */ | ||
98 | op[2] = ISL12026_REG_SR_WEL | ISL12026_REG_SR_RWEL; | ||
99 | msg.len = 3; | ||
100 | ret = i2c_transfer(client->adapter, &msg, 1); | ||
101 | if (ret != 1) { | ||
102 | dev_err(&client->dev, | ||
103 | "write error SR.WEL|SR.RWEL, ret=%d\n", ret); | ||
104 | ret = ret < 0 ? ret : -EIO; | ||
105 | goto out; | ||
106 | } else { | ||
107 | ret = 0; | ||
108 | } | ||
109 | out: | ||
110 | return ret; | ||
111 | } | ||
112 | |||
113 | static int isl12026_disarm_write(struct i2c_client *client) | ||
114 | { | ||
115 | int ret; | ||
116 | u8 op[3] = {0, ISL12026_REG_SR, 0}; | ||
117 | struct i2c_msg msg = { | ||
118 | .addr = client->addr, | ||
119 | .flags = 0, | ||
120 | .len = sizeof(op), | ||
121 | .buf = op | ||
122 | }; | ||
123 | |||
124 | ret = i2c_transfer(client->adapter, &msg, 1); | ||
125 | if (ret != 1) { | ||
126 | dev_err(&client->dev, | ||
127 | "write error SR, ret=%d\n", ret); | ||
128 | ret = ret < 0 ? ret : -EIO; | ||
129 | } else { | ||
130 | ret = 0; | ||
131 | } | ||
132 | |||
133 | return ret; | ||
134 | } | ||
135 | |||
136 | static int isl12026_write_reg(struct i2c_client *client, int reg, u8 val) | ||
137 | { | ||
138 | int ret; | ||
139 | u8 op[3] = {0, reg, val}; | ||
140 | struct i2c_msg msg = { | ||
141 | .addr = client->addr, | ||
142 | .flags = 0, | ||
143 | .len = sizeof(op), | ||
144 | .buf = op | ||
145 | }; | ||
146 | |||
147 | ret = isl12026_arm_write(client); | ||
148 | if (ret) | ||
149 | return ret; | ||
150 | |||
151 | ret = i2c_transfer(client->adapter, &msg, 1); | ||
152 | if (ret != 1) { | ||
153 | dev_err(&client->dev, "write error CCR, ret=%d\n", ret); | ||
154 | ret = ret < 0 ? ret : -EIO; | ||
155 | goto out; | ||
156 | } | ||
157 | |||
158 | msleep(ISL12026_NVMEM_WRITE_TIME); | ||
159 | |||
160 | ret = isl12026_disarm_write(client); | ||
161 | out: | ||
162 | return ret; | ||
163 | } | ||
164 | |||
165 | static int isl12026_rtc_set_time(struct device *dev, struct rtc_time *tm) | ||
166 | { | ||
167 | struct i2c_client *client = to_i2c_client(dev); | ||
168 | int ret; | ||
169 | u8 op[10]; | ||
170 | struct i2c_msg msg = { | ||
171 | .addr = client->addr, | ||
172 | .flags = 0, | ||
173 | .len = sizeof(op), | ||
174 | .buf = op | ||
175 | }; | ||
176 | |||
177 | ret = isl12026_arm_write(client); | ||
178 | if (ret) | ||
179 | return ret; | ||
180 | |||
181 | /* Set the CCR registers */ | ||
182 | op[0] = 0; | ||
183 | op[1] = ISL12026_REG_SC; | ||
184 | op[2] = bin2bcd(tm->tm_sec); /* SC */ | ||
185 | op[3] = bin2bcd(tm->tm_min); /* MN */ | ||
186 | op[4] = bin2bcd(tm->tm_hour) | ISL12026_REG_HR_MIL; /* HR */ | ||
187 | op[5] = bin2bcd(tm->tm_mday); /* DT */ | ||
188 | op[6] = bin2bcd(tm->tm_mon + 1); /* MO */ | ||
189 | op[7] = bin2bcd(tm->tm_year % 100); /* YR */ | ||
190 | op[8] = bin2bcd(tm->tm_wday & 7); /* DW */ | ||
191 | op[9] = bin2bcd(tm->tm_year >= 100 ? 20 : 19); /* Y2K */ | ||
192 | ret = i2c_transfer(client->adapter, &msg, 1); | ||
193 | if (ret != 1) { | ||
194 | dev_err(&client->dev, "write error CCR, ret=%d\n", ret); | ||
195 | ret = ret < 0 ? ret : -EIO; | ||
196 | goto out; | ||
197 | } | ||
198 | |||
199 | ret = isl12026_disarm_write(client); | ||
200 | out: | ||
201 | return ret; | ||
202 | } | ||
203 | |||
204 | static int isl12026_rtc_read_time(struct device *dev, struct rtc_time *tm) | ||
205 | { | ||
206 | struct i2c_client *client = to_i2c_client(dev); | ||
207 | u8 ccr[8]; | ||
208 | u8 addr[2]; | ||
209 | u8 sr; | ||
210 | int ret; | ||
211 | struct i2c_msg msgs[] = { | ||
212 | { | ||
213 | .addr = client->addr, | ||
214 | .flags = 0, | ||
215 | .len = sizeof(addr), | ||
216 | .buf = addr | ||
217 | }, { | ||
218 | .addr = client->addr, | ||
219 | .flags = I2C_M_RD, | ||
220 | } | ||
221 | }; | ||
222 | |||
223 | /* First, read SR */ | ||
224 | addr[0] = 0; | ||
225 | addr[1] = ISL12026_REG_SR; | ||
226 | msgs[1].len = 1; | ||
227 | msgs[1].buf = &sr; | ||
228 | |||
229 | ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); | ||
230 | if (ret != ARRAY_SIZE(msgs)) { | ||
231 | dev_err(&client->dev, "read error, ret=%d\n", ret); | ||
232 | ret = ret < 0 ? ret : -EIO; | ||
233 | goto out; | ||
234 | } | ||
235 | |||
236 | if (sr & ISL12026_REG_SR_RTCF) | ||
237 | dev_warn(&client->dev, "Real-Time Clock Failure on read\n"); | ||
238 | if (sr & ISL12026_REG_SR_OSCF) | ||
239 | dev_warn(&client->dev, "Oscillator Failure on read\n"); | ||
240 | |||
241 | /* Second, CCR regs */ | ||
242 | addr[0] = 0; | ||
243 | addr[1] = ISL12026_REG_SC; | ||
244 | msgs[1].len = sizeof(ccr); | ||
245 | msgs[1].buf = ccr; | ||
246 | |||
247 | ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); | ||
248 | if (ret != ARRAY_SIZE(msgs)) { | ||
249 | dev_err(&client->dev, "read error, ret=%d\n", ret); | ||
250 | ret = ret < 0 ? ret : -EIO; | ||
251 | goto out; | ||
252 | } | ||
253 | |||
254 | tm->tm_sec = bcd2bin(ccr[0] & 0x7F); | ||
255 | tm->tm_min = bcd2bin(ccr[1] & 0x7F); | ||
256 | if (ccr[2] & ISL12026_REG_HR_MIL) | ||
257 | tm->tm_hour = bcd2bin(ccr[2] & 0x3F); | ||
258 | else | ||
259 | tm->tm_hour = bcd2bin(ccr[2] & 0x1F) + | ||
260 | ((ccr[2] & 0x20) ? 12 : 0); | ||
261 | tm->tm_mday = bcd2bin(ccr[3] & 0x3F); | ||
262 | tm->tm_mon = bcd2bin(ccr[4] & 0x1F) - 1; | ||
263 | tm->tm_year = bcd2bin(ccr[5]); | ||
264 | if (bcd2bin(ccr[7]) == 20) | ||
265 | tm->tm_year += 100; | ||
266 | tm->tm_wday = ccr[6] & 0x07; | ||
267 | |||
268 | ret = 0; | ||
269 | out: | ||
270 | return ret; | ||
271 | } | ||
272 | |||
273 | static const struct rtc_class_ops isl12026_rtc_ops = { | ||
274 | .read_time = isl12026_rtc_read_time, | ||
275 | .set_time = isl12026_rtc_set_time, | ||
276 | }; | ||
277 | |||
278 | static int isl12026_nvm_read(void *p, unsigned int offset, | ||
279 | void *val, size_t bytes) | ||
280 | { | ||
281 | struct isl12026 *priv = p; | ||
282 | int ret; | ||
283 | u8 addr[2]; | ||
284 | struct i2c_msg msgs[] = { | ||
285 | { | ||
286 | .addr = priv->nvm_client->addr, | ||
287 | .flags = 0, | ||
288 | .len = sizeof(addr), | ||
289 | .buf = addr | ||
290 | }, { | ||
291 | .addr = priv->nvm_client->addr, | ||
292 | .flags = I2C_M_RD, | ||
293 | .buf = val | ||
294 | } | ||
295 | }; | ||
296 | |||
297 | /* | ||
298 | * offset and bytes checked and limited by nvmem core, so | ||
299 | * proceed without further checks. | ||
300 | */ | ||
301 | ret = mutex_lock_interruptible(&priv->rtc->ops_lock); | ||
302 | if (ret) | ||
303 | return ret; | ||
304 | |||
305 | /* 2 bytes of address, most significant first */ | ||
306 | addr[0] = offset >> 8; | ||
307 | addr[1] = offset; | ||
308 | msgs[1].len = bytes; | ||
309 | ret = i2c_transfer(priv->nvm_client->adapter, msgs, ARRAY_SIZE(msgs)); | ||
310 | |||
311 | mutex_unlock(&priv->rtc->ops_lock); | ||
312 | |||
313 | if (ret != ARRAY_SIZE(msgs)) { | ||
314 | dev_err(&priv->nvm_client->dev, | ||
315 | "nvmem read error, ret=%d\n", ret); | ||
316 | return ret < 0 ? ret : -EIO; | ||
317 | } | ||
318 | |||
319 | return 0; | ||
320 | } | ||
321 | |||
322 | static int isl12026_nvm_write(void *p, unsigned int offset, | ||
323 | void *val, size_t bytes) | ||
324 | { | ||
325 | struct isl12026 *priv = p; | ||
326 | int ret; | ||
327 | u8 *v = val; | ||
328 | size_t chunk_size, num_written; | ||
329 | u8 payload[ISL12026_PAGESIZE + 2]; /* page + 2 address bytes */ | ||
330 | struct i2c_msg msgs[] = { | ||
331 | { | ||
332 | .addr = priv->nvm_client->addr, | ||
333 | .flags = 0, | ||
334 | .buf = payload | ||
335 | } | ||
336 | }; | ||
337 | |||
338 | /* | ||
339 | * offset and bytes checked and limited by nvmem core, so | ||
340 | * proceed without further checks. | ||
341 | */ | ||
342 | ret = mutex_lock_interruptible(&priv->rtc->ops_lock); | ||
343 | if (ret) | ||
344 | return ret; | ||
345 | |||
346 | num_written = 0; | ||
347 | while (bytes) { | ||
348 | chunk_size = round_down(offset, ISL12026_PAGESIZE) + | ||
349 | ISL12026_PAGESIZE - offset; | ||
350 | chunk_size = min(bytes, chunk_size); | ||
351 | /* | ||
352 | * 2 bytes of address, most significant first, followed | ||
353 | * by page data bytes | ||
354 | */ | ||
355 | memcpy(payload + 2, v + num_written, chunk_size); | ||
356 | payload[0] = offset >> 8; | ||
357 | payload[1] = offset; | ||
358 | msgs[0].len = chunk_size + 2; | ||
359 | ret = i2c_transfer(priv->nvm_client->adapter, | ||
360 | msgs, ARRAY_SIZE(msgs)); | ||
361 | if (ret != ARRAY_SIZE(msgs)) { | ||
362 | dev_err(&priv->nvm_client->dev, | ||
363 | "nvmem write error, ret=%d\n", ret); | ||
364 | ret = ret < 0 ? ret : -EIO; | ||
365 | break; | ||
366 | } | ||
367 | ret = 0; | ||
368 | bytes -= chunk_size; | ||
369 | offset += chunk_size; | ||
370 | num_written += chunk_size; | ||
371 | msleep(ISL12026_NVMEM_WRITE_TIME); | ||
372 | } | ||
373 | |||
374 | mutex_unlock(&priv->rtc->ops_lock); | ||
375 | |||
376 | return ret; | ||
377 | } | ||
378 | |||
379 | static void isl12026_force_power_modes(struct i2c_client *client) | ||
380 | { | ||
381 | int ret; | ||
382 | int pwr, requested_pwr; | ||
383 | u32 bsw_val, sbib_val; | ||
384 | bool set_bsw, set_sbib; | ||
385 | |||
386 | /* | ||
387 | * If we can read the of_property, set the specified value. | ||
388 | * If there is an error reading the of_property (likely | ||
389 | * because it does not exist), keep the current value. | ||
390 | */ | ||
391 | ret = of_property_read_u32(client->dev.of_node, | ||
392 | "isil,pwr-bsw", &bsw_val); | ||
393 | set_bsw = (ret == 0); | ||
394 | |||
395 | ret = of_property_read_u32(client->dev.of_node, | ||
396 | "isil,pwr-sbib", &sbib_val); | ||
397 | set_sbib = (ret == 0); | ||
398 | |||
399 | /* Check if PWR.BSW and/or PWR.SBIB need specified values */ | ||
400 | if (!set_bsw && !set_sbib) | ||
401 | return; | ||
402 | |||
403 | pwr = isl12026_read_reg(client, ISL12026_REG_PWR); | ||
404 | if (pwr < 0) { | ||
405 | dev_warn(&client->dev, "Error: Failed to read PWR %d\n", pwr); | ||
406 | return; | ||
407 | } | ||
408 | |||
409 | requested_pwr = pwr; | ||
410 | |||
411 | if (set_bsw) { | ||
412 | if (bsw_val) | ||
413 | requested_pwr |= ISL12026_REG_PWR_BSW; | ||
414 | else | ||
415 | requested_pwr &= ~ISL12026_REG_PWR_BSW; | ||
416 | } /* else keep current BSW */ | ||
417 | |||
418 | if (set_sbib) { | ||
419 | if (sbib_val) | ||
420 | requested_pwr |= ISL12026_REG_PWR_SBIB; | ||
421 | else | ||
422 | requested_pwr &= ~ISL12026_REG_PWR_SBIB; | ||
423 | } /* else keep current SBIB */ | ||
424 | |||
425 | if (pwr >= 0 && pwr != requested_pwr) { | ||
426 | dev_dbg(&client->dev, "PWR: %02x\n", pwr); | ||
427 | dev_dbg(&client->dev, "Updating PWR to: %02x\n", requested_pwr); | ||
428 | isl12026_write_reg(client, ISL12026_REG_PWR, requested_pwr); | ||
429 | } | ||
430 | } | ||
431 | |||
432 | static int isl12026_probe_new(struct i2c_client *client) | ||
433 | { | ||
434 | struct isl12026 *priv; | ||
435 | int ret; | ||
436 | struct nvmem_config nvm_cfg = { | ||
437 | .name = "isl12026-", | ||
438 | .base_dev = &client->dev, | ||
439 | .stride = 1, | ||
440 | .word_size = 1, | ||
441 | .size = 512, | ||
442 | .reg_read = isl12026_nvm_read, | ||
443 | .reg_write = isl12026_nvm_write, | ||
444 | }; | ||
445 | |||
446 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) | ||
447 | return -ENODEV; | ||
448 | |||
449 | priv = devm_kzalloc(&client->dev, sizeof(*priv), GFP_KERNEL); | ||
450 | if (!priv) | ||
451 | return -ENOMEM; | ||
452 | |||
453 | i2c_set_clientdata(client, priv); | ||
454 | |||
455 | isl12026_force_power_modes(client); | ||
456 | |||
457 | priv->nvm_client = i2c_new_dummy(client->adapter, ISL12026_EEPROM_ADDR); | ||
458 | if (!priv->nvm_client) | ||
459 | return -ENOMEM; | ||
460 | |||
461 | priv->rtc = devm_rtc_allocate_device(&client->dev); | ||
462 | ret = PTR_ERR_OR_ZERO(priv->rtc); | ||
463 | if (ret) | ||
464 | return ret; | ||
465 | |||
466 | priv->rtc->ops = &isl12026_rtc_ops; | ||
467 | nvm_cfg.priv = priv; | ||
468 | ret = rtc_nvmem_register(priv->rtc, &nvm_cfg); | ||
469 | if (ret) | ||
470 | return ret; | ||
471 | |||
472 | return rtc_register_device(priv->rtc); | ||
473 | } | ||
474 | |||
475 | static int isl12026_remove(struct i2c_client *client) | ||
476 | { | ||
477 | struct isl12026 *priv = i2c_get_clientdata(client); | ||
478 | |||
479 | i2c_unregister_device(priv->nvm_client); | ||
480 | return 0; | ||
481 | } | ||
482 | |||
483 | static const struct of_device_id isl12026_dt_match[] = { | ||
484 | { .compatible = "isil,isl12026" }, | ||
485 | { } | ||
486 | }; | ||
487 | MODULE_DEVICE_TABLE(of, isl12026_dt_match); | ||
488 | |||
489 | static struct i2c_driver isl12026_driver = { | ||
490 | .driver = { | ||
491 | .name = "rtc-isl12026", | ||
492 | .of_match_table = isl12026_dt_match, | ||
493 | }, | ||
494 | .probe_new = isl12026_probe_new, | ||
495 | .remove = isl12026_remove, | ||
496 | }; | ||
497 | |||
498 | module_i2c_driver(isl12026_driver); | ||
499 | |||
500 | MODULE_DESCRIPTION("ISL 12026 RTC driver"); | ||
501 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/rtc/rtc-isl1208.c b/drivers/rtc/rtc-isl1208.c index 8dd299c6a1f3..1a2c38cc0178 100644 --- a/drivers/rtc/rtc-isl1208.c +++ b/drivers/rtc/rtc-isl1208.c | |||
@@ -459,6 +459,11 @@ isl1208_i2c_set_time(struct i2c_client *client, struct rtc_time const *tm) | |||
459 | } | 459 | } |
460 | 460 | ||
461 | /* clear WRTC again */ | 461 | /* clear WRTC again */ |
462 | sr = isl1208_i2c_get_sr(client); | ||
463 | if (sr < 0) { | ||
464 | dev_err(&client->dev, "%s: reading SR failed\n", __func__); | ||
465 | return sr; | ||
466 | } | ||
462 | sr = i2c_smbus_write_byte_data(client, ISL1208_REG_SR, | 467 | sr = i2c_smbus_write_byte_data(client, ISL1208_REG_SR, |
463 | sr & ~ISL1208_REG_SR_WRTC); | 468 | sr & ~ISL1208_REG_SR_WRTC); |
464 | if (sr < 0) { | 469 | if (sr < 0) { |
@@ -630,29 +635,12 @@ isl1208_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
630 | if (isl1208_i2c_validate_client(client) < 0) | 635 | if (isl1208_i2c_validate_client(client) < 0) |
631 | return -ENODEV; | 636 | return -ENODEV; |
632 | 637 | ||
633 | if (client->irq > 0) { | 638 | rtc = devm_rtc_allocate_device(&client->dev); |
634 | rc = devm_request_threaded_irq(&client->dev, client->irq, NULL, | ||
635 | isl1208_rtc_interrupt, | ||
636 | IRQF_SHARED | IRQF_ONESHOT, | ||
637 | isl1208_driver.driver.name, | ||
638 | client); | ||
639 | if (!rc) { | ||
640 | device_init_wakeup(&client->dev, 1); | ||
641 | enable_irq_wake(client->irq); | ||
642 | } else { | ||
643 | dev_err(&client->dev, | ||
644 | "Unable to request irq %d, no alarm support\n", | ||
645 | client->irq); | ||
646 | client->irq = 0; | ||
647 | } | ||
648 | } | ||
649 | |||
650 | rtc = devm_rtc_device_register(&client->dev, isl1208_driver.driver.name, | ||
651 | &isl1208_rtc_ops, | ||
652 | THIS_MODULE); | ||
653 | if (IS_ERR(rtc)) | 639 | if (IS_ERR(rtc)) |
654 | return PTR_ERR(rtc); | 640 | return PTR_ERR(rtc); |
655 | 641 | ||
642 | rtc->ops = &isl1208_rtc_ops; | ||
643 | |||
656 | i2c_set_clientdata(client, rtc); | 644 | i2c_set_clientdata(client, rtc); |
657 | 645 | ||
658 | rc = isl1208_i2c_get_sr(client); | 646 | rc = isl1208_i2c_get_sr(client); |
@@ -669,7 +657,24 @@ isl1208_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
669 | if (rc) | 657 | if (rc) |
670 | return rc; | 658 | return rc; |
671 | 659 | ||
672 | return 0; | 660 | if (client->irq > 0) { |
661 | rc = devm_request_threaded_irq(&client->dev, client->irq, NULL, | ||
662 | isl1208_rtc_interrupt, | ||
663 | IRQF_SHARED | IRQF_ONESHOT, | ||
664 | isl1208_driver.driver.name, | ||
665 | client); | ||
666 | if (!rc) { | ||
667 | device_init_wakeup(&client->dev, 1); | ||
668 | enable_irq_wake(client->irq); | ||
669 | } else { | ||
670 | dev_err(&client->dev, | ||
671 | "Unable to request irq %d, no alarm support\n", | ||
672 | client->irq); | ||
673 | client->irq = 0; | ||
674 | } | ||
675 | } | ||
676 | |||
677 | return rtc_register_device(rtc); | ||
673 | } | 678 | } |
674 | 679 | ||
675 | static int | 680 | static int |
diff --git a/drivers/rtc/rtc-jz4740.c b/drivers/rtc/rtc-jz4740.c index ff65a7d2b9c9..d0a891777f44 100644 --- a/drivers/rtc/rtc-jz4740.c +++ b/drivers/rtc/rtc-jz4740.c | |||
@@ -173,7 +173,7 @@ static int jz4740_rtc_read_time(struct device *dev, struct rtc_time *time) | |||
173 | 173 | ||
174 | rtc_time_to_tm(secs, time); | 174 | rtc_time_to_tm(secs, time); |
175 | 175 | ||
176 | return rtc_valid_tm(time); | 176 | return 0; |
177 | } | 177 | } |
178 | 178 | ||
179 | static int jz4740_rtc_set_mmss(struct device *dev, unsigned long secs) | 179 | static int jz4740_rtc_set_mmss(struct device *dev, unsigned long secs) |
diff --git a/drivers/rtc/rtc-lib.c b/drivers/rtc/rtc-lib.c index 1ae7da5cfc60..4a3c0f3aab14 100644 --- a/drivers/rtc/rtc-lib.c +++ b/drivers/rtc/rtc-lib.c | |||
@@ -52,13 +52,11 @@ EXPORT_SYMBOL(rtc_year_days); | |||
52 | */ | 52 | */ |
53 | void rtc_time64_to_tm(time64_t time, struct rtc_time *tm) | 53 | void rtc_time64_to_tm(time64_t time, struct rtc_time *tm) |
54 | { | 54 | { |
55 | unsigned int month, year; | 55 | unsigned int month, year, secs; |
56 | unsigned long secs; | ||
57 | int days; | 56 | int days; |
58 | 57 | ||
59 | /* time must be positive */ | 58 | /* time must be positive */ |
60 | days = div_s64(time, 86400); | 59 | days = div_s64_rem(time, 86400, &secs); |
61 | secs = time - (unsigned int) days * 86400; | ||
62 | 60 | ||
63 | /* day of the week, 1970-01-01 was a Thursday */ | 61 | /* day of the week, 1970-01-01 was a Thursday */ |
64 | tm->tm_wday = (days + 4) % 7; | 62 | tm->tm_wday = (days + 4) % 7; |
@@ -67,7 +65,7 @@ void rtc_time64_to_tm(time64_t time, struct rtc_time *tm) | |||
67 | days -= (year - 1970) * 365 | 65 | days -= (year - 1970) * 365 |
68 | + LEAPS_THRU_END_OF(year - 1) | 66 | + LEAPS_THRU_END_OF(year - 1) |
69 | - LEAPS_THRU_END_OF(1970 - 1); | 67 | - LEAPS_THRU_END_OF(1970 - 1); |
70 | if (days < 0) { | 68 | while (days < 0) { |
71 | year -= 1; | 69 | year -= 1; |
72 | days += 365 + is_leap_year(year); | 70 | days += 365 + is_leap_year(year); |
73 | } | 71 | } |
diff --git a/drivers/rtc/rtc-lpc24xx.c b/drivers/rtc/rtc-lpc24xx.c index 59d99596fdeb..14dc7b04fae0 100644 --- a/drivers/rtc/rtc-lpc24xx.c +++ b/drivers/rtc/rtc-lpc24xx.c | |||
@@ -110,7 +110,7 @@ static int lpc24xx_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
110 | tm->tm_year = CT1_YEAR(ct1); | 110 | tm->tm_year = CT1_YEAR(ct1); |
111 | tm->tm_yday = CT2_DOY(ct2); | 111 | tm->tm_yday = CT2_DOY(ct2); |
112 | 112 | ||
113 | return rtc_valid_tm(tm); | 113 | return 0; |
114 | } | 114 | } |
115 | 115 | ||
116 | static int lpc24xx_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *wkalrm) | 116 | static int lpc24xx_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *wkalrm) |
diff --git a/drivers/rtc/rtc-lpc32xx.c b/drivers/rtc/rtc-lpc32xx.c index 887871c3d526..3ba87239aacc 100644 --- a/drivers/rtc/rtc-lpc32xx.c +++ b/drivers/rtc/rtc-lpc32xx.c | |||
@@ -70,7 +70,7 @@ static int lpc32xx_rtc_read_time(struct device *dev, struct rtc_time *time) | |||
70 | elapsed_sec = rtc_readl(rtc, LPC32XX_RTC_UCOUNT); | 70 | elapsed_sec = rtc_readl(rtc, LPC32XX_RTC_UCOUNT); |
71 | rtc_time_to_tm(elapsed_sec, time); | 71 | rtc_time_to_tm(elapsed_sec, time); |
72 | 72 | ||
73 | return rtc_valid_tm(time); | 73 | return 0; |
74 | } | 74 | } |
75 | 75 | ||
76 | static int lpc32xx_rtc_set_mmss(struct device *dev, unsigned long secs) | 76 | static int lpc32xx_rtc_set_mmss(struct device *dev, unsigned long secs) |
diff --git a/drivers/rtc/rtc-ls1x.c b/drivers/rtc/rtc-ls1x.c index e04ca54f21e2..045af1135e48 100644 --- a/drivers/rtc/rtc-ls1x.c +++ b/drivers/rtc/rtc-ls1x.c | |||
@@ -98,7 +98,7 @@ static int ls1x_rtc_read_time(struct device *dev, struct rtc_time *rtm) | |||
98 | ls1x_get_min(v), ls1x_get_sec(v)); | 98 | ls1x_get_min(v), ls1x_get_sec(v)); |
99 | rtc_time_to_tm(t, rtm); | 99 | rtc_time_to_tm(t, rtm); |
100 | 100 | ||
101 | return rtc_valid_tm(rtm); | 101 | return 0; |
102 | } | 102 | } |
103 | 103 | ||
104 | static int ls1x_rtc_set_time(struct device *dev, struct rtc_time *rtm) | 104 | static int ls1x_rtc_set_time(struct device *dev, struct rtc_time *rtm) |
diff --git a/drivers/rtc/rtc-m41t80.c b/drivers/rtc/rtc-m41t80.c index c90fba3ed861..ad03e2f12f5d 100644 --- a/drivers/rtc/rtc-m41t80.c +++ b/drivers/rtc/rtc-m41t80.c | |||
@@ -73,7 +73,6 @@ | |||
73 | #define M41T80_FEATURE_WD BIT(3) /* Extra watchdog resolution */ | 73 | #define M41T80_FEATURE_WD BIT(3) /* Extra watchdog resolution */ |
74 | #define M41T80_FEATURE_SQ_ALT BIT(4) /* RSx bits are in reg 4 */ | 74 | #define M41T80_FEATURE_SQ_ALT BIT(4) /* RSx bits are in reg 4 */ |
75 | 75 | ||
76 | static DEFINE_MUTEX(m41t80_rtc_mutex); | ||
77 | static const struct i2c_device_id m41t80_id[] = { | 76 | static const struct i2c_device_id m41t80_id[] = { |
78 | { "m41t62", M41T80_FEATURE_SQ | M41T80_FEATURE_SQ_ALT }, | 77 | { "m41t62", M41T80_FEATURE_SQ | M41T80_FEATURE_SQ_ALT }, |
79 | { "m41t65", M41T80_FEATURE_HT | M41T80_FEATURE_WD }, | 78 | { "m41t65", M41T80_FEATURE_HT | M41T80_FEATURE_WD }, |
@@ -199,9 +198,9 @@ static irqreturn_t m41t80_handle_irq(int irq, void *dev_id) | |||
199 | return IRQ_HANDLED; | 198 | return IRQ_HANDLED; |
200 | } | 199 | } |
201 | 200 | ||
202 | static int m41t80_get_datetime(struct i2c_client *client, | 201 | static int m41t80_rtc_read_time(struct device *dev, struct rtc_time *tm) |
203 | struct rtc_time *tm) | ||
204 | { | 202 | { |
203 | struct i2c_client *client = to_i2c_client(dev); | ||
205 | unsigned char buf[8]; | 204 | unsigned char buf[8]; |
206 | int err, flags; | 205 | int err, flags; |
207 | 206 | ||
@@ -230,12 +229,12 @@ static int m41t80_get_datetime(struct i2c_client *client, | |||
230 | 229 | ||
231 | /* assume 20YY not 19YY, and ignore the Century Bit */ | 230 | /* assume 20YY not 19YY, and ignore the Century Bit */ |
232 | tm->tm_year = bcd2bin(buf[M41T80_REG_YEAR]) + 100; | 231 | tm->tm_year = bcd2bin(buf[M41T80_REG_YEAR]) + 100; |
233 | return rtc_valid_tm(tm); | 232 | return 0; |
234 | } | 233 | } |
235 | 234 | ||
236 | /* Sets the given date and time to the real time clock. */ | 235 | static int m41t80_rtc_set_time(struct device *dev, struct rtc_time *tm) |
237 | static int m41t80_set_datetime(struct i2c_client *client, struct rtc_time *tm) | ||
238 | { | 236 | { |
237 | struct i2c_client *client = to_i2c_client(dev); | ||
239 | struct m41t80_data *clientdata = i2c_get_clientdata(client); | 238 | struct m41t80_data *clientdata = i2c_get_clientdata(client); |
240 | unsigned char buf[8]; | 239 | unsigned char buf[8]; |
241 | int err, flags; | 240 | int err, flags; |
@@ -298,16 +297,6 @@ static int m41t80_rtc_proc(struct device *dev, struct seq_file *seq) | |||
298 | return 0; | 297 | return 0; |
299 | } | 298 | } |
300 | 299 | ||
301 | static int m41t80_rtc_read_time(struct device *dev, struct rtc_time *tm) | ||
302 | { | ||
303 | return m41t80_get_datetime(to_i2c_client(dev), tm); | ||
304 | } | ||
305 | |||
306 | static int m41t80_rtc_set_time(struct device *dev, struct rtc_time *tm) | ||
307 | { | ||
308 | return m41t80_set_datetime(to_i2c_client(dev), tm); | ||
309 | } | ||
310 | |||
311 | static int m41t80_alarm_irq_enable(struct device *dev, unsigned int enabled) | 300 | static int m41t80_alarm_irq_enable(struct device *dev, unsigned int enabled) |
312 | { | 301 | { |
313 | struct i2c_client *client = to_i2c_client(dev); | 302 | struct i2c_client *client = to_i2c_client(dev); |
@@ -598,6 +587,7 @@ static struct clk *m41t80_sqw_register_clk(struct m41t80_data *m41t80) | |||
598 | * | 587 | * |
599 | ***************************************************************************** | 588 | ***************************************************************************** |
600 | */ | 589 | */ |
590 | static DEFINE_MUTEX(m41t80_rtc_mutex); | ||
601 | static struct i2c_client *save_client; | 591 | static struct i2c_client *save_client; |
602 | 592 | ||
603 | /* Default margin */ | 593 | /* Default margin */ |
@@ -885,7 +875,6 @@ static int m41t80_probe(struct i2c_client *client, | |||
885 | { | 875 | { |
886 | struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); | 876 | struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); |
887 | int rc = 0; | 877 | int rc = 0; |
888 | struct rtc_device *rtc = NULL; | ||
889 | struct rtc_time tm; | 878 | struct rtc_time tm; |
890 | struct m41t80_data *m41t80_data = NULL; | 879 | struct m41t80_data *m41t80_data = NULL; |
891 | bool wakeup_source = false; | 880 | bool wakeup_source = false; |
@@ -909,6 +898,10 @@ static int m41t80_probe(struct i2c_client *client, | |||
909 | m41t80_data->features = id->driver_data; | 898 | m41t80_data->features = id->driver_data; |
910 | i2c_set_clientdata(client, m41t80_data); | 899 | i2c_set_clientdata(client, m41t80_data); |
911 | 900 | ||
901 | m41t80_data->rtc = devm_rtc_allocate_device(&client->dev); | ||
902 | if (IS_ERR(m41t80_data->rtc)) | ||
903 | return PTR_ERR(m41t80_data->rtc); | ||
904 | |||
912 | #ifdef CONFIG_OF | 905 | #ifdef CONFIG_OF |
913 | wakeup_source = of_property_read_bool(client->dev.of_node, | 906 | wakeup_source = of_property_read_bool(client->dev.of_node, |
914 | "wakeup-source"); | 907 | "wakeup-source"); |
@@ -932,15 +925,11 @@ static int m41t80_probe(struct i2c_client *client, | |||
932 | device_init_wakeup(&client->dev, true); | 925 | device_init_wakeup(&client->dev, true); |
933 | } | 926 | } |
934 | 927 | ||
935 | rtc = devm_rtc_device_register(&client->dev, client->name, | 928 | m41t80_data->rtc->ops = &m41t80_rtc_ops; |
936 | &m41t80_rtc_ops, THIS_MODULE); | ||
937 | if (IS_ERR(rtc)) | ||
938 | return PTR_ERR(rtc); | ||
939 | 929 | ||
940 | m41t80_data->rtc = rtc; | ||
941 | if (client->irq <= 0) { | 930 | if (client->irq <= 0) { |
942 | /* We cannot support UIE mode if we do not have an IRQ line */ | 931 | /* We cannot support UIE mode if we do not have an IRQ line */ |
943 | rtc->uie_unsupported = 1; | 932 | m41t80_data->rtc->uie_unsupported = 1; |
944 | } | 933 | } |
945 | 934 | ||
946 | /* Make sure HT (Halt Update) bit is cleared */ | 935 | /* Make sure HT (Halt Update) bit is cleared */ |
@@ -948,7 +937,7 @@ static int m41t80_probe(struct i2c_client *client, | |||
948 | 937 | ||
949 | if (rc >= 0 && rc & M41T80_ALHOUR_HT) { | 938 | if (rc >= 0 && rc & M41T80_ALHOUR_HT) { |
950 | if (m41t80_data->features & M41T80_FEATURE_HT) { | 939 | if (m41t80_data->features & M41T80_FEATURE_HT) { |
951 | m41t80_get_datetime(client, &tm); | 940 | m41t80_rtc_read_time(&client->dev, &tm); |
952 | dev_info(&client->dev, "HT bit was set!\n"); | 941 | dev_info(&client->dev, "HT bit was set!\n"); |
953 | dev_info(&client->dev, | 942 | dev_info(&client->dev, |
954 | "Power Down at %04i-%02i-%02i %02i:%02i:%02i\n", | 943 | "Power Down at %04i-%02i-%02i %02i:%02i:%02i\n", |
@@ -993,6 +982,11 @@ static int m41t80_probe(struct i2c_client *client, | |||
993 | if (m41t80_data->features & M41T80_FEATURE_SQ) | 982 | if (m41t80_data->features & M41T80_FEATURE_SQ) |
994 | m41t80_sqw_register_clk(m41t80_data); | 983 | m41t80_sqw_register_clk(m41t80_data); |
995 | #endif | 984 | #endif |
985 | |||
986 | rc = rtc_register_device(m41t80_data->rtc); | ||
987 | if (rc) | ||
988 | return rc; | ||
989 | |||
996 | return 0; | 990 | return 0; |
997 | } | 991 | } |
998 | 992 | ||
diff --git a/drivers/rtc/rtc-m41t93.c b/drivers/rtc/rtc-m41t93.c index 5ac45fc1a787..4a08a9dabc82 100644 --- a/drivers/rtc/rtc-m41t93.c +++ b/drivers/rtc/rtc-m41t93.c | |||
@@ -159,7 +159,7 @@ static int m41t93_get_time(struct device *dev, struct rtc_time *tm) | |||
159 | tm->tm_hour, tm->tm_mday, | 159 | tm->tm_hour, tm->tm_mday, |
160 | tm->tm_mon, tm->tm_year, tm->tm_wday); | 160 | tm->tm_mon, tm->tm_year, tm->tm_wday); |
161 | 161 | ||
162 | return ret < 0 ? ret : rtc_valid_tm(tm); | 162 | return ret; |
163 | } | 163 | } |
164 | 164 | ||
165 | 165 | ||
diff --git a/drivers/rtc/rtc-m41t94.c b/drivers/rtc/rtc-m41t94.c index 1f0eb79e69f9..bab82b4be356 100644 --- a/drivers/rtc/rtc-m41t94.c +++ b/drivers/rtc/rtc-m41t94.c | |||
@@ -99,8 +99,7 @@ static int m41t94_read_time(struct device *dev, struct rtc_time *tm) | |||
99 | tm->tm_hour, tm->tm_mday, | 99 | tm->tm_hour, tm->tm_mday, |
100 | tm->tm_mon, tm->tm_year, tm->tm_wday); | 100 | tm->tm_mon, tm->tm_year, tm->tm_wday); |
101 | 101 | ||
102 | /* initial clock setting can be undefined */ | 102 | return 0; |
103 | return rtc_valid_tm(tm); | ||
104 | } | 103 | } |
105 | 104 | ||
106 | static const struct rtc_class_ops m41t94_rtc_ops = { | 105 | static const struct rtc_class_ops m41t94_rtc_ops = { |
diff --git a/drivers/rtc/rtc-m48t35.c b/drivers/rtc/rtc-m48t35.c index 810f4ea481e4..0cf6507de3c7 100644 --- a/drivers/rtc/rtc-m48t35.c +++ b/drivers/rtc/rtc-m48t35.c | |||
@@ -84,7 +84,7 @@ static int m48t35_read_time(struct device *dev, struct rtc_time *tm) | |||
84 | tm->tm_year += 100; | 84 | tm->tm_year += 100; |
85 | 85 | ||
86 | tm->tm_mon--; | 86 | tm->tm_mon--; |
87 | return rtc_valid_tm(tm); | 87 | return 0; |
88 | } | 88 | } |
89 | 89 | ||
90 | static int m48t35_set_time(struct device *dev, struct rtc_time *tm) | 90 | static int m48t35_set_time(struct device *dev, struct rtc_time *tm) |
diff --git a/drivers/rtc/rtc-m48t59.c b/drivers/rtc/rtc-m48t59.c index d99a705bec07..216fac62c888 100644 --- a/drivers/rtc/rtc-m48t59.c +++ b/drivers/rtc/rtc-m48t59.c | |||
@@ -105,7 +105,7 @@ static int m48t59_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
105 | dev_dbg(dev, "RTC read time %04d-%02d-%02d %02d/%02d/%02d\n", | 105 | dev_dbg(dev, "RTC read time %04d-%02d-%02d %02d/%02d/%02d\n", |
106 | tm->tm_year + 1900, tm->tm_mon, tm->tm_mday, | 106 | tm->tm_year + 1900, tm->tm_mon, tm->tm_mday, |
107 | tm->tm_hour, tm->tm_min, tm->tm_sec); | 107 | tm->tm_hour, tm->tm_min, tm->tm_sec); |
108 | return rtc_valid_tm(tm); | 108 | return 0; |
109 | } | 109 | } |
110 | 110 | ||
111 | static int m48t59_rtc_set_time(struct device *dev, struct rtc_time *tm) | 111 | static int m48t59_rtc_set_time(struct device *dev, struct rtc_time *tm) |
@@ -334,16 +334,16 @@ static const struct rtc_class_ops m48t02_rtc_ops = { | |||
334 | .set_time = m48t59_rtc_set_time, | 334 | .set_time = m48t59_rtc_set_time, |
335 | }; | 335 | }; |
336 | 336 | ||
337 | static ssize_t m48t59_nvram_read(struct file *filp, struct kobject *kobj, | 337 | static int m48t59_nvram_read(void *priv, unsigned int offset, void *val, |
338 | struct bin_attribute *bin_attr, | 338 | size_t size) |
339 | char *buf, loff_t pos, size_t size) | ||
340 | { | 339 | { |
341 | struct device *dev = container_of(kobj, struct device, kobj); | 340 | struct platform_device *pdev = priv; |
342 | struct platform_device *pdev = to_platform_device(dev); | 341 | struct device *dev = &pdev->dev; |
343 | struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); | 342 | struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); |
344 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); | 343 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); |
345 | ssize_t cnt = 0; | 344 | ssize_t cnt = 0; |
346 | unsigned long flags; | 345 | unsigned long flags; |
346 | u8 *buf = val; | ||
347 | 347 | ||
348 | spin_lock_irqsave(&m48t59->lock, flags); | 348 | spin_lock_irqsave(&m48t59->lock, flags); |
349 | 349 | ||
@@ -352,19 +352,19 @@ static ssize_t m48t59_nvram_read(struct file *filp, struct kobject *kobj, | |||
352 | 352 | ||
353 | spin_unlock_irqrestore(&m48t59->lock, flags); | 353 | spin_unlock_irqrestore(&m48t59->lock, flags); |
354 | 354 | ||
355 | return cnt; | 355 | return 0; |
356 | } | 356 | } |
357 | 357 | ||
358 | static ssize_t m48t59_nvram_write(struct file *filp, struct kobject *kobj, | 358 | static int m48t59_nvram_write(void *priv, unsigned int offset, void *val, |
359 | struct bin_attribute *bin_attr, | 359 | size_t size) |
360 | char *buf, loff_t pos, size_t size) | ||
361 | { | 360 | { |
362 | struct device *dev = container_of(kobj, struct device, kobj); | 361 | struct platform_device *pdev = priv; |
363 | struct platform_device *pdev = to_platform_device(dev); | 362 | struct device *dev = &pdev->dev; |
364 | struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); | 363 | struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); |
365 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); | 364 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); |
366 | ssize_t cnt = 0; | 365 | ssize_t cnt = 0; |
367 | unsigned long flags; | 366 | unsigned long flags; |
367 | u8 *buf = val; | ||
368 | 368 | ||
369 | spin_lock_irqsave(&m48t59->lock, flags); | 369 | spin_lock_irqsave(&m48t59->lock, flags); |
370 | 370 | ||
@@ -373,18 +373,9 @@ static ssize_t m48t59_nvram_write(struct file *filp, struct kobject *kobj, | |||
373 | 373 | ||
374 | spin_unlock_irqrestore(&m48t59->lock, flags); | 374 | spin_unlock_irqrestore(&m48t59->lock, flags); |
375 | 375 | ||
376 | return cnt; | 376 | return 0; |
377 | } | 377 | } |
378 | 378 | ||
379 | static struct bin_attribute m48t59_nvram_attr = { | ||
380 | .attr = { | ||
381 | .name = "nvram", | ||
382 | .mode = S_IRUGO | S_IWUSR, | ||
383 | }, | ||
384 | .read = m48t59_nvram_read, | ||
385 | .write = m48t59_nvram_write, | ||
386 | }; | ||
387 | |||
388 | static int m48t59_rtc_probe(struct platform_device *pdev) | 379 | static int m48t59_rtc_probe(struct platform_device *pdev) |
389 | { | 380 | { |
390 | struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); | 381 | struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); |
@@ -393,6 +384,14 @@ static int m48t59_rtc_probe(struct platform_device *pdev) | |||
393 | int ret = -ENOMEM; | 384 | int ret = -ENOMEM; |
394 | char *name; | 385 | char *name; |
395 | const struct rtc_class_ops *ops; | 386 | const struct rtc_class_ops *ops; |
387 | struct nvmem_config nvmem_cfg = { | ||
388 | .name = "m48t59-", | ||
389 | .word_size = 1, | ||
390 | .stride = 1, | ||
391 | .reg_read = m48t59_nvram_read, | ||
392 | .reg_write = m48t59_nvram_write, | ||
393 | .priv = pdev, | ||
394 | }; | ||
396 | 395 | ||
397 | /* This chip could be memory-mapped or I/O-mapped */ | 396 | /* This chip could be memory-mapped or I/O-mapped */ |
398 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 397 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
@@ -480,23 +479,22 @@ static int m48t59_rtc_probe(struct platform_device *pdev) | |||
480 | spin_lock_init(&m48t59->lock); | 479 | spin_lock_init(&m48t59->lock); |
481 | platform_set_drvdata(pdev, m48t59); | 480 | platform_set_drvdata(pdev, m48t59); |
482 | 481 | ||
483 | m48t59->rtc = devm_rtc_device_register(&pdev->dev, name, ops, | 482 | m48t59->rtc = devm_rtc_allocate_device(&pdev->dev); |
484 | THIS_MODULE); | ||
485 | if (IS_ERR(m48t59->rtc)) | 483 | if (IS_ERR(m48t59->rtc)) |
486 | return PTR_ERR(m48t59->rtc); | 484 | return PTR_ERR(m48t59->rtc); |
487 | 485 | ||
488 | m48t59_nvram_attr.size = pdata->offset; | 486 | m48t59->rtc->nvram_old_abi = true; |
487 | m48t59->rtc->ops = ops; | ||
489 | 488 | ||
490 | ret = sysfs_create_bin_file(&pdev->dev.kobj, &m48t59_nvram_attr); | 489 | nvmem_cfg.size = pdata->offset; |
490 | ret = rtc_nvmem_register(m48t59->rtc, &nvmem_cfg); | ||
491 | if (ret) | 491 | if (ret) |
492 | return ret; | 492 | return ret; |
493 | 493 | ||
494 | return 0; | 494 | ret = rtc_register_device(m48t59->rtc); |
495 | } | 495 | if (ret) |
496 | return ret; | ||
496 | 497 | ||
497 | static int m48t59_rtc_remove(struct platform_device *pdev) | ||
498 | { | ||
499 | sysfs_remove_bin_file(&pdev->dev.kobj, &m48t59_nvram_attr); | ||
500 | return 0; | 498 | return 0; |
501 | } | 499 | } |
502 | 500 | ||
@@ -508,7 +506,6 @@ static struct platform_driver m48t59_rtc_driver = { | |||
508 | .name = "rtc-m48t59", | 506 | .name = "rtc-m48t59", |
509 | }, | 507 | }, |
510 | .probe = m48t59_rtc_probe, | 508 | .probe = m48t59_rtc_probe, |
511 | .remove = m48t59_rtc_remove, | ||
512 | }; | 509 | }; |
513 | 510 | ||
514 | module_platform_driver(m48t59_rtc_driver); | 511 | module_platform_driver(m48t59_rtc_driver); |
diff --git a/drivers/rtc/rtc-m48t86.c b/drivers/rtc/rtc-m48t86.c index d9aea9b6d9cd..a9533535c3b7 100644 --- a/drivers/rtc/rtc-m48t86.c +++ b/drivers/rtc/rtc-m48t86.c | |||
@@ -100,7 +100,7 @@ static int m48t86_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
100 | if (m48t86_readb(dev, M48T86_HOUR) & 0x80) | 100 | if (m48t86_readb(dev, M48T86_HOUR) & 0x80) |
101 | tm->tm_hour += 12; | 101 | tm->tm_hour += 12; |
102 | 102 | ||
103 | return rtc_valid_tm(tm); | 103 | return 0; |
104 | } | 104 | } |
105 | 105 | ||
106 | static int m48t86_rtc_set_time(struct device *dev, struct rtc_time *tm) | 106 | static int m48t86_rtc_set_time(struct device *dev, struct rtc_time *tm) |
@@ -218,21 +218,21 @@ static bool m48t86_verify_chip(struct platform_device *pdev) | |||
218 | return false; | 218 | return false; |
219 | } | 219 | } |
220 | 220 | ||
221 | static struct nvmem_config m48t86_nvmem_cfg = { | ||
222 | .name = "m48t86_nvram", | ||
223 | .word_size = 1, | ||
224 | .stride = 1, | ||
225 | .size = M48T86_NVRAM_LEN, | ||
226 | .reg_read = m48t86_nvram_read, | ||
227 | .reg_write = m48t86_nvram_write, | ||
228 | }; | ||
229 | |||
230 | static int m48t86_rtc_probe(struct platform_device *pdev) | 221 | static int m48t86_rtc_probe(struct platform_device *pdev) |
231 | { | 222 | { |
232 | struct m48t86_rtc_info *info; | 223 | struct m48t86_rtc_info *info; |
233 | struct resource *res; | 224 | struct resource *res; |
234 | unsigned char reg; | 225 | unsigned char reg; |
235 | int err; | 226 | int err; |
227 | struct nvmem_config m48t86_nvmem_cfg = { | ||
228 | .name = "m48t86_nvram", | ||
229 | .word_size = 1, | ||
230 | .stride = 1, | ||
231 | .size = M48T86_NVRAM_LEN, | ||
232 | .reg_read = m48t86_nvram_read, | ||
233 | .reg_write = m48t86_nvram_write, | ||
234 | .priv = &pdev->dev, | ||
235 | }; | ||
236 | 236 | ||
237 | info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); | 237 | info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); |
238 | if (!info) | 238 | if (!info) |
@@ -264,15 +264,14 @@ static int m48t86_rtc_probe(struct platform_device *pdev) | |||
264 | return PTR_ERR(info->rtc); | 264 | return PTR_ERR(info->rtc); |
265 | 265 | ||
266 | info->rtc->ops = &m48t86_rtc_ops; | 266 | info->rtc->ops = &m48t86_rtc_ops; |
267 | |||
268 | m48t86_nvmem_cfg.priv = &pdev->dev; | ||
269 | info->rtc->nvmem_config = &m48t86_nvmem_cfg; | ||
270 | info->rtc->nvram_old_abi = true; | 267 | info->rtc->nvram_old_abi = true; |
271 | 268 | ||
272 | err = rtc_register_device(info->rtc); | 269 | err = rtc_register_device(info->rtc); |
273 | if (err) | 270 | if (err) |
274 | return err; | 271 | return err; |
275 | 272 | ||
273 | rtc_nvmem_register(info->rtc, &m48t86_nvmem_cfg); | ||
274 | |||
276 | /* read battery status */ | 275 | /* read battery status */ |
277 | reg = m48t86_readb(&pdev->dev, M48T86_D); | 276 | reg = m48t86_readb(&pdev->dev, M48T86_D); |
278 | dev_info(&pdev->dev, "battery %s\n", | 277 | dev_info(&pdev->dev, "battery %s\n", |
diff --git a/drivers/rtc/rtc-max6900.c b/drivers/rtc/rtc-max6900.c index cbdc86a560ba..ab60f13fa3ef 100644 --- a/drivers/rtc/rtc-max6900.c +++ b/drivers/rtc/rtc-max6900.c | |||
@@ -139,8 +139,9 @@ static int max6900_i2c_write_regs(struct i2c_client *client, u8 const *buf) | |||
139 | return -EIO; | 139 | return -EIO; |
140 | } | 140 | } |
141 | 141 | ||
142 | static int max6900_i2c_read_time(struct i2c_client *client, struct rtc_time *tm) | 142 | static int max6900_rtc_read_time(struct device *dev, struct rtc_time *tm) |
143 | { | 143 | { |
144 | struct i2c_client *client = to_i2c_client(dev); | ||
144 | int rc; | 145 | int rc; |
145 | u8 regs[MAX6900_REG_LEN]; | 146 | u8 regs[MAX6900_REG_LEN]; |
146 | 147 | ||
@@ -157,7 +158,7 @@ static int max6900_i2c_read_time(struct i2c_client *client, struct rtc_time *tm) | |||
157 | bcd2bin(regs[MAX6900_REG_CENTURY]) * 100 - 1900; | 158 | bcd2bin(regs[MAX6900_REG_CENTURY]) * 100 - 1900; |
158 | tm->tm_wday = bcd2bin(regs[MAX6900_REG_DW]); | 159 | tm->tm_wday = bcd2bin(regs[MAX6900_REG_DW]); |
159 | 160 | ||
160 | return rtc_valid_tm(tm); | 161 | return 0; |
161 | } | 162 | } |
162 | 163 | ||
163 | static int max6900_i2c_clear_write_protect(struct i2c_client *client) | 164 | static int max6900_i2c_clear_write_protect(struct i2c_client *client) |
@@ -165,9 +166,9 @@ static int max6900_i2c_clear_write_protect(struct i2c_client *client) | |||
165 | return i2c_smbus_write_byte_data(client, MAX6900_REG_CONTROL_WRITE, 0); | 166 | return i2c_smbus_write_byte_data(client, MAX6900_REG_CONTROL_WRITE, 0); |
166 | } | 167 | } |
167 | 168 | ||
168 | static int | 169 | static int max6900_rtc_set_time(struct device *dev, struct rtc_time *tm) |
169 | max6900_i2c_set_time(struct i2c_client *client, struct rtc_time const *tm) | ||
170 | { | 170 | { |
171 | struct i2c_client *client = to_i2c_client(dev); | ||
171 | u8 regs[MAX6900_REG_LEN]; | 172 | u8 regs[MAX6900_REG_LEN]; |
172 | int rc; | 173 | int rc; |
173 | 174 | ||
@@ -193,16 +194,6 @@ max6900_i2c_set_time(struct i2c_client *client, struct rtc_time const *tm) | |||
193 | return 0; | 194 | return 0; |
194 | } | 195 | } |
195 | 196 | ||
196 | static int max6900_rtc_read_time(struct device *dev, struct rtc_time *tm) | ||
197 | { | ||
198 | return max6900_i2c_read_time(to_i2c_client(dev), tm); | ||
199 | } | ||
200 | |||
201 | static int max6900_rtc_set_time(struct device *dev, struct rtc_time *tm) | ||
202 | { | ||
203 | return max6900_i2c_set_time(to_i2c_client(dev), tm); | ||
204 | } | ||
205 | |||
206 | static const struct rtc_class_ops max6900_rtc_ops = { | 197 | static const struct rtc_class_ops max6900_rtc_ops = { |
207 | .read_time = max6900_rtc_read_time, | 198 | .read_time = max6900_rtc_read_time, |
208 | .set_time = max6900_rtc_set_time, | 199 | .set_time = max6900_rtc_set_time, |
diff --git a/drivers/rtc/rtc-max6902.c b/drivers/rtc/rtc-max6902.c index 315d09e0f2c1..745827463367 100644 --- a/drivers/rtc/rtc-max6902.c +++ b/drivers/rtc/rtc-max6902.c | |||
@@ -85,7 +85,7 @@ static int max6902_read_time(struct device *dev, struct rtc_time *dt) | |||
85 | dt->tm_year += century; | 85 | dt->tm_year += century; |
86 | dt->tm_year -= 1900; | 86 | dt->tm_year -= 1900; |
87 | 87 | ||
88 | return rtc_valid_tm(dt); | 88 | return 0; |
89 | } | 89 | } |
90 | 90 | ||
91 | static int max6902_set_time(struct device *dev, struct rtc_time *dt) | 91 | static int max6902_set_time(struct device *dev, struct rtc_time *dt) |
diff --git a/drivers/rtc/rtc-max6916.c b/drivers/rtc/rtc-max6916.c index 623ab27b2757..7e908a490cf6 100644 --- a/drivers/rtc/rtc-max6916.c +++ b/drivers/rtc/rtc-max6916.c | |||
@@ -75,7 +75,7 @@ static int max6916_read_time(struct device *dev, struct rtc_time *dt) | |||
75 | dt->tm_wday = bcd2bin(buf[5]) - 1; | 75 | dt->tm_wday = bcd2bin(buf[5]) - 1; |
76 | dt->tm_year = bcd2bin(buf[6]) + 100; | 76 | dt->tm_year = bcd2bin(buf[6]) + 100; |
77 | 77 | ||
78 | return rtc_valid_tm(dt); | 78 | return 0; |
79 | } | 79 | } |
80 | 80 | ||
81 | static int max6916_set_time(struct device *dev, struct rtc_time *dt) | 81 | static int max6916_set_time(struct device *dev, struct rtc_time *dt) |
diff --git a/drivers/rtc/rtc-max77686.c b/drivers/rtc/rtc-max77686.c index 182fdd00e290..cefde273fae6 100644 --- a/drivers/rtc/rtc-max77686.c +++ b/drivers/rtc/rtc-max77686.c | |||
@@ -364,11 +364,9 @@ static int max77686_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
364 | 364 | ||
365 | max77686_rtc_data_to_tm(data, tm, info); | 365 | max77686_rtc_data_to_tm(data, tm, info); |
366 | 366 | ||
367 | ret = rtc_valid_tm(tm); | ||
368 | |||
369 | out: | 367 | out: |
370 | mutex_unlock(&info->lock); | 368 | mutex_unlock(&info->lock); |
371 | return ret; | 369 | return 0; |
372 | } | 370 | } |
373 | 371 | ||
374 | static int max77686_rtc_set_time(struct device *dev, struct rtc_time *tm) | 372 | static int max77686_rtc_set_time(struct device *dev, struct rtc_time *tm) |
diff --git a/drivers/rtc/rtc-max8997.c b/drivers/rtc/rtc-max8997.c index db984d4bf952..e8cee123e8aa 100644 --- a/drivers/rtc/rtc-max8997.c +++ b/drivers/rtc/rtc-max8997.c | |||
@@ -153,7 +153,7 @@ static int max8997_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
153 | 153 | ||
154 | max8997_rtc_data_to_tm(data, tm, info->rtc_24hr_mode); | 154 | max8997_rtc_data_to_tm(data, tm, info->rtc_24hr_mode); |
155 | 155 | ||
156 | return rtc_valid_tm(tm); | 156 | return 0; |
157 | } | 157 | } |
158 | 158 | ||
159 | static int max8997_rtc_set_time(struct device *dev, struct rtc_time *tm) | 159 | static int max8997_rtc_set_time(struct device *dev, struct rtc_time *tm) |
diff --git a/drivers/rtc/rtc-max8998.c b/drivers/rtc/rtc-max8998.c index 30804b00985e..d8c0f9b3f87d 100644 --- a/drivers/rtc/rtc-max8998.c +++ b/drivers/rtc/rtc-max8998.c | |||
@@ -120,7 +120,7 @@ static int max8998_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
120 | 120 | ||
121 | max8998_data_to_tm(data, tm); | 121 | max8998_data_to_tm(data, tm); |
122 | 122 | ||
123 | return rtc_valid_tm(tm); | 123 | return 0; |
124 | } | 124 | } |
125 | 125 | ||
126 | static int max8998_rtc_set_time(struct device *dev, struct rtc_time *tm) | 126 | static int max8998_rtc_set_time(struct device *dev, struct rtc_time *tm) |
diff --git a/drivers/rtc/rtc-mc13xxx.c b/drivers/rtc/rtc-mc13xxx.c index 30b8ef6a3676..1f892b238ddb 100644 --- a/drivers/rtc/rtc-mc13xxx.c +++ b/drivers/rtc/rtc-mc13xxx.c | |||
@@ -85,7 +85,7 @@ static int mc13xxx_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
85 | 85 | ||
86 | rtc_time64_to_tm((time64_t)days1 * SEC_PER_DAY + seconds, tm); | 86 | rtc_time64_to_tm((time64_t)days1 * SEC_PER_DAY + seconds, tm); |
87 | 87 | ||
88 | return rtc_valid_tm(tm); | 88 | return 0; |
89 | } | 89 | } |
90 | 90 | ||
91 | static int mc13xxx_rtc_set_mmss(struct device *dev, time64_t secs) | 91 | static int mc13xxx_rtc_set_mmss(struct device *dev, time64_t secs) |
diff --git a/drivers/rtc/rtc-mcp795.c b/drivers/rtc/rtc-mcp795.c index 77f21331ae21..00e11c1b2186 100644 --- a/drivers/rtc/rtc-mcp795.c +++ b/drivers/rtc/rtc-mcp795.c | |||
@@ -82,7 +82,7 @@ static int mcp795_rtcc_write(struct device *dev, u8 addr, u8 *data, u8 count) | |||
82 | { | 82 | { |
83 | struct spi_device *spi = to_spi_device(dev); | 83 | struct spi_device *spi = to_spi_device(dev); |
84 | int ret; | 84 | int ret; |
85 | u8 tx[2 + count]; | 85 | u8 tx[257]; |
86 | 86 | ||
87 | tx[0] = MCP795_WRITE; | 87 | tx[0] = MCP795_WRITE; |
88 | tx[1] = addr; | 88 | tx[1] = addr; |
@@ -262,7 +262,7 @@ static int mcp795_read_time(struct device *dev, struct rtc_time *tim) | |||
262 | tim->tm_year + 1900, tim->tm_mon, tim->tm_mday, | 262 | tim->tm_year + 1900, tim->tm_mon, tim->tm_mday, |
263 | tim->tm_wday, tim->tm_hour, tim->tm_min, tim->tm_sec); | 263 | tim->tm_wday, tim->tm_hour, tim->tm_min, tim->tm_sec); |
264 | 264 | ||
265 | return rtc_valid_tm(tim); | 265 | return 0; |
266 | } | 266 | } |
267 | 267 | ||
268 | static int mcp795_set_alarm(struct device *dev, struct rtc_wkalrm *alm) | 268 | static int mcp795_set_alarm(struct device *dev, struct rtc_wkalrm *alm) |
diff --git a/drivers/rtc/rtc-mpc5121.c b/drivers/rtc/rtc-mpc5121.c index 4ca4daa0b8f3..dd0364293bc0 100644 --- a/drivers/rtc/rtc-mpc5121.c +++ b/drivers/rtc/rtc-mpc5121.c | |||
@@ -122,7 +122,7 @@ static int mpc5121_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
122 | */ | 122 | */ |
123 | mpc5121_rtc_update_smh(regs, tm); | 123 | mpc5121_rtc_update_smh(regs, tm); |
124 | 124 | ||
125 | return rtc_valid_tm(tm); | 125 | return 0; |
126 | } | 126 | } |
127 | 127 | ||
128 | static int mpc5121_rtc_set_time(struct device *dev, struct rtc_time *tm) | 128 | static int mpc5121_rtc_set_time(struct device *dev, struct rtc_time *tm) |
diff --git a/drivers/rtc/rtc-mrst.c b/drivers/rtc/rtc-mrst.c index 7334c44fa7c3..fcb9de5218b2 100644 --- a/drivers/rtc/rtc-mrst.c +++ b/drivers/rtc/rtc-mrst.c | |||
@@ -105,7 +105,7 @@ static int mrst_read_time(struct device *dev, struct rtc_time *time) | |||
105 | /* Adjust for the 1972/1900 */ | 105 | /* Adjust for the 1972/1900 */ |
106 | time->tm_year += 72; | 106 | time->tm_year += 72; |
107 | time->tm_mon--; | 107 | time->tm_mon--; |
108 | return rtc_valid_tm(time); | 108 | return 0; |
109 | } | 109 | } |
110 | 110 | ||
111 | static int mrst_set_time(struct device *dev, struct rtc_time *time) | 111 | static int mrst_set_time(struct device *dev, struct rtc_time *time) |
@@ -122,7 +122,7 @@ static int mrst_set_time(struct device *dev, struct rtc_time *time) | |||
122 | min = time->tm_min; | 122 | min = time->tm_min; |
123 | sec = time->tm_sec; | 123 | sec = time->tm_sec; |
124 | 124 | ||
125 | if (yrs < 72 || yrs > 138) | 125 | if (yrs < 72 || yrs > 172) |
126 | return -EINVAL; | 126 | return -EINVAL; |
127 | yrs -= 72; | 127 | yrs -= 72; |
128 | 128 | ||
diff --git a/drivers/rtc/rtc-msm6242.c b/drivers/rtc/rtc-msm6242.c index c1c5c4e3b3b4..0c72a2e8ec67 100644 --- a/drivers/rtc/rtc-msm6242.c +++ b/drivers/rtc/rtc-msm6242.c | |||
@@ -155,7 +155,7 @@ static int msm6242_read_time(struct device *dev, struct rtc_time *tm) | |||
155 | 155 | ||
156 | msm6242_unlock(priv); | 156 | msm6242_unlock(priv); |
157 | 157 | ||
158 | return rtc_valid_tm(tm); | 158 | return 0; |
159 | } | 159 | } |
160 | 160 | ||
161 | static int msm6242_set_time(struct device *dev, struct rtc_time *tm) | 161 | static int msm6242_set_time(struct device *dev, struct rtc_time *tm) |
diff --git a/drivers/rtc/rtc-mt7622.c b/drivers/rtc/rtc-mt7622.c index d79b9ae4d237..fd0cea722286 100644 --- a/drivers/rtc/rtc-mt7622.c +++ b/drivers/rtc/rtc-mt7622.c | |||
@@ -232,7 +232,7 @@ static int mtk_rtc_gettime(struct device *dev, struct rtc_time *tm) | |||
232 | 232 | ||
233 | mtk_rtc_get_alarm_or_time(hw, tm, MTK_TC); | 233 | mtk_rtc_get_alarm_or_time(hw, tm, MTK_TC); |
234 | 234 | ||
235 | return rtc_valid_tm(tm); | 235 | return 0; |
236 | } | 236 | } |
237 | 237 | ||
238 | static int mtk_rtc_settime(struct device *dev, struct rtc_time *tm) | 238 | static int mtk_rtc_settime(struct device *dev, struct rtc_time *tm) |
@@ -307,6 +307,7 @@ static const struct of_device_id mtk_rtc_match[] = { | |||
307 | { .compatible = "mediatek,soc-rtc" }, | 307 | { .compatible = "mediatek,soc-rtc" }, |
308 | {}, | 308 | {}, |
309 | }; | 309 | }; |
310 | MODULE_DEVICE_TABLE(of, mtk_rtc_match); | ||
310 | 311 | ||
311 | static int mtk_rtc_probe(struct platform_device *pdev) | 312 | static int mtk_rtc_probe(struct platform_device *pdev) |
312 | { | 313 | { |
diff --git a/drivers/rtc/rtc-mv.c b/drivers/rtc/rtc-mv.c index 79bb28617d45..bc52dbb0c0e2 100644 --- a/drivers/rtc/rtc-mv.c +++ b/drivers/rtc/rtc-mv.c | |||
@@ -94,7 +94,7 @@ static int mv_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
94 | /* hw counts from year 2000, but tm_year is relative to 1900 */ | 94 | /* hw counts from year 2000, but tm_year is relative to 1900 */ |
95 | tm->tm_year = bcd2bin(year) + 100; | 95 | tm->tm_year = bcd2bin(year) + 100; |
96 | 96 | ||
97 | return rtc_valid_tm(tm); | 97 | return 0; |
98 | } | 98 | } |
99 | 99 | ||
100 | static int mv_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alm) | 100 | static int mv_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alm) |
@@ -223,7 +223,6 @@ static int __init mv_rtc_probe(struct platform_device *pdev) | |||
223 | struct resource *res; | 223 | struct resource *res; |
224 | struct rtc_plat_data *pdata; | 224 | struct rtc_plat_data *pdata; |
225 | u32 rtc_time; | 225 | u32 rtc_time; |
226 | u32 rtc_date; | ||
227 | int ret = 0; | 226 | int ret = 0; |
228 | 227 | ||
229 | pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); | 228 | pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); |
@@ -259,17 +258,6 @@ static int __init mv_rtc_probe(struct platform_device *pdev) | |||
259 | } | 258 | } |
260 | } | 259 | } |
261 | 260 | ||
262 | /* | ||
263 | * A date after January 19th, 2038 does not fit on 32 bits and | ||
264 | * will confuse the kernel and userspace. Reset to a sane date | ||
265 | * (January 1st, 2013) if we're after 2038. | ||
266 | */ | ||
267 | rtc_date = readl(pdata->ioaddr + RTC_DATE_REG_OFFS); | ||
268 | if (bcd2bin((rtc_date >> RTC_YEAR_OFFS) & 0xff) >= 38) { | ||
269 | dev_info(&pdev->dev, "invalid RTC date, resetting to January 1st, 2013\n"); | ||
270 | writel(0x130101, pdata->ioaddr + RTC_DATE_REG_OFFS); | ||
271 | } | ||
272 | |||
273 | pdata->irq = platform_get_irq(pdev, 0); | 261 | pdata->irq = platform_get_irq(pdev, 0); |
274 | 262 | ||
275 | platform_set_drvdata(pdev, pdata); | 263 | platform_set_drvdata(pdev, pdata); |
diff --git a/drivers/rtc/rtc-mxc_v2.c b/drivers/rtc/rtc-mxc_v2.c index 784221dfc9c7..9e14efb990b2 100644 --- a/drivers/rtc/rtc-mxc_v2.c +++ b/drivers/rtc/rtc-mxc_v2.c | |||
@@ -273,7 +273,7 @@ static const struct rtc_class_ops mxc_rtc_ops = { | |||
273 | .alarm_irq_enable = mxc_rtc_alarm_irq_enable, | 273 | .alarm_irq_enable = mxc_rtc_alarm_irq_enable, |
274 | }; | 274 | }; |
275 | 275 | ||
276 | static int mxc_rtc_wait_for_flag(void *__iomem ioaddr, int flag) | 276 | static int mxc_rtc_wait_for_flag(void __iomem *ioaddr, int flag) |
277 | { | 277 | { |
278 | unsigned int timeout = REG_READ_TIMEOUT; | 278 | unsigned int timeout = REG_READ_TIMEOUT; |
279 | 279 | ||
diff --git a/drivers/rtc/rtc-nuc900.c b/drivers/rtc/rtc-nuc900.c index 4ed81117cf5f..7da664a77181 100644 --- a/drivers/rtc/rtc-nuc900.c +++ b/drivers/rtc/rtc-nuc900.c | |||
@@ -102,8 +102,8 @@ static int *check_rtc_access_enable(struct nuc900_rtc *nuc900_rtc) | |||
102 | return NULL; | 102 | return NULL; |
103 | } | 103 | } |
104 | 104 | ||
105 | static int nuc900_rtc_bcd2bin(unsigned int timereg, | 105 | static void nuc900_rtc_bcd2bin(unsigned int timereg, |
106 | unsigned int calreg, struct rtc_time *tm) | 106 | unsigned int calreg, struct rtc_time *tm) |
107 | { | 107 | { |
108 | tm->tm_mday = bcd2bin(calreg >> 0); | 108 | tm->tm_mday = bcd2bin(calreg >> 0); |
109 | tm->tm_mon = bcd2bin(calreg >> 8); | 109 | tm->tm_mon = bcd2bin(calreg >> 8); |
@@ -112,8 +112,6 @@ static int nuc900_rtc_bcd2bin(unsigned int timereg, | |||
112 | tm->tm_sec = bcd2bin(timereg >> 0); | 112 | tm->tm_sec = bcd2bin(timereg >> 0); |
113 | tm->tm_min = bcd2bin(timereg >> 8); | 113 | tm->tm_min = bcd2bin(timereg >> 8); |
114 | tm->tm_hour = bcd2bin(timereg >> 16); | 114 | tm->tm_hour = bcd2bin(timereg >> 16); |
115 | |||
116 | return rtc_valid_tm(tm); | ||
117 | } | 115 | } |
118 | 116 | ||
119 | static void nuc900_rtc_bin2bcd(struct device *dev, struct rtc_time *settm, | 117 | static void nuc900_rtc_bin2bcd(struct device *dev, struct rtc_time *settm, |
@@ -156,7 +154,9 @@ static int nuc900_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
156 | timeval = __raw_readl(rtc->rtc_reg + REG_RTC_TLR); | 154 | timeval = __raw_readl(rtc->rtc_reg + REG_RTC_TLR); |
157 | clrval = __raw_readl(rtc->rtc_reg + REG_RTC_CLR); | 155 | clrval = __raw_readl(rtc->rtc_reg + REG_RTC_CLR); |
158 | 156 | ||
159 | return nuc900_rtc_bcd2bin(timeval, clrval, tm); | 157 | nuc900_rtc_bcd2bin(timeval, clrval, tm); |
158 | |||
159 | return 0; | ||
160 | } | 160 | } |
161 | 161 | ||
162 | static int nuc900_rtc_set_time(struct device *dev, struct rtc_time *tm) | 162 | static int nuc900_rtc_set_time(struct device *dev, struct rtc_time *tm) |
@@ -189,7 +189,9 @@ static int nuc900_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
189 | timeval = __raw_readl(rtc->rtc_reg + REG_RTC_TAR); | 189 | timeval = __raw_readl(rtc->rtc_reg + REG_RTC_TAR); |
190 | carval = __raw_readl(rtc->rtc_reg + REG_RTC_CAR); | 190 | carval = __raw_readl(rtc->rtc_reg + REG_RTC_CAR); |
191 | 191 | ||
192 | return nuc900_rtc_bcd2bin(timeval, carval, &alrm->time); | 192 | nuc900_rtc_bcd2bin(timeval, carval, &alrm->time); |
193 | |||
194 | return rtc_valid_tm(&alrm->time); | ||
193 | } | 195 | } |
194 | 196 | ||
195 | static int nuc900_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) | 197 | static int nuc900_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) |
diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c index 09ef802d6e54..39086398833e 100644 --- a/drivers/rtc/rtc-omap.c +++ b/drivers/rtc/rtc-omap.c | |||
@@ -273,9 +273,6 @@ static int omap_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) | |||
273 | /* this hardware doesn't support "don't care" alarm fields */ | 273 | /* this hardware doesn't support "don't care" alarm fields */ |
274 | static int tm2bcd(struct rtc_time *tm) | 274 | static int tm2bcd(struct rtc_time *tm) |
275 | { | 275 | { |
276 | if (rtc_valid_tm(tm) != 0) | ||
277 | return -EINVAL; | ||
278 | |||
279 | tm->tm_sec = bin2bcd(tm->tm_sec); | 276 | tm->tm_sec = bin2bcd(tm->tm_sec); |
280 | tm->tm_min = bin2bcd(tm->tm_min); | 277 | tm->tm_min = bin2bcd(tm->tm_min); |
281 | tm->tm_hour = bin2bcd(tm->tm_hour); | 278 | tm->tm_hour = bin2bcd(tm->tm_hour); |
@@ -850,7 +847,6 @@ static int omap_rtc_probe(struct platform_device *pdev) | |||
850 | 847 | ||
851 | rtc->rtc->ops = &omap_rtc_ops; | 848 | rtc->rtc->ops = &omap_rtc_ops; |
852 | omap_rtc_nvmem_config.priv = rtc; | 849 | omap_rtc_nvmem_config.priv = rtc; |
853 | rtc->rtc->nvmem_config = &omap_rtc_nvmem_config; | ||
854 | 850 | ||
855 | /* handle periodic and alarm irqs */ | 851 | /* handle periodic and alarm irqs */ |
856 | ret = devm_request_irq(&pdev->dev, rtc->irq_timer, rtc_irq, 0, | 852 | ret = devm_request_irq(&pdev->dev, rtc->irq_timer, rtc_irq, 0, |
@@ -886,6 +882,8 @@ static int omap_rtc_probe(struct platform_device *pdev) | |||
886 | if (ret) | 882 | if (ret) |
887 | goto err; | 883 | goto err; |
888 | 884 | ||
885 | rtc_nvmem_register(rtc->rtc, &omap_rtc_nvmem_config); | ||
886 | |||
889 | return 0; | 887 | return 0; |
890 | 888 | ||
891 | err: | 889 | err: |
diff --git a/drivers/rtc/rtc-pcap.c b/drivers/rtc/rtc-pcap.c index c4433240d8a9..c05f524ba9af 100644 --- a/drivers/rtc/rtc-pcap.c +++ b/drivers/rtc/rtc-pcap.c | |||
@@ -95,7 +95,7 @@ static int pcap_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
95 | 95 | ||
96 | rtc_time_to_tm(secs, tm); | 96 | rtc_time_to_tm(secs, tm); |
97 | 97 | ||
98 | return rtc_valid_tm(tm); | 98 | return 0; |
99 | } | 99 | } |
100 | 100 | ||
101 | static int pcap_rtc_set_mmss(struct device *dev, unsigned long secs) | 101 | static int pcap_rtc_set_mmss(struct device *dev, unsigned long secs) |
diff --git a/drivers/rtc/rtc-pcf2123.c b/drivers/rtc/rtc-pcf2123.c index 8895f77726e8..e5222c5d8223 100644 --- a/drivers/rtc/rtc-pcf2123.c +++ b/drivers/rtc/rtc-pcf2123.c | |||
@@ -289,7 +289,7 @@ static int pcf2123_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
289 | tm->tm_sec, tm->tm_min, tm->tm_hour, | 289 | tm->tm_sec, tm->tm_min, tm->tm_hour, |
290 | tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday); | 290 | tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday); |
291 | 291 | ||
292 | return rtc_valid_tm(tm); | 292 | return 0; |
293 | } | 293 | } |
294 | 294 | ||
295 | static int pcf2123_rtc_set_time(struct device *dev, struct rtc_time *tm) | 295 | static int pcf2123_rtc_set_time(struct device *dev, struct rtc_time *tm) |
diff --git a/drivers/rtc/rtc-pcf2127.c b/drivers/rtc/rtc-pcf2127.c index f33447c5db85..e83be1852c2f 100644 --- a/drivers/rtc/rtc-pcf2127.c +++ b/drivers/rtc/rtc-pcf2127.c | |||
@@ -111,7 +111,7 @@ static int pcf2127_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
111 | tm->tm_sec, tm->tm_min, tm->tm_hour, | 111 | tm->tm_sec, tm->tm_min, tm->tm_hour, |
112 | tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday); | 112 | tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday); |
113 | 113 | ||
114 | return rtc_valid_tm(tm); | 114 | return 0; |
115 | } | 115 | } |
116 | 116 | ||
117 | static int pcf2127_rtc_set_time(struct device *dev, struct rtc_time *tm) | 117 | static int pcf2127_rtc_set_time(struct device *dev, struct rtc_time *tm) |
diff --git a/drivers/rtc/rtc-pcf50633.c b/drivers/rtc/rtc-pcf50633.c index 00c31c91b245..ef72b0c389d7 100644 --- a/drivers/rtc/rtc-pcf50633.c +++ b/drivers/rtc/rtc-pcf50633.c | |||
@@ -135,7 +135,7 @@ static int pcf50633_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
135 | tm->tm_mday, tm->tm_mon, tm->tm_year, | 135 | tm->tm_mday, tm->tm_mon, tm->tm_year, |
136 | tm->tm_hour, tm->tm_min, tm->tm_sec); | 136 | tm->tm_hour, tm->tm_min, tm->tm_sec); |
137 | 137 | ||
138 | return rtc_valid_tm(tm); | 138 | return 0; |
139 | } | 139 | } |
140 | 140 | ||
141 | static int pcf50633_rtc_set_time(struct device *dev, struct rtc_time *tm) | 141 | static int pcf50633_rtc_set_time(struct device *dev, struct rtc_time *tm) |
diff --git a/drivers/rtc/rtc-pcf85063.c b/drivers/rtc/rtc-pcf85063.c index a06dff994c83..49bcbb3d4a69 100644 --- a/drivers/rtc/rtc-pcf85063.c +++ b/drivers/rtc/rtc-pcf85063.c | |||
@@ -70,7 +70,7 @@ static int pcf85063_start_clock(struct i2c_client *client, u8 ctrl1) | |||
70 | s32 ret; | 70 | s32 ret; |
71 | 71 | ||
72 | /* start the clock */ | 72 | /* start the clock */ |
73 | ctrl1 &= PCF85063_REG_CTRL1_STOP; | 73 | ctrl1 &= ~PCF85063_REG_CTRL1_STOP; |
74 | 74 | ||
75 | ret = i2c_smbus_write_byte_data(client, PCF85063_REG_CTRL1, ctrl1); | 75 | ret = i2c_smbus_write_byte_data(client, PCF85063_REG_CTRL1, ctrl1); |
76 | if (ret < 0) { | 76 | if (ret < 0) { |
@@ -81,8 +81,9 @@ static int pcf85063_start_clock(struct i2c_client *client, u8 ctrl1) | |||
81 | return 0; | 81 | return 0; |
82 | } | 82 | } |
83 | 83 | ||
84 | static int pcf85063_get_datetime(struct i2c_client *client, struct rtc_time *tm) | 84 | static int pcf85063_rtc_read_time(struct device *dev, struct rtc_time *tm) |
85 | { | 85 | { |
86 | struct i2c_client *client = to_i2c_client(dev); | ||
86 | int rc; | 87 | int rc; |
87 | u8 regs[7]; | 88 | u8 regs[7]; |
88 | 89 | ||
@@ -114,11 +115,12 @@ static int pcf85063_get_datetime(struct i2c_client *client, struct rtc_time *tm) | |||
114 | tm->tm_year = bcd2bin(regs[6]); | 115 | tm->tm_year = bcd2bin(regs[6]); |
115 | tm->tm_year += 100; | 116 | tm->tm_year += 100; |
116 | 117 | ||
117 | return rtc_valid_tm(tm); | 118 | return 0; |
118 | } | 119 | } |
119 | 120 | ||
120 | static int pcf85063_set_datetime(struct i2c_client *client, struct rtc_time *tm) | 121 | static int pcf85063_rtc_set_time(struct device *dev, struct rtc_time *tm) |
121 | { | 122 | { |
123 | struct i2c_client *client = to_i2c_client(dev); | ||
122 | int rc; | 124 | int rc; |
123 | u8 regs[7]; | 125 | u8 regs[7]; |
124 | u8 ctrl1; | 126 | u8 ctrl1; |
@@ -172,16 +174,6 @@ static int pcf85063_set_datetime(struct i2c_client *client, struct rtc_time *tm) | |||
172 | return 0; | 174 | return 0; |
173 | } | 175 | } |
174 | 176 | ||
175 | static int pcf85063_rtc_read_time(struct device *dev, struct rtc_time *tm) | ||
176 | { | ||
177 | return pcf85063_get_datetime(to_i2c_client(dev), tm); | ||
178 | } | ||
179 | |||
180 | static int pcf85063_rtc_set_time(struct device *dev, struct rtc_time *tm) | ||
181 | { | ||
182 | return pcf85063_set_datetime(to_i2c_client(dev), tm); | ||
183 | } | ||
184 | |||
185 | static const struct rtc_class_ops pcf85063_rtc_ops = { | 177 | static const struct rtc_class_ops pcf85063_rtc_ops = { |
186 | .read_time = pcf85063_rtc_read_time, | 178 | .read_time = pcf85063_rtc_read_time, |
187 | .set_time = pcf85063_rtc_set_time | 179 | .set_time = pcf85063_rtc_set_time |
diff --git a/drivers/rtc/rtc-pcf8523.c b/drivers/rtc/rtc-pcf8523.c index c312af0db729..453615f8ac9a 100644 --- a/drivers/rtc/rtc-pcf8523.c +++ b/drivers/rtc/rtc-pcf8523.c | |||
@@ -192,7 +192,7 @@ static int pcf8523_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
192 | tm->tm_mon = bcd2bin(regs[5] & 0x1f) - 1; | 192 | tm->tm_mon = bcd2bin(regs[5] & 0x1f) - 1; |
193 | tm->tm_year = bcd2bin(regs[6]) + 100; | 193 | tm->tm_year = bcd2bin(regs[6]) + 100; |
194 | 194 | ||
195 | return rtc_valid_tm(tm); | 195 | return 0; |
196 | } | 196 | } |
197 | 197 | ||
198 | static int pcf8523_rtc_set_time(struct device *dev, struct rtc_time *tm) | 198 | static int pcf8523_rtc_set_time(struct device *dev, struct rtc_time *tm) |
diff --git a/drivers/rtc/rtc-pcf85363.c b/drivers/rtc/rtc-pcf85363.c index ea04e9f0930b..c04a1edcd571 100644 --- a/drivers/rtc/rtc-pcf85363.c +++ b/drivers/rtc/rtc-pcf85363.c | |||
@@ -73,6 +73,43 @@ | |||
73 | #define CTRL_RESETS 0x2f | 73 | #define CTRL_RESETS 0x2f |
74 | #define CTRL_RAM 0x40 | 74 | #define CTRL_RAM 0x40 |
75 | 75 | ||
76 | #define ALRM_SEC_A1E BIT(0) | ||
77 | #define ALRM_MIN_A1E BIT(1) | ||
78 | #define ALRM_HR_A1E BIT(2) | ||
79 | #define ALRM_DAY_A1E BIT(3) | ||
80 | #define ALRM_MON_A1E BIT(4) | ||
81 | #define ALRM_MIN_A2E BIT(5) | ||
82 | #define ALRM_HR_A2E BIT(6) | ||
83 | #define ALRM_DAY_A2E BIT(7) | ||
84 | |||
85 | #define INT_WDIE BIT(0) | ||
86 | #define INT_BSIE BIT(1) | ||
87 | #define INT_TSRIE BIT(2) | ||
88 | #define INT_A2IE BIT(3) | ||
89 | #define INT_A1IE BIT(4) | ||
90 | #define INT_OIE BIT(5) | ||
91 | #define INT_PIE BIT(6) | ||
92 | #define INT_ILP BIT(7) | ||
93 | |||
94 | #define FLAGS_TSR1F BIT(0) | ||
95 | #define FLAGS_TSR2F BIT(1) | ||
96 | #define FLAGS_TSR3F BIT(2) | ||
97 | #define FLAGS_BSF BIT(3) | ||
98 | #define FLAGS_WDF BIT(4) | ||
99 | #define FLAGS_A1F BIT(5) | ||
100 | #define FLAGS_A2F BIT(6) | ||
101 | #define FLAGS_PIF BIT(7) | ||
102 | |||
103 | #define PIN_IO_INTAPM GENMASK(1, 0) | ||
104 | #define PIN_IO_INTA_CLK 0 | ||
105 | #define PIN_IO_INTA_BAT 1 | ||
106 | #define PIN_IO_INTA_OUT 2 | ||
107 | #define PIN_IO_INTA_HIZ 3 | ||
108 | |||
109 | #define STOP_EN_STOP BIT(0) | ||
110 | |||
111 | #define RESET_CPR 0xa4 | ||
112 | |||
76 | #define NVRAM_SIZE 0x40 | 113 | #define NVRAM_SIZE 0x40 |
77 | 114 | ||
78 | static struct i2c_driver pcf85363_driver; | 115 | static struct i2c_driver pcf85363_driver; |
@@ -80,7 +117,6 @@ static struct i2c_driver pcf85363_driver; | |||
80 | struct pcf85363 { | 117 | struct pcf85363 { |
81 | struct device *dev; | 118 | struct device *dev; |
82 | struct rtc_device *rtc; | 119 | struct rtc_device *rtc; |
83 | struct nvmem_config nvmem_cfg; | ||
84 | struct regmap *regmap; | 120 | struct regmap *regmap; |
85 | }; | 121 | }; |
86 | 122 | ||
@@ -116,8 +152,12 @@ static int pcf85363_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
116 | static int pcf85363_rtc_set_time(struct device *dev, struct rtc_time *tm) | 152 | static int pcf85363_rtc_set_time(struct device *dev, struct rtc_time *tm) |
117 | { | 153 | { |
118 | struct pcf85363 *pcf85363 = dev_get_drvdata(dev); | 154 | struct pcf85363 *pcf85363 = dev_get_drvdata(dev); |
119 | unsigned char buf[DT_YEARS + 1]; | 155 | unsigned char tmp[11]; |
120 | int len = sizeof(buf); | 156 | unsigned char *buf = &tmp[2]; |
157 | int ret; | ||
158 | |||
159 | tmp[0] = STOP_EN_STOP; | ||
160 | tmp[1] = RESET_CPR; | ||
121 | 161 | ||
122 | buf[DT_100THS] = 0; | 162 | buf[DT_100THS] = 0; |
123 | buf[DT_SECS] = bin2bcd(tm->tm_sec); | 163 | buf[DT_SECS] = bin2bcd(tm->tm_sec); |
@@ -128,8 +168,116 @@ static int pcf85363_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
128 | buf[DT_MONTHS] = bin2bcd(tm->tm_mon + 1); | 168 | buf[DT_MONTHS] = bin2bcd(tm->tm_mon + 1); |
129 | buf[DT_YEARS] = bin2bcd(tm->tm_year % 100); | 169 | buf[DT_YEARS] = bin2bcd(tm->tm_year % 100); |
130 | 170 | ||
131 | return regmap_bulk_write(pcf85363->regmap, DT_100THS, | 171 | ret = regmap_bulk_write(pcf85363->regmap, CTRL_STOP_EN, |
132 | buf, len); | 172 | tmp, sizeof(tmp)); |
173 | if (ret) | ||
174 | return ret; | ||
175 | |||
176 | return regmap_write(pcf85363->regmap, CTRL_STOP_EN, 0); | ||
177 | } | ||
178 | |||
179 | static int pcf85363_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) | ||
180 | { | ||
181 | struct pcf85363 *pcf85363 = dev_get_drvdata(dev); | ||
182 | unsigned char buf[DT_MONTH_ALM1 - DT_SECOND_ALM1 + 1]; | ||
183 | unsigned int val; | ||
184 | int ret; | ||
185 | |||
186 | ret = regmap_bulk_read(pcf85363->regmap, DT_SECOND_ALM1, buf, | ||
187 | sizeof(buf)); | ||
188 | if (ret) | ||
189 | return ret; | ||
190 | |||
191 | alrm->time.tm_sec = bcd2bin(buf[0]); | ||
192 | alrm->time.tm_min = bcd2bin(buf[1]); | ||
193 | alrm->time.tm_hour = bcd2bin(buf[2]); | ||
194 | alrm->time.tm_mday = bcd2bin(buf[3]); | ||
195 | alrm->time.tm_mon = bcd2bin(buf[4]) - 1; | ||
196 | |||
197 | ret = regmap_read(pcf85363->regmap, CTRL_INTA_EN, &val); | ||
198 | if (ret) | ||
199 | return ret; | ||
200 | |||
201 | alrm->enabled = !!(val & INT_A1IE); | ||
202 | |||
203 | return 0; | ||
204 | } | ||
205 | |||
206 | static int _pcf85363_rtc_alarm_irq_enable(struct pcf85363 *pcf85363, unsigned | ||
207 | int enabled) | ||
208 | { | ||
209 | unsigned int alarm_flags = ALRM_SEC_A1E | ALRM_MIN_A1E | ALRM_HR_A1E | | ||
210 | ALRM_DAY_A1E | ALRM_MON_A1E; | ||
211 | int ret; | ||
212 | |||
213 | ret = regmap_update_bits(pcf85363->regmap, DT_ALARM_EN, alarm_flags, | ||
214 | enabled ? alarm_flags : 0); | ||
215 | if (ret) | ||
216 | return ret; | ||
217 | |||
218 | ret = regmap_update_bits(pcf85363->regmap, CTRL_INTA_EN, | ||
219 | INT_A1IE, enabled ? INT_A1IE : 0); | ||
220 | |||
221 | if (ret || enabled) | ||
222 | return ret; | ||
223 | |||
224 | /* clear current flags */ | ||
225 | return regmap_update_bits(pcf85363->regmap, CTRL_FLAGS, FLAGS_A1F, 0); | ||
226 | } | ||
227 | |||
228 | static int pcf85363_rtc_alarm_irq_enable(struct device *dev, | ||
229 | unsigned int enabled) | ||
230 | { | ||
231 | struct pcf85363 *pcf85363 = dev_get_drvdata(dev); | ||
232 | |||
233 | return _pcf85363_rtc_alarm_irq_enable(pcf85363, enabled); | ||
234 | } | ||
235 | |||
236 | static int pcf85363_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) | ||
237 | { | ||
238 | struct pcf85363 *pcf85363 = dev_get_drvdata(dev); | ||
239 | unsigned char buf[DT_MONTH_ALM1 - DT_SECOND_ALM1 + 1]; | ||
240 | int ret; | ||
241 | |||
242 | buf[0] = bin2bcd(alrm->time.tm_sec); | ||
243 | buf[1] = bin2bcd(alrm->time.tm_min); | ||
244 | buf[2] = bin2bcd(alrm->time.tm_hour); | ||
245 | buf[3] = bin2bcd(alrm->time.tm_mday); | ||
246 | buf[4] = bin2bcd(alrm->time.tm_mon + 1); | ||
247 | |||
248 | /* | ||
249 | * Disable the alarm interrupt before changing the value to avoid | ||
250 | * spurious interrupts | ||
251 | */ | ||
252 | ret = _pcf85363_rtc_alarm_irq_enable(pcf85363, 0); | ||
253 | if (ret) | ||
254 | return ret; | ||
255 | |||
256 | ret = regmap_bulk_write(pcf85363->regmap, DT_SECOND_ALM1, buf, | ||
257 | sizeof(buf)); | ||
258 | if (ret) | ||
259 | return ret; | ||
260 | |||
261 | return _pcf85363_rtc_alarm_irq_enable(pcf85363, alrm->enabled); | ||
262 | } | ||
263 | |||
264 | static irqreturn_t pcf85363_rtc_handle_irq(int irq, void *dev_id) | ||
265 | { | ||
266 | struct pcf85363 *pcf85363 = i2c_get_clientdata(dev_id); | ||
267 | unsigned int flags; | ||
268 | int err; | ||
269 | |||
270 | err = regmap_read(pcf85363->regmap, CTRL_FLAGS, &flags); | ||
271 | if (err) | ||
272 | return IRQ_NONE; | ||
273 | |||
274 | if (flags & FLAGS_A1F) { | ||
275 | rtc_update_irq(pcf85363->rtc, 1, RTC_IRQF | RTC_AF); | ||
276 | regmap_update_bits(pcf85363->regmap, CTRL_FLAGS, FLAGS_A1F, 0); | ||
277 | return IRQ_HANDLED; | ||
278 | } | ||
279 | |||
280 | return IRQ_NONE; | ||
133 | } | 281 | } |
134 | 282 | ||
135 | static const struct rtc_class_ops rtc_ops = { | 283 | static const struct rtc_class_ops rtc_ops = { |
@@ -137,6 +285,14 @@ static const struct rtc_class_ops rtc_ops = { | |||
137 | .set_time = pcf85363_rtc_set_time, | 285 | .set_time = pcf85363_rtc_set_time, |
138 | }; | 286 | }; |
139 | 287 | ||
288 | static const struct rtc_class_ops rtc_ops_alarm = { | ||
289 | .read_time = pcf85363_rtc_read_time, | ||
290 | .set_time = pcf85363_rtc_set_time, | ||
291 | .read_alarm = pcf85363_rtc_read_alarm, | ||
292 | .set_alarm = pcf85363_rtc_set_alarm, | ||
293 | .alarm_irq_enable = pcf85363_rtc_alarm_irq_enable, | ||
294 | }; | ||
295 | |||
140 | static int pcf85363_nvram_read(void *priv, unsigned int offset, void *val, | 296 | static int pcf85363_nvram_read(void *priv, unsigned int offset, void *val, |
141 | size_t bytes) | 297 | size_t bytes) |
142 | { | 298 | { |
@@ -158,12 +314,22 @@ static int pcf85363_nvram_write(void *priv, unsigned int offset, void *val, | |||
158 | static const struct regmap_config regmap_config = { | 314 | static const struct regmap_config regmap_config = { |
159 | .reg_bits = 8, | 315 | .reg_bits = 8, |
160 | .val_bits = 8, | 316 | .val_bits = 8, |
317 | .max_register = 0x7f, | ||
161 | }; | 318 | }; |
162 | 319 | ||
163 | static int pcf85363_probe(struct i2c_client *client, | 320 | static int pcf85363_probe(struct i2c_client *client, |
164 | const struct i2c_device_id *id) | 321 | const struct i2c_device_id *id) |
165 | { | 322 | { |
166 | struct pcf85363 *pcf85363; | 323 | struct pcf85363 *pcf85363; |
324 | struct nvmem_config nvmem_cfg = { | ||
325 | .name = "pcf85363-", | ||
326 | .word_size = 1, | ||
327 | .stride = 1, | ||
328 | .size = NVRAM_SIZE, | ||
329 | .reg_read = pcf85363_nvram_read, | ||
330 | .reg_write = pcf85363_nvram_write, | ||
331 | }; | ||
332 | int ret; | ||
167 | 333 | ||
168 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) | 334 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) |
169 | return -ENODEV; | 335 | return -ENODEV; |
@@ -186,17 +352,28 @@ static int pcf85363_probe(struct i2c_client *client, | |||
186 | if (IS_ERR(pcf85363->rtc)) | 352 | if (IS_ERR(pcf85363->rtc)) |
187 | return PTR_ERR(pcf85363->rtc); | 353 | return PTR_ERR(pcf85363->rtc); |
188 | 354 | ||
189 | pcf85363->nvmem_cfg.name = "pcf85363-"; | ||
190 | pcf85363->nvmem_cfg.word_size = 1; | ||
191 | pcf85363->nvmem_cfg.stride = 1; | ||
192 | pcf85363->nvmem_cfg.size = NVRAM_SIZE; | ||
193 | pcf85363->nvmem_cfg.reg_read = pcf85363_nvram_read; | ||
194 | pcf85363->nvmem_cfg.reg_write = pcf85363_nvram_write; | ||
195 | pcf85363->nvmem_cfg.priv = pcf85363; | ||
196 | pcf85363->rtc->nvmem_config = &pcf85363->nvmem_cfg; | ||
197 | pcf85363->rtc->ops = &rtc_ops; | 355 | pcf85363->rtc->ops = &rtc_ops; |
198 | 356 | ||
199 | return rtc_register_device(pcf85363->rtc); | 357 | if (client->irq > 0) { |
358 | regmap_write(pcf85363->regmap, CTRL_FLAGS, 0); | ||
359 | regmap_update_bits(pcf85363->regmap, CTRL_PIN_IO, | ||
360 | PIN_IO_INTA_OUT, PIN_IO_INTAPM); | ||
361 | ret = devm_request_threaded_irq(pcf85363->dev, client->irq, | ||
362 | NULL, pcf85363_rtc_handle_irq, | ||
363 | IRQF_TRIGGER_LOW | IRQF_ONESHOT, | ||
364 | "pcf85363", client); | ||
365 | if (ret) | ||
366 | dev_warn(&client->dev, "unable to request IRQ, alarms disabled\n"); | ||
367 | else | ||
368 | pcf85363->rtc->ops = &rtc_ops_alarm; | ||
369 | } | ||
370 | |||
371 | ret = rtc_register_device(pcf85363->rtc); | ||
372 | |||
373 | nvmem_cfg.priv = pcf85363; | ||
374 | rtc_nvmem_register(pcf85363->rtc, &nvmem_cfg); | ||
375 | |||
376 | return ret; | ||
200 | } | 377 | } |
201 | 378 | ||
202 | static const struct of_device_id dev_ids[] = { | 379 | static const struct of_device_id dev_ids[] = { |
diff --git a/drivers/rtc/rtc-pic32.c b/drivers/rtc/rtc-pic32.c index 5cfb6df5c430..3c08eab4f1a8 100644 --- a/drivers/rtc/rtc-pic32.c +++ b/drivers/rtc/rtc-pic32.c | |||
@@ -175,7 +175,7 @@ static int pic32_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm) | |||
175 | rtc_tm->tm_hour, rtc_tm->tm_min, rtc_tm->tm_sec); | 175 | rtc_tm->tm_hour, rtc_tm->tm_min, rtc_tm->tm_sec); |
176 | 176 | ||
177 | clk_disable(pdata->clk); | 177 | clk_disable(pdata->clk); |
178 | return rtc_valid_tm(rtc_tm); | 178 | return 0; |
179 | } | 179 | } |
180 | 180 | ||
181 | static int pic32_rtc_settime(struct device *dev, struct rtc_time *tm) | 181 | static int pic32_rtc_settime(struct device *dev, struct rtc_time *tm) |
diff --git a/drivers/rtc/rtc-pm8xxx.c b/drivers/rtc/rtc-pm8xxx.c index fac835530671..29358a045925 100644 --- a/drivers/rtc/rtc-pm8xxx.c +++ b/drivers/rtc/rtc-pm8xxx.c | |||
@@ -74,16 +74,18 @@ struct pm8xxx_rtc { | |||
74 | /* | 74 | /* |
75 | * Steps to write the RTC registers. | 75 | * Steps to write the RTC registers. |
76 | * 1. Disable alarm if enabled. | 76 | * 1. Disable alarm if enabled. |
77 | * 2. Write 0x00 to LSB. | 77 | * 2. Disable rtc if enabled. |
78 | * 3. Write Byte[1], Byte[2], Byte[3] then Byte[0]. | 78 | * 3. Write 0x00 to LSB. |
79 | * 4. Enable alarm if disabled in step 1. | 79 | * 4. Write Byte[1], Byte[2], Byte[3] then Byte[0]. |
80 | * 5. Enable rtc if disabled in step 2. | ||
81 | * 6. Enable alarm if disabled in step 1. | ||
80 | */ | 82 | */ |
81 | static int pm8xxx_rtc_set_time(struct device *dev, struct rtc_time *tm) | 83 | static int pm8xxx_rtc_set_time(struct device *dev, struct rtc_time *tm) |
82 | { | 84 | { |
83 | int rc, i; | 85 | int rc, i; |
84 | unsigned long secs, irq_flags; | 86 | unsigned long secs, irq_flags; |
85 | u8 value[NUM_8_BIT_RTC_REGS], alarm_enabled = 0; | 87 | u8 value[NUM_8_BIT_RTC_REGS], alarm_enabled = 0, rtc_disabled = 0; |
86 | unsigned int ctrl_reg; | 88 | unsigned int ctrl_reg, rtc_ctrl_reg; |
87 | struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev); | 89 | struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev); |
88 | const struct pm8xxx_rtc_regs *regs = rtc_dd->regs; | 90 | const struct pm8xxx_rtc_regs *regs = rtc_dd->regs; |
89 | 91 | ||
@@ -92,23 +94,38 @@ static int pm8xxx_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
92 | 94 | ||
93 | rtc_tm_to_time(tm, &secs); | 95 | rtc_tm_to_time(tm, &secs); |
94 | 96 | ||
97 | dev_dbg(dev, "Seconds value to be written to RTC = %lu\n", secs); | ||
98 | |||
95 | for (i = 0; i < NUM_8_BIT_RTC_REGS; i++) { | 99 | for (i = 0; i < NUM_8_BIT_RTC_REGS; i++) { |
96 | value[i] = secs & 0xFF; | 100 | value[i] = secs & 0xFF; |
97 | secs >>= 8; | 101 | secs >>= 8; |
98 | } | 102 | } |
99 | 103 | ||
100 | dev_dbg(dev, "Seconds value to be written to RTC = %lu\n", secs); | ||
101 | |||
102 | spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags); | 104 | spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags); |
103 | 105 | ||
104 | rc = regmap_read(rtc_dd->regmap, regs->ctrl, &ctrl_reg); | 106 | rc = regmap_read(rtc_dd->regmap, regs->alarm_ctrl, &ctrl_reg); |
105 | if (rc) | 107 | if (rc) |
106 | goto rtc_rw_fail; | 108 | goto rtc_rw_fail; |
107 | 109 | ||
108 | if (ctrl_reg & regs->alarm_en) { | 110 | if (ctrl_reg & regs->alarm_en) { |
109 | alarm_enabled = 1; | 111 | alarm_enabled = 1; |
110 | ctrl_reg &= ~regs->alarm_en; | 112 | ctrl_reg &= ~regs->alarm_en; |
111 | rc = regmap_write(rtc_dd->regmap, regs->ctrl, ctrl_reg); | 113 | rc = regmap_write(rtc_dd->regmap, regs->alarm_ctrl, ctrl_reg); |
114 | if (rc) { | ||
115 | dev_err(dev, "Write to RTC Alarm control register failed\n"); | ||
116 | goto rtc_rw_fail; | ||
117 | } | ||
118 | } | ||
119 | |||
120 | /* Disable RTC H/w before writing on RTC register */ | ||
121 | rc = regmap_read(rtc_dd->regmap, regs->ctrl, &rtc_ctrl_reg); | ||
122 | if (rc) | ||
123 | goto rtc_rw_fail; | ||
124 | |||
125 | if (rtc_ctrl_reg & PM8xxx_RTC_ENABLE) { | ||
126 | rtc_disabled = 1; | ||
127 | rtc_ctrl_reg &= ~PM8xxx_RTC_ENABLE; | ||
128 | rc = regmap_write(rtc_dd->regmap, regs->ctrl, rtc_ctrl_reg); | ||
112 | if (rc) { | 129 | if (rc) { |
113 | dev_err(dev, "Write to RTC control register failed\n"); | 130 | dev_err(dev, "Write to RTC control register failed\n"); |
114 | goto rtc_rw_fail; | 131 | goto rtc_rw_fail; |
@@ -137,11 +154,21 @@ static int pm8xxx_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
137 | goto rtc_rw_fail; | 154 | goto rtc_rw_fail; |
138 | } | 155 | } |
139 | 156 | ||
157 | /* Enable RTC H/w after writing on RTC register */ | ||
158 | if (rtc_disabled) { | ||
159 | rtc_ctrl_reg |= PM8xxx_RTC_ENABLE; | ||
160 | rc = regmap_write(rtc_dd->regmap, regs->ctrl, rtc_ctrl_reg); | ||
161 | if (rc) { | ||
162 | dev_err(dev, "Write to RTC control register failed\n"); | ||
163 | goto rtc_rw_fail; | ||
164 | } | ||
165 | } | ||
166 | |||
140 | if (alarm_enabled) { | 167 | if (alarm_enabled) { |
141 | ctrl_reg |= regs->alarm_en; | 168 | ctrl_reg |= regs->alarm_en; |
142 | rc = regmap_write(rtc_dd->regmap, regs->ctrl, ctrl_reg); | 169 | rc = regmap_write(rtc_dd->regmap, regs->alarm_ctrl, ctrl_reg); |
143 | if (rc) { | 170 | if (rc) { |
144 | dev_err(dev, "Write to RTC control register failed\n"); | 171 | dev_err(dev, "Write to RTC Alarm control register failed\n"); |
145 | goto rtc_rw_fail; | 172 | goto rtc_rw_fail; |
146 | } | 173 | } |
147 | } | 174 | } |
@@ -190,12 +217,6 @@ static int pm8xxx_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
190 | 217 | ||
191 | rtc_time_to_tm(secs, tm); | 218 | rtc_time_to_tm(secs, tm); |
192 | 219 | ||
193 | rc = rtc_valid_tm(tm); | ||
194 | if (rc < 0) { | ||
195 | dev_err(dev, "Invalid time read from RTC\n"); | ||
196 | return rc; | ||
197 | } | ||
198 | |||
199 | dev_dbg(dev, "secs = %lu, h:m:s == %d:%d:%d, d/m/y = %d/%d/%d\n", | 220 | dev_dbg(dev, "secs = %lu, h:m:s == %d:%d:%d, d/m/y = %d/%d/%d\n", |
200 | secs, tm->tm_hour, tm->tm_min, tm->tm_sec, | 221 | secs, tm->tm_hour, tm->tm_min, tm->tm_sec, |
201 | tm->tm_mday, tm->tm_mon, tm->tm_year); | 222 | tm->tm_mday, tm->tm_mon, tm->tm_year); |
diff --git a/drivers/rtc/rtc-ps3.c b/drivers/rtc/rtc-ps3.c index 6a8f5d758eac..347288bff438 100644 --- a/drivers/rtc/rtc-ps3.c +++ b/drivers/rtc/rtc-ps3.c | |||
@@ -41,7 +41,7 @@ static u64 read_rtc(void) | |||
41 | static int ps3_get_time(struct device *dev, struct rtc_time *tm) | 41 | static int ps3_get_time(struct device *dev, struct rtc_time *tm) |
42 | { | 42 | { |
43 | rtc_time_to_tm(read_rtc() + ps3_os_area_get_rtc_diff(), tm); | 43 | rtc_time_to_tm(read_rtc() + ps3_os_area_get_rtc_diff(), tm); |
44 | return rtc_valid_tm(tm); | 44 | return 0; |
45 | } | 45 | } |
46 | 46 | ||
47 | static int ps3_set_time(struct device *dev, struct rtc_time *tm) | 47 | static int ps3_set_time(struct device *dev, struct rtc_time *tm) |
diff --git a/drivers/rtc/rtc-r7301.c b/drivers/rtc/rtc-r7301.c index 500e8c8a2605..169704b2ce13 100644 --- a/drivers/rtc/rtc-r7301.c +++ b/drivers/rtc/rtc-r7301.c | |||
@@ -224,7 +224,7 @@ static int rtc7301_read_time(struct device *dev, struct rtc_time *tm) | |||
224 | 224 | ||
225 | spin_unlock_irqrestore(&priv->lock, flags); | 225 | spin_unlock_irqrestore(&priv->lock, flags); |
226 | 226 | ||
227 | return err ? err : rtc_valid_tm(tm); | 227 | return err; |
228 | } | 228 | } |
229 | 229 | ||
230 | static int rtc7301_set_time(struct device *dev, struct rtc_time *tm) | 230 | static int rtc7301_set_time(struct device *dev, struct rtc_time *tm) |
diff --git a/drivers/rtc/rtc-r9701.c b/drivers/rtc/rtc-r9701.c index b6c5eb97051c..a39ccd1cf6e8 100644 --- a/drivers/rtc/rtc-r9701.c +++ b/drivers/rtc/rtc-r9701.c | |||
@@ -92,7 +92,7 @@ static int r9701_get_datetime(struct device *dev, struct rtc_time *dt) | |||
92 | * according to the data sheet. make sure they are valid. | 92 | * according to the data sheet. make sure they are valid. |
93 | */ | 93 | */ |
94 | 94 | ||
95 | return rtc_valid_tm(dt); | 95 | return 0; |
96 | } | 96 | } |
97 | 97 | ||
98 | static int r9701_set_datetime(struct device *dev, struct rtc_time *dt) | 98 | static int r9701_set_datetime(struct device *dev, struct rtc_time *dt) |
diff --git a/drivers/rtc/rtc-rk808.c b/drivers/rtc/rtc-rk808.c index 35c9aada07c8..739c0d42e835 100644 --- a/drivers/rtc/rtc-rk808.c +++ b/drivers/rtc/rtc-rk808.c | |||
@@ -375,7 +375,6 @@ static int rk808_rtc_probe(struct platform_device *pdev) | |||
375 | { | 375 | { |
376 | struct rk808 *rk808 = dev_get_drvdata(pdev->dev.parent); | 376 | struct rk808 *rk808 = dev_get_drvdata(pdev->dev.parent); |
377 | struct rk808_rtc *rk808_rtc; | 377 | struct rk808_rtc *rk808_rtc; |
378 | struct rtc_time tm; | ||
379 | int ret; | 378 | int ret; |
380 | 379 | ||
381 | rk808_rtc = devm_kzalloc(&pdev->dev, sizeof(*rk808_rtc), GFP_KERNEL); | 380 | rk808_rtc = devm_kzalloc(&pdev->dev, sizeof(*rk808_rtc), GFP_KERNEL); |
@@ -404,24 +403,13 @@ static int rk808_rtc_probe(struct platform_device *pdev) | |||
404 | return ret; | 403 | return ret; |
405 | } | 404 | } |
406 | 405 | ||
407 | /* set init time */ | ||
408 | ret = rk808_rtc_readtime(&pdev->dev, &tm); | ||
409 | if (ret) { | ||
410 | dev_err(&pdev->dev, "Failed to read RTC time\n"); | ||
411 | return ret; | ||
412 | } | ||
413 | ret = rtc_valid_tm(&tm); | ||
414 | if (ret) | ||
415 | dev_warn(&pdev->dev, "invalid date/time\n"); | ||
416 | |||
417 | device_init_wakeup(&pdev->dev, 1); | 406 | device_init_wakeup(&pdev->dev, 1); |
418 | 407 | ||
419 | rk808_rtc->rtc = devm_rtc_device_register(&pdev->dev, "rk808-rtc", | 408 | rk808_rtc->rtc = devm_rtc_allocate_device(&pdev->dev); |
420 | &rk808_rtc_ops, THIS_MODULE); | 409 | if (IS_ERR(rk808_rtc->rtc)) |
421 | if (IS_ERR(rk808_rtc->rtc)) { | 410 | return PTR_ERR(rk808_rtc->rtc); |
422 | ret = PTR_ERR(rk808_rtc->rtc); | 411 | |
423 | return ret; | 412 | rk808_rtc->rtc->ops = &rk808_rtc_ops; |
424 | } | ||
425 | 413 | ||
426 | rk808_rtc->irq = platform_get_irq(pdev, 0); | 414 | rk808_rtc->irq = platform_get_irq(pdev, 0); |
427 | if (rk808_rtc->irq < 0) { | 415 | if (rk808_rtc->irq < 0) { |
@@ -438,9 +426,10 @@ static int rk808_rtc_probe(struct platform_device *pdev) | |||
438 | if (ret) { | 426 | if (ret) { |
439 | dev_err(&pdev->dev, "Failed to request alarm IRQ %d: %d\n", | 427 | dev_err(&pdev->dev, "Failed to request alarm IRQ %d: %d\n", |
440 | rk808_rtc->irq, ret); | 428 | rk808_rtc->irq, ret); |
429 | return ret; | ||
441 | } | 430 | } |
442 | 431 | ||
443 | return ret; | 432 | return rtc_register_device(rk808_rtc->rtc); |
444 | } | 433 | } |
445 | 434 | ||
446 | static struct platform_driver rk808_rtc_driver = { | 435 | static struct platform_driver rk808_rtc_driver = { |
diff --git a/drivers/rtc/rtc-rp5c01.c b/drivers/rtc/rtc-rp5c01.c index 026035373ae6..f1c160fe7d37 100644 --- a/drivers/rtc/rtc-rp5c01.c +++ b/drivers/rtc/rtc-rp5c01.c | |||
@@ -64,7 +64,6 @@ struct rp5c01_priv { | |||
64 | u32 __iomem *regs; | 64 | u32 __iomem *regs; |
65 | struct rtc_device *rtc; | 65 | struct rtc_device *rtc; |
66 | spinlock_t lock; /* against concurrent RTC/NVRAM access */ | 66 | spinlock_t lock; /* against concurrent RTC/NVRAM access */ |
67 | struct bin_attribute nvram_attr; | ||
68 | }; | 67 | }; |
69 | 68 | ||
70 | static inline unsigned int rp5c01_read(struct rp5c01_priv *priv, | 69 | static inline unsigned int rp5c01_read(struct rp5c01_priv *priv, |
@@ -116,7 +115,7 @@ static int rp5c01_read_time(struct device *dev, struct rtc_time *tm) | |||
116 | rp5c01_unlock(priv); | 115 | rp5c01_unlock(priv); |
117 | spin_unlock_irq(&priv->lock); | 116 | spin_unlock_irq(&priv->lock); |
118 | 117 | ||
119 | return rtc_valid_tm(tm); | 118 | return 0; |
120 | } | 119 | } |
121 | 120 | ||
122 | static int rp5c01_set_time(struct device *dev, struct rtc_time *tm) | 121 | static int rp5c01_set_time(struct device *dev, struct rtc_time *tm) |
@@ -160,17 +159,15 @@ static const struct rtc_class_ops rp5c01_rtc_ops = { | |||
160 | * byte is stored in BLOCK10, the low nibble in BLOCK11. | 159 | * byte is stored in BLOCK10, the low nibble in BLOCK11. |
161 | */ | 160 | */ |
162 | 161 | ||
163 | static ssize_t rp5c01_nvram_read(struct file *filp, struct kobject *kobj, | 162 | static int rp5c01_nvram_read(void *_priv, unsigned int pos, void *val, |
164 | struct bin_attribute *bin_attr, | 163 | size_t bytes) |
165 | char *buf, loff_t pos, size_t size) | ||
166 | { | 164 | { |
167 | struct device *dev = container_of(kobj, struct device, kobj); | 165 | struct rp5c01_priv *priv = _priv; |
168 | struct rp5c01_priv *priv = dev_get_drvdata(dev); | 166 | u8 *buf = val; |
169 | ssize_t count; | ||
170 | 167 | ||
171 | spin_lock_irq(&priv->lock); | 168 | spin_lock_irq(&priv->lock); |
172 | 169 | ||
173 | for (count = 0; count < size; count++) { | 170 | for (; bytes; bytes--) { |
174 | u8 data; | 171 | u8 data; |
175 | 172 | ||
176 | rp5c01_write(priv, | 173 | rp5c01_write(priv, |
@@ -187,20 +184,18 @@ static ssize_t rp5c01_nvram_read(struct file *filp, struct kobject *kobj, | |||
187 | } | 184 | } |
188 | 185 | ||
189 | spin_unlock_irq(&priv->lock); | 186 | spin_unlock_irq(&priv->lock); |
190 | return count; | 187 | return 0; |
191 | } | 188 | } |
192 | 189 | ||
193 | static ssize_t rp5c01_nvram_write(struct file *filp, struct kobject *kobj, | 190 | static int rp5c01_nvram_write(void *_priv, unsigned int pos, void *val, |
194 | struct bin_attribute *bin_attr, | 191 | size_t bytes) |
195 | char *buf, loff_t pos, size_t size) | ||
196 | { | 192 | { |
197 | struct device *dev = container_of(kobj, struct device, kobj); | 193 | struct rp5c01_priv *priv = _priv; |
198 | struct rp5c01_priv *priv = dev_get_drvdata(dev); | 194 | u8 *buf = val; |
199 | ssize_t count; | ||
200 | 195 | ||
201 | spin_lock_irq(&priv->lock); | 196 | spin_lock_irq(&priv->lock); |
202 | 197 | ||
203 | for (count = 0; count < size; count++) { | 198 | for (; bytes; bytes--) { |
204 | u8 data = *buf++; | 199 | u8 data = *buf++; |
205 | 200 | ||
206 | rp5c01_write(priv, | 201 | rp5c01_write(priv, |
@@ -216,7 +211,7 @@ static ssize_t rp5c01_nvram_write(struct file *filp, struct kobject *kobj, | |||
216 | } | 211 | } |
217 | 212 | ||
218 | spin_unlock_irq(&priv->lock); | 213 | spin_unlock_irq(&priv->lock); |
219 | return count; | 214 | return 0; |
220 | } | 215 | } |
221 | 216 | ||
222 | static int __init rp5c01_rtc_probe(struct platform_device *dev) | 217 | static int __init rp5c01_rtc_probe(struct platform_device *dev) |
@@ -225,6 +220,14 @@ static int __init rp5c01_rtc_probe(struct platform_device *dev) | |||
225 | struct rp5c01_priv *priv; | 220 | struct rp5c01_priv *priv; |
226 | struct rtc_device *rtc; | 221 | struct rtc_device *rtc; |
227 | int error; | 222 | int error; |
223 | struct nvmem_config nvmem_cfg = { | ||
224 | .name = "rp5c01_nvram", | ||
225 | .word_size = 1, | ||
226 | .stride = 1, | ||
227 | .size = RP5C01_MODE, | ||
228 | .reg_read = rp5c01_nvram_read, | ||
229 | .reg_write = rp5c01_nvram_write, | ||
230 | }; | ||
228 | 231 | ||
229 | res = platform_get_resource(dev, IORESOURCE_MEM, 0); | 232 | res = platform_get_resource(dev, IORESOURCE_MEM, 0); |
230 | if (!res) | 233 | if (!res) |
@@ -238,43 +241,31 @@ static int __init rp5c01_rtc_probe(struct platform_device *dev) | |||
238 | if (!priv->regs) | 241 | if (!priv->regs) |
239 | return -ENOMEM; | 242 | return -ENOMEM; |
240 | 243 | ||
241 | sysfs_bin_attr_init(&priv->nvram_attr); | ||
242 | priv->nvram_attr.attr.name = "nvram"; | ||
243 | priv->nvram_attr.attr.mode = S_IRUGO | S_IWUSR; | ||
244 | priv->nvram_attr.read = rp5c01_nvram_read; | ||
245 | priv->nvram_attr.write = rp5c01_nvram_write; | ||
246 | priv->nvram_attr.size = RP5C01_MODE; | ||
247 | |||
248 | spin_lock_init(&priv->lock); | 244 | spin_lock_init(&priv->lock); |
249 | 245 | ||
250 | platform_set_drvdata(dev, priv); | 246 | platform_set_drvdata(dev, priv); |
251 | 247 | ||
252 | rtc = devm_rtc_device_register(&dev->dev, "rtc-rp5c01", &rp5c01_rtc_ops, | 248 | rtc = devm_rtc_allocate_device(&dev->dev); |
253 | THIS_MODULE); | ||
254 | if (IS_ERR(rtc)) | 249 | if (IS_ERR(rtc)) |
255 | return PTR_ERR(rtc); | 250 | return PTR_ERR(rtc); |
251 | |||
252 | rtc->ops = &rp5c01_rtc_ops; | ||
253 | rtc->nvram_old_abi = true; | ||
254 | |||
256 | priv->rtc = rtc; | 255 | priv->rtc = rtc; |
257 | 256 | ||
258 | error = sysfs_create_bin_file(&dev->dev.kobj, &priv->nvram_attr); | 257 | nvmem_cfg.priv = priv; |
258 | error = rtc_nvmem_register(rtc, &nvmem_cfg); | ||
259 | if (error) | 259 | if (error) |
260 | return error; | 260 | return error; |
261 | 261 | ||
262 | return 0; | 262 | return rtc_register_device(rtc); |
263 | } | ||
264 | |||
265 | static int __exit rp5c01_rtc_remove(struct platform_device *dev) | ||
266 | { | ||
267 | struct rp5c01_priv *priv = platform_get_drvdata(dev); | ||
268 | |||
269 | sysfs_remove_bin_file(&dev->dev.kobj, &priv->nvram_attr); | ||
270 | return 0; | ||
271 | } | 263 | } |
272 | 264 | ||
273 | static struct platform_driver rp5c01_rtc_driver = { | 265 | static struct platform_driver rp5c01_rtc_driver = { |
274 | .driver = { | 266 | .driver = { |
275 | .name = "rtc-rp5c01", | 267 | .name = "rtc-rp5c01", |
276 | }, | 268 | }, |
277 | .remove = __exit_p(rp5c01_rtc_remove), | ||
278 | }; | 269 | }; |
279 | 270 | ||
280 | module_platform_driver_probe(rp5c01_rtc_driver, rp5c01_rtc_probe); | 271 | module_platform_driver_probe(rp5c01_rtc_driver, rp5c01_rtc_probe); |
diff --git a/drivers/rtc/rtc-rs5c348.c b/drivers/rtc/rtc-rs5c348.c index 9a306983aaba..f2de8b17e7e3 100644 --- a/drivers/rtc/rtc-rs5c348.c +++ b/drivers/rtc/rtc-rs5c348.c | |||
@@ -135,11 +135,6 @@ rs5c348_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
135 | tm->tm_year = bcd2bin(rxbuf[RS5C348_REG_YEAR]) + | 135 | tm->tm_year = bcd2bin(rxbuf[RS5C348_REG_YEAR]) + |
136 | ((rxbuf[RS5C348_REG_MONTH] & RS5C348_BIT_Y2K) ? 100 : 0); | 136 | ((rxbuf[RS5C348_REG_MONTH] & RS5C348_BIT_Y2K) ? 100 : 0); |
137 | 137 | ||
138 | if (rtc_valid_tm(tm) < 0) { | ||
139 | dev_err(&spi->dev, "retrieved date/time is not valid.\n"); | ||
140 | rtc_time_to_tm(0, tm); | ||
141 | } | ||
142 | |||
143 | return 0; | 138 | return 0; |
144 | } | 139 | } |
145 | 140 | ||
diff --git a/drivers/rtc/rtc-rs5c372.c b/drivers/rtc/rtc-rs5c372.c index d4eff8d7131f..c5038329058c 100644 --- a/drivers/rtc/rtc-rs5c372.c +++ b/drivers/rtc/rtc-rs5c372.c | |||
@@ -207,8 +207,9 @@ static unsigned rs5c_hr2reg(struct rs5c372 *rs5c, unsigned hour) | |||
207 | return bin2bcd(hour); | 207 | return bin2bcd(hour); |
208 | } | 208 | } |
209 | 209 | ||
210 | static int rs5c372_get_datetime(struct i2c_client *client, struct rtc_time *tm) | 210 | static int rs5c372_rtc_read_time(struct device *dev, struct rtc_time *tm) |
211 | { | 211 | { |
212 | struct i2c_client *client = to_i2c_client(dev); | ||
212 | struct rs5c372 *rs5c = i2c_get_clientdata(client); | 213 | struct rs5c372 *rs5c = i2c_get_clientdata(client); |
213 | int status = rs5c_get_regs(rs5c); | 214 | int status = rs5c_get_regs(rs5c); |
214 | 215 | ||
@@ -234,12 +235,12 @@ static int rs5c372_get_datetime(struct i2c_client *client, struct rtc_time *tm) | |||
234 | tm->tm_sec, tm->tm_min, tm->tm_hour, | 235 | tm->tm_sec, tm->tm_min, tm->tm_hour, |
235 | tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday); | 236 | tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday); |
236 | 237 | ||
237 | /* rtc might need initialization */ | 238 | return 0; |
238 | return rtc_valid_tm(tm); | ||
239 | } | 239 | } |
240 | 240 | ||
241 | static int rs5c372_set_datetime(struct i2c_client *client, struct rtc_time *tm) | 241 | static int rs5c372_rtc_set_time(struct device *dev, struct rtc_time *tm) |
242 | { | 242 | { |
243 | struct i2c_client *client = to_i2c_client(dev); | ||
243 | struct rs5c372 *rs5c = i2c_get_clientdata(client); | 244 | struct rs5c372 *rs5c = i2c_get_clientdata(client); |
244 | unsigned char buf[7]; | 245 | unsigned char buf[7]; |
245 | int addr; | 246 | int addr; |
@@ -305,17 +306,6 @@ static int rs5c372_get_trim(struct i2c_client *client, int *osc, int *trim) | |||
305 | } | 306 | } |
306 | #endif | 307 | #endif |
307 | 308 | ||
308 | static int rs5c372_rtc_read_time(struct device *dev, struct rtc_time *tm) | ||
309 | { | ||
310 | return rs5c372_get_datetime(to_i2c_client(dev), tm); | ||
311 | } | ||
312 | |||
313 | static int rs5c372_rtc_set_time(struct device *dev, struct rtc_time *tm) | ||
314 | { | ||
315 | return rs5c372_set_datetime(to_i2c_client(dev), tm); | ||
316 | } | ||
317 | |||
318 | |||
319 | static int rs5c_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) | 309 | static int rs5c_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) |
320 | { | 310 | { |
321 | struct i2c_client *client = to_i2c_client(dev); | 311 | struct i2c_client *client = to_i2c_client(dev); |
@@ -581,7 +571,6 @@ static int rs5c372_probe(struct i2c_client *client, | |||
581 | int err = 0; | 571 | int err = 0; |
582 | int smbus_mode = 0; | 572 | int smbus_mode = 0; |
583 | struct rs5c372 *rs5c372; | 573 | struct rs5c372 *rs5c372; |
584 | struct rtc_time tm; | ||
585 | 574 | ||
586 | dev_dbg(&client->dev, "%s\n", __func__); | 575 | dev_dbg(&client->dev, "%s\n", __func__); |
587 | 576 | ||
@@ -662,9 +651,6 @@ static int rs5c372_probe(struct i2c_client *client, | |||
662 | goto exit; | 651 | goto exit; |
663 | } | 652 | } |
664 | 653 | ||
665 | if (rs5c372_get_datetime(client, &tm) < 0) | ||
666 | dev_warn(&client->dev, "clock needs to be set\n"); | ||
667 | |||
668 | dev_info(&client->dev, "%s found, %s\n", | 654 | dev_info(&client->dev, "%s found, %s\n", |
669 | ({ char *s; switch (rs5c372->type) { | 655 | ({ char *s; switch (rs5c372->type) { |
670 | case rtc_r2025sd: s = "r2025sd"; break; | 656 | case rtc_r2025sd: s = "r2025sd"; break; |
diff --git a/drivers/rtc/rtc-rv8803.c b/drivers/rtc/rtc-rv8803.c index aae2576741a6..29fc3d210392 100644 --- a/drivers/rtc/rtc-rv8803.c +++ b/drivers/rtc/rtc-rv8803.c | |||
@@ -68,7 +68,6 @@ struct rv8803_data { | |||
68 | struct mutex flags_lock; | 68 | struct mutex flags_lock; |
69 | u8 ctrl; | 69 | u8 ctrl; |
70 | enum rv8803_type type; | 70 | enum rv8803_type type; |
71 | struct nvmem_config nvmem_cfg; | ||
72 | }; | 71 | }; |
73 | 72 | ||
74 | static int rv8803_read_reg(const struct i2c_client *client, u8 reg) | 73 | static int rv8803_read_reg(const struct i2c_client *client, u8 reg) |
@@ -528,6 +527,15 @@ static int rv8803_probe(struct i2c_client *client, | |||
528 | struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); | 527 | struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); |
529 | struct rv8803_data *rv8803; | 528 | struct rv8803_data *rv8803; |
530 | int err, flags; | 529 | int err, flags; |
530 | struct nvmem_config nvmem_cfg = { | ||
531 | .name = "rv8803_nvram", | ||
532 | .word_size = 1, | ||
533 | .stride = 1, | ||
534 | .size = 1, | ||
535 | .reg_read = rv8803_nvram_read, | ||
536 | .reg_write = rv8803_nvram_write, | ||
537 | .priv = client, | ||
538 | }; | ||
531 | 539 | ||
532 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA | | 540 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA | |
533 | I2C_FUNC_SMBUS_I2C_BLOCK)) { | 541 | I2C_FUNC_SMBUS_I2C_BLOCK)) { |
@@ -582,21 +590,6 @@ static int rv8803_probe(struct i2c_client *client, | |||
582 | } | 590 | } |
583 | } | 591 | } |
584 | 592 | ||
585 | rv8803->nvmem_cfg.name = "rv8803_nvram", | ||
586 | rv8803->nvmem_cfg.word_size = 1, | ||
587 | rv8803->nvmem_cfg.stride = 1, | ||
588 | rv8803->nvmem_cfg.size = 1, | ||
589 | rv8803->nvmem_cfg.reg_read = rv8803_nvram_read, | ||
590 | rv8803->nvmem_cfg.reg_write = rv8803_nvram_write, | ||
591 | rv8803->nvmem_cfg.priv = client; | ||
592 | |||
593 | rv8803->rtc->ops = &rv8803_rtc_ops; | ||
594 | rv8803->rtc->nvmem_config = &rv8803->nvmem_cfg; | ||
595 | rv8803->rtc->nvram_old_abi = true; | ||
596 | err = rtc_register_device(rv8803->rtc); | ||
597 | if (err) | ||
598 | return err; | ||
599 | |||
600 | err = rv8803_write_reg(rv8803->client, RV8803_EXT, RV8803_EXT_WADA); | 593 | err = rv8803_write_reg(rv8803->client, RV8803_EXT, RV8803_EXT_WADA); |
601 | if (err) | 594 | if (err) |
602 | return err; | 595 | return err; |
@@ -607,6 +600,14 @@ static int rv8803_probe(struct i2c_client *client, | |||
607 | return err; | 600 | return err; |
608 | } | 601 | } |
609 | 602 | ||
603 | rv8803->rtc->ops = &rv8803_rtc_ops; | ||
604 | rv8803->rtc->nvram_old_abi = true; | ||
605 | err = rtc_register_device(rv8803->rtc); | ||
606 | if (err) | ||
607 | return err; | ||
608 | |||
609 | rtc_nvmem_register(rv8803->rtc, &nvmem_cfg); | ||
610 | |||
610 | rv8803->rtc->max_user_freq = 1; | 611 | rv8803->rtc->max_user_freq = 1; |
611 | 612 | ||
612 | return 0; | 613 | return 0; |
diff --git a/drivers/rtc/rtc-rx4581.c b/drivers/rtc/rtc-rx4581.c index de3fe4f8d133..c59a218bdd87 100644 --- a/drivers/rtc/rtc-rx4581.c +++ b/drivers/rtc/rtc-rx4581.c | |||
@@ -172,11 +172,7 @@ static int rx4581_get_datetime(struct device *dev, struct rtc_time *tm) | |||
172 | tm->tm_sec, tm->tm_min, tm->tm_hour, | 172 | tm->tm_sec, tm->tm_min, tm->tm_hour, |
173 | tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday); | 173 | tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday); |
174 | 174 | ||
175 | err = rtc_valid_tm(tm); | 175 | return 0; |
176 | if (err < 0) | ||
177 | dev_err(dev, "retrieved date/time is not valid.\n"); | ||
178 | |||
179 | return err; | ||
180 | } | 176 | } |
181 | 177 | ||
182 | static int rx4581_set_datetime(struct device *dev, struct rtc_time *tm) | 178 | static int rx4581_set_datetime(struct device *dev, struct rtc_time *tm) |
diff --git a/drivers/rtc/rtc-rx6110.c b/drivers/rtc/rtc-rx6110.c index 7c9c08eab5e5..8e322d884cc2 100644 --- a/drivers/rtc/rtc-rx6110.c +++ b/drivers/rtc/rtc-rx6110.c | |||
@@ -252,7 +252,7 @@ static int rx6110_get_time(struct device *dev, struct rtc_time *tm) | |||
252 | tm->tm_sec, tm->tm_min, tm->tm_hour, | 252 | tm->tm_sec, tm->tm_min, tm->tm_hour, |
253 | tm->tm_mday, tm->tm_mon, tm->tm_year); | 253 | tm->tm_mday, tm->tm_mon, tm->tm_year); |
254 | 254 | ||
255 | return rtc_valid_tm(tm); | 255 | return 0; |
256 | } | 256 | } |
257 | 257 | ||
258 | static const struct reg_sequence rx6110_default_regs[] = { | 258 | static const struct reg_sequence rx6110_default_regs[] = { |
diff --git a/drivers/rtc/rtc-rx8010.c b/drivers/rtc/rtc-rx8010.c index 5c5938ab3d86..7ddc22eb5b0f 100644 --- a/drivers/rtc/rtc-rx8010.c +++ b/drivers/rtc/rtc-rx8010.c | |||
@@ -138,7 +138,7 @@ static int rx8010_get_time(struct device *dev, struct rtc_time *dt) | |||
138 | dt->tm_year = bcd2bin(date[RX8010_YEAR - RX8010_SEC]) + 100; | 138 | dt->tm_year = bcd2bin(date[RX8010_YEAR - RX8010_SEC]) + 100; |
139 | dt->tm_wday = ffs(date[RX8010_WDAY - RX8010_SEC] & 0x7f); | 139 | dt->tm_wday = ffs(date[RX8010_WDAY - RX8010_SEC] & 0x7f); |
140 | 140 | ||
141 | return rtc_valid_tm(dt); | 141 | return 0; |
142 | } | 142 | } |
143 | 143 | ||
144 | static int rx8010_set_time(struct device *dev, struct rtc_time *dt) | 144 | static int rx8010_set_time(struct device *dev, struct rtc_time *dt) |
diff --git a/drivers/rtc/rtc-rx8025.c b/drivers/rtc/rtc-rx8025.c index 91857d8d2df8..41127adf5765 100644 --- a/drivers/rtc/rtc-rx8025.c +++ b/drivers/rtc/rtc-rx8025.c | |||
@@ -214,7 +214,7 @@ static int rx8025_get_time(struct device *dev, struct rtc_time *dt) | |||
214 | dt->tm_sec, dt->tm_min, dt->tm_hour, | 214 | dt->tm_sec, dt->tm_min, dt->tm_hour, |
215 | dt->tm_mday, dt->tm_mon, dt->tm_year); | 215 | dt->tm_mday, dt->tm_mon, dt->tm_year); |
216 | 216 | ||
217 | return rtc_valid_tm(dt); | 217 | return 0; |
218 | } | 218 | } |
219 | 219 | ||
220 | static int rx8025_set_time(struct device *dev, struct rtc_time *dt) | 220 | static int rx8025_set_time(struct device *dev, struct rtc_time *dt) |
diff --git a/drivers/rtc/rtc-rx8581.c b/drivers/rtc/rtc-rx8581.c index 9998d7937688..32caadf912ca 100644 --- a/drivers/rtc/rtc-rx8581.c +++ b/drivers/rtc/rtc-rx8581.c | |||
@@ -164,11 +164,7 @@ static int rx8581_get_datetime(struct i2c_client *client, struct rtc_time *tm) | |||
164 | tm->tm_sec, tm->tm_min, tm->tm_hour, | 164 | tm->tm_sec, tm->tm_min, tm->tm_hour, |
165 | tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday); | 165 | tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday); |
166 | 166 | ||
167 | err = rtc_valid_tm(tm); | 167 | return 0; |
168 | if (err < 0) | ||
169 | dev_err(&client->dev, "retrieved date/time is not valid.\n"); | ||
170 | |||
171 | return err; | ||
172 | } | 168 | } |
173 | 169 | ||
174 | static int rx8581_set_datetime(struct i2c_client *client, struct rtc_time *tm) | 170 | static int rx8581_set_datetime(struct i2c_client *client, struct rtc_time *tm) |
diff --git a/drivers/rtc/rtc-s35390a.c b/drivers/rtc/rtc-s35390a.c index 7067bca5c20d..77feb603cd4c 100644 --- a/drivers/rtc/rtc-s35390a.c +++ b/drivers/rtc/rtc-s35390a.c | |||
@@ -210,8 +210,9 @@ static int s35390a_reg2hr(struct s35390a *s35390a, char reg) | |||
210 | return hour; | 210 | return hour; |
211 | } | 211 | } |
212 | 212 | ||
213 | static int s35390a_set_datetime(struct i2c_client *client, struct rtc_time *tm) | 213 | static int s35390a_rtc_set_time(struct device *dev, struct rtc_time *tm) |
214 | { | 214 | { |
215 | struct i2c_client *client = to_i2c_client(dev); | ||
215 | struct s35390a *s35390a = i2c_get_clientdata(client); | 216 | struct s35390a *s35390a = i2c_get_clientdata(client); |
216 | int i, err; | 217 | int i, err; |
217 | char buf[7], status; | 218 | char buf[7], status; |
@@ -241,8 +242,9 @@ static int s35390a_set_datetime(struct i2c_client *client, struct rtc_time *tm) | |||
241 | return err; | 242 | return err; |
242 | } | 243 | } |
243 | 244 | ||
244 | static int s35390a_get_datetime(struct i2c_client *client, struct rtc_time *tm) | 245 | static int s35390a_rtc_read_time(struct device *dev, struct rtc_time *tm) |
245 | { | 246 | { |
247 | struct i2c_client *client = to_i2c_client(dev); | ||
246 | struct s35390a *s35390a = i2c_get_clientdata(client); | 248 | struct s35390a *s35390a = i2c_get_clientdata(client); |
247 | char buf[7], status; | 249 | char buf[7], status; |
248 | int i, err; | 250 | int i, err; |
@@ -271,11 +273,12 @@ static int s35390a_get_datetime(struct i2c_client *client, struct rtc_time *tm) | |||
271 | tm->tm_min, tm->tm_hour, tm->tm_mday, tm->tm_mon, tm->tm_year, | 273 | tm->tm_min, tm->tm_hour, tm->tm_mday, tm->tm_mon, tm->tm_year, |
272 | tm->tm_wday); | 274 | tm->tm_wday); |
273 | 275 | ||
274 | return rtc_valid_tm(tm); | 276 | return 0; |
275 | } | 277 | } |
276 | 278 | ||
277 | static int s35390a_set_alarm(struct i2c_client *client, struct rtc_wkalrm *alm) | 279 | static int s35390a_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm) |
278 | { | 280 | { |
281 | struct i2c_client *client = to_i2c_client(dev); | ||
279 | struct s35390a *s35390a = i2c_get_clientdata(client); | 282 | struct s35390a *s35390a = i2c_get_clientdata(client); |
280 | char buf[3], sts = 0; | 283 | char buf[3], sts = 0; |
281 | int err, i; | 284 | int err, i; |
@@ -329,8 +332,9 @@ static int s35390a_set_alarm(struct i2c_client *client, struct rtc_wkalrm *alm) | |||
329 | return err; | 332 | return err; |
330 | } | 333 | } |
331 | 334 | ||
332 | static int s35390a_read_alarm(struct i2c_client *client, struct rtc_wkalrm *alm) | 335 | static int s35390a_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alm) |
333 | { | 336 | { |
337 | struct i2c_client *client = to_i2c_client(dev); | ||
334 | struct s35390a *s35390a = i2c_get_clientdata(client); | 338 | struct s35390a *s35390a = i2c_get_clientdata(client); |
335 | char buf[3], sts; | 339 | char buf[3], sts; |
336 | int i, err; | 340 | int i, err; |
@@ -384,26 +388,6 @@ static int s35390a_read_alarm(struct i2c_client *client, struct rtc_wkalrm *alm) | |||
384 | return 0; | 388 | return 0; |
385 | } | 389 | } |
386 | 390 | ||
387 | static int s35390a_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alm) | ||
388 | { | ||
389 | return s35390a_read_alarm(to_i2c_client(dev), alm); | ||
390 | } | ||
391 | |||
392 | static int s35390a_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm) | ||
393 | { | ||
394 | return s35390a_set_alarm(to_i2c_client(dev), alm); | ||
395 | } | ||
396 | |||
397 | static int s35390a_rtc_read_time(struct device *dev, struct rtc_time *tm) | ||
398 | { | ||
399 | return s35390a_get_datetime(to_i2c_client(dev), tm); | ||
400 | } | ||
401 | |||
402 | static int s35390a_rtc_set_time(struct device *dev, struct rtc_time *tm) | ||
403 | { | ||
404 | return s35390a_set_datetime(to_i2c_client(dev), tm); | ||
405 | } | ||
406 | |||
407 | static int s35390a_rtc_ioctl(struct device *dev, unsigned int cmd, | 391 | static int s35390a_rtc_ioctl(struct device *dev, unsigned int cmd, |
408 | unsigned long arg) | 392 | unsigned long arg) |
409 | { | 393 | { |
@@ -450,7 +434,6 @@ static int s35390a_probe(struct i2c_client *client, | |||
450 | int err, err_read; | 434 | int err, err_read; |
451 | unsigned int i; | 435 | unsigned int i; |
452 | struct s35390a *s35390a; | 436 | struct s35390a *s35390a; |
453 | struct rtc_time tm; | ||
454 | char buf, status1; | 437 | char buf, status1; |
455 | 438 | ||
456 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { | 439 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { |
@@ -508,9 +491,6 @@ static int s35390a_probe(struct i2c_client *client, | |||
508 | } | 491 | } |
509 | } | 492 | } |
510 | 493 | ||
511 | if (err_read > 0 || s35390a_get_datetime(client, &tm) < 0) | ||
512 | dev_warn(&client->dev, "clock needs to be set\n"); | ||
513 | |||
514 | device_set_wakeup_capable(&client->dev, 1); | 494 | device_set_wakeup_capable(&client->dev, 1); |
515 | 495 | ||
516 | s35390a->rtc = devm_rtc_device_register(&client->dev, | 496 | s35390a->rtc = devm_rtc_device_register(&client->dev, |
diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c index a8992c227f61..75c8c5033e08 100644 --- a/drivers/rtc/rtc-s3c.c +++ b/drivers/rtc/rtc-s3c.c | |||
@@ -232,7 +232,7 @@ retry_get_time: | |||
232 | 232 | ||
233 | rtc_tm->tm_mon -= 1; | 233 | rtc_tm->tm_mon -= 1; |
234 | 234 | ||
235 | return rtc_valid_tm(rtc_tm); | 235 | return 0; |
236 | } | 236 | } |
237 | 237 | ||
238 | static int s3c_rtc_settime(struct device *dev, struct rtc_time *tm) | 238 | static int s3c_rtc_settime(struct device *dev, struct rtc_time *tm) |
diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c index 0477678d968f..8428455432ca 100644 --- a/drivers/rtc/rtc-s5m.c +++ b/drivers/rtc/rtc-s5m.c | |||
@@ -38,6 +38,19 @@ | |||
38 | */ | 38 | */ |
39 | #define UDR_READ_RETRY_CNT 5 | 39 | #define UDR_READ_RETRY_CNT 5 |
40 | 40 | ||
41 | enum { | ||
42 | RTC_SEC = 0, | ||
43 | RTC_MIN, | ||
44 | RTC_HOUR, | ||
45 | RTC_WEEKDAY, | ||
46 | RTC_DATE, | ||
47 | RTC_MONTH, | ||
48 | RTC_YEAR1, | ||
49 | RTC_YEAR2, | ||
50 | /* Make sure this is always the last enum name. */ | ||
51 | RTC_MAX_NUM_TIME_REGS | ||
52 | }; | ||
53 | |||
41 | /* | 54 | /* |
42 | * Registers used by the driver which are different between chipsets. | 55 | * Registers used by the driver which are different between chipsets. |
43 | * | 56 | * |
@@ -367,7 +380,7 @@ static void s5m8763_tm_to_data(struct rtc_time *tm, u8 *data) | |||
367 | static int s5m_rtc_read_time(struct device *dev, struct rtc_time *tm) | 380 | static int s5m_rtc_read_time(struct device *dev, struct rtc_time *tm) |
368 | { | 381 | { |
369 | struct s5m_rtc_info *info = dev_get_drvdata(dev); | 382 | struct s5m_rtc_info *info = dev_get_drvdata(dev); |
370 | u8 data[info->regs->regs_count]; | 383 | u8 data[RTC_MAX_NUM_TIME_REGS]; |
371 | int ret; | 384 | int ret; |
372 | 385 | ||
373 | if (info->regs->read_time_udr_mask) { | 386 | if (info->regs->read_time_udr_mask) { |
@@ -407,13 +420,13 @@ static int s5m_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
407 | 1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday, | 420 | 1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday, |
408 | tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_wday); | 421 | tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_wday); |
409 | 422 | ||
410 | return rtc_valid_tm(tm); | 423 | return 0; |
411 | } | 424 | } |
412 | 425 | ||
413 | static int s5m_rtc_set_time(struct device *dev, struct rtc_time *tm) | 426 | static int s5m_rtc_set_time(struct device *dev, struct rtc_time *tm) |
414 | { | 427 | { |
415 | struct s5m_rtc_info *info = dev_get_drvdata(dev); | 428 | struct s5m_rtc_info *info = dev_get_drvdata(dev); |
416 | u8 data[info->regs->regs_count]; | 429 | u8 data[RTC_MAX_NUM_TIME_REGS]; |
417 | int ret = 0; | 430 | int ret = 0; |
418 | 431 | ||
419 | switch (info->device_type) { | 432 | switch (info->device_type) { |
@@ -450,7 +463,7 @@ static int s5m_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
450 | static int s5m_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) | 463 | static int s5m_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) |
451 | { | 464 | { |
452 | struct s5m_rtc_info *info = dev_get_drvdata(dev); | 465 | struct s5m_rtc_info *info = dev_get_drvdata(dev); |
453 | u8 data[info->regs->regs_count]; | 466 | u8 data[RTC_MAX_NUM_TIME_REGS]; |
454 | unsigned int val; | 467 | unsigned int val; |
455 | int ret, i; | 468 | int ret, i; |
456 | 469 | ||
@@ -500,7 +513,7 @@ static int s5m_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
500 | 513 | ||
501 | static int s5m_rtc_stop_alarm(struct s5m_rtc_info *info) | 514 | static int s5m_rtc_stop_alarm(struct s5m_rtc_info *info) |
502 | { | 515 | { |
503 | u8 data[info->regs->regs_count]; | 516 | u8 data[RTC_MAX_NUM_TIME_REGS]; |
504 | int ret, i; | 517 | int ret, i; |
505 | struct rtc_time tm; | 518 | struct rtc_time tm; |
506 | 519 | ||
@@ -545,7 +558,7 @@ static int s5m_rtc_stop_alarm(struct s5m_rtc_info *info) | |||
545 | static int s5m_rtc_start_alarm(struct s5m_rtc_info *info) | 558 | static int s5m_rtc_start_alarm(struct s5m_rtc_info *info) |
546 | { | 559 | { |
547 | int ret; | 560 | int ret; |
548 | u8 data[info->regs->regs_count]; | 561 | u8 data[RTC_MAX_NUM_TIME_REGS]; |
549 | u8 alarm0_conf; | 562 | u8 alarm0_conf; |
550 | struct rtc_time tm; | 563 | struct rtc_time tm; |
551 | 564 | ||
@@ -598,7 +611,7 @@ static int s5m_rtc_start_alarm(struct s5m_rtc_info *info) | |||
598 | static int s5m_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) | 611 | static int s5m_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) |
599 | { | 612 | { |
600 | struct s5m_rtc_info *info = dev_get_drvdata(dev); | 613 | struct s5m_rtc_info *info = dev_get_drvdata(dev); |
601 | u8 data[info->regs->regs_count]; | 614 | u8 data[RTC_MAX_NUM_TIME_REGS]; |
602 | int ret; | 615 | int ret; |
603 | 616 | ||
604 | switch (info->device_type) { | 617 | switch (info->device_type) { |
diff --git a/drivers/rtc/rtc-sc27xx.c b/drivers/rtc/rtc-sc27xx.c index d544d5268757..00d87d138984 100644 --- a/drivers/rtc/rtc-sc27xx.c +++ b/drivers/rtc/rtc-sc27xx.c | |||
@@ -376,7 +376,7 @@ static int sprd_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
376 | return ret; | 376 | return ret; |
377 | 377 | ||
378 | rtc_time64_to_tm(secs, tm); | 378 | rtc_time64_to_tm(secs, tm); |
379 | return rtc_valid_tm(tm); | 379 | return 0; |
380 | } | 380 | } |
381 | 381 | ||
382 | static int sprd_rtc_set_time(struct device *dev, struct rtc_time *tm) | 382 | static int sprd_rtc_set_time(struct device *dev, struct rtc_time *tm) |
diff --git a/drivers/rtc/rtc-sh.c b/drivers/rtc/rtc-sh.c index 6c2d3989f967..4e8ab370ce63 100644 --- a/drivers/rtc/rtc-sh.c +++ b/drivers/rtc/rtc-sh.c | |||
@@ -414,7 +414,7 @@ static int sh_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
414 | tm->tm_sec, tm->tm_min, tm->tm_hour, | 414 | tm->tm_sec, tm->tm_min, tm->tm_hour, |
415 | tm->tm_mday, tm->tm_mon + 1, tm->tm_year, tm->tm_wday); | 415 | tm->tm_mday, tm->tm_mon + 1, tm->tm_year, tm->tm_wday); |
416 | 416 | ||
417 | return rtc_valid_tm(tm); | 417 | return 0; |
418 | } | 418 | } |
419 | 419 | ||
420 | static int sh_rtc_set_time(struct device *dev, struct rtc_time *tm) | 420 | static int sh_rtc_set_time(struct device *dev, struct rtc_time *tm) |
diff --git a/drivers/rtc/rtc-sirfsoc.c b/drivers/rtc/rtc-sirfsoc.c index 7367f617145c..2a9e151cae99 100644 --- a/drivers/rtc/rtc-sirfsoc.c +++ b/drivers/rtc/rtc-sirfsoc.c | |||
@@ -204,23 +204,6 @@ static int sirfsoc_rtc_set_time(struct device *dev, | |||
204 | return 0; | 204 | return 0; |
205 | } | 205 | } |
206 | 206 | ||
207 | static int sirfsoc_rtc_ioctl(struct device *dev, unsigned int cmd, | ||
208 | unsigned long arg) | ||
209 | { | ||
210 | switch (cmd) { | ||
211 | case RTC_PIE_ON: | ||
212 | case RTC_PIE_OFF: | ||
213 | case RTC_UIE_ON: | ||
214 | case RTC_UIE_OFF: | ||
215 | case RTC_AIE_ON: | ||
216 | case RTC_AIE_OFF: | ||
217 | return 0; | ||
218 | |||
219 | default: | ||
220 | return -ENOIOCTLCMD; | ||
221 | } | ||
222 | } | ||
223 | |||
224 | static int sirfsoc_rtc_alarm_irq_enable(struct device *dev, | 207 | static int sirfsoc_rtc_alarm_irq_enable(struct device *dev, |
225 | unsigned int enabled) | 208 | unsigned int enabled) |
226 | { | 209 | { |
@@ -250,7 +233,6 @@ static const struct rtc_class_ops sirfsoc_rtc_ops = { | |||
250 | .set_time = sirfsoc_rtc_set_time, | 233 | .set_time = sirfsoc_rtc_set_time, |
251 | .read_alarm = sirfsoc_rtc_read_alarm, | 234 | .read_alarm = sirfsoc_rtc_read_alarm, |
252 | .set_alarm = sirfsoc_rtc_set_alarm, | 235 | .set_alarm = sirfsoc_rtc_set_alarm, |
253 | .ioctl = sirfsoc_rtc_ioctl, | ||
254 | .alarm_irq_enable = sirfsoc_rtc_alarm_irq_enable | 236 | .alarm_irq_enable = sirfsoc_rtc_alarm_irq_enable |
255 | }; | 237 | }; |
256 | 238 | ||
diff --git a/drivers/rtc/rtc-snvs.c b/drivers/rtc/rtc-snvs.c index d8ef9e052c4f..9af591d5223c 100644 --- a/drivers/rtc/rtc-snvs.c +++ b/drivers/rtc/rtc-snvs.c | |||
@@ -132,20 +132,23 @@ static int snvs_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
132 | { | 132 | { |
133 | struct snvs_rtc_data *data = dev_get_drvdata(dev); | 133 | struct snvs_rtc_data *data = dev_get_drvdata(dev); |
134 | unsigned long time; | 134 | unsigned long time; |
135 | int ret; | ||
135 | 136 | ||
136 | rtc_tm_to_time(tm, &time); | 137 | rtc_tm_to_time(tm, &time); |
137 | 138 | ||
138 | /* Disable RTC first */ | 139 | /* Disable RTC first */ |
139 | snvs_rtc_enable(data, false); | 140 | ret = snvs_rtc_enable(data, false); |
141 | if (ret) | ||
142 | return ret; | ||
140 | 143 | ||
141 | /* Write 32-bit time to 47-bit timer, leaving 15 LSBs blank */ | 144 | /* Write 32-bit time to 47-bit timer, leaving 15 LSBs blank */ |
142 | regmap_write(data->regmap, data->offset + SNVS_LPSRTCLR, time << CNTR_TO_SECS_SH); | 145 | regmap_write(data->regmap, data->offset + SNVS_LPSRTCLR, time << CNTR_TO_SECS_SH); |
143 | regmap_write(data->regmap, data->offset + SNVS_LPSRTCMR, time >> (32 - CNTR_TO_SECS_SH)); | 146 | regmap_write(data->regmap, data->offset + SNVS_LPSRTCMR, time >> (32 - CNTR_TO_SECS_SH)); |
144 | 147 | ||
145 | /* Enable RTC again */ | 148 | /* Enable RTC again */ |
146 | snvs_rtc_enable(data, true); | 149 | ret = snvs_rtc_enable(data, true); |
147 | 150 | ||
148 | return 0; | 151 | return ret; |
149 | } | 152 | } |
150 | 153 | ||
151 | static int snvs_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) | 154 | static int snvs_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) |
@@ -288,7 +291,11 @@ static int snvs_rtc_probe(struct platform_device *pdev) | |||
288 | regmap_write(data->regmap, data->offset + SNVS_LPSR, 0xffffffff); | 291 | regmap_write(data->regmap, data->offset + SNVS_LPSR, 0xffffffff); |
289 | 292 | ||
290 | /* Enable RTC */ | 293 | /* Enable RTC */ |
291 | snvs_rtc_enable(data, true); | 294 | ret = snvs_rtc_enable(data, true); |
295 | if (ret) { | ||
296 | dev_err(&pdev->dev, "failed to enable rtc %d\n", ret); | ||
297 | goto error_rtc_device_register; | ||
298 | } | ||
292 | 299 | ||
293 | device_init_wakeup(&pdev->dev, true); | 300 | device_init_wakeup(&pdev->dev, true); |
294 | 301 | ||
diff --git a/drivers/rtc/rtc-spear.c b/drivers/rtc/rtc-spear.c index e377f42abae7..0567944fd4f8 100644 --- a/drivers/rtc/rtc-spear.c +++ b/drivers/rtc/rtc-spear.c | |||
@@ -170,18 +170,14 @@ static irqreturn_t spear_rtc_irq(int irq, void *dev_id) | |||
170 | 170 | ||
171 | } | 171 | } |
172 | 172 | ||
173 | static int tm2bcd(struct rtc_time *tm) | 173 | static void tm2bcd(struct rtc_time *tm) |
174 | { | 174 | { |
175 | if (rtc_valid_tm(tm) != 0) | ||
176 | return -EINVAL; | ||
177 | tm->tm_sec = bin2bcd(tm->tm_sec); | 175 | tm->tm_sec = bin2bcd(tm->tm_sec); |
178 | tm->tm_min = bin2bcd(tm->tm_min); | 176 | tm->tm_min = bin2bcd(tm->tm_min); |
179 | tm->tm_hour = bin2bcd(tm->tm_hour); | 177 | tm->tm_hour = bin2bcd(tm->tm_hour); |
180 | tm->tm_mday = bin2bcd(tm->tm_mday); | 178 | tm->tm_mday = bin2bcd(tm->tm_mday); |
181 | tm->tm_mon = bin2bcd(tm->tm_mon + 1); | 179 | tm->tm_mon = bin2bcd(tm->tm_mon + 1); |
182 | tm->tm_year = bin2bcd(tm->tm_year); | 180 | tm->tm_year = bin2bcd(tm->tm_year); |
183 | |||
184 | return 0; | ||
185 | } | 181 | } |
186 | 182 | ||
187 | static void bcd2tm(struct rtc_time *tm) | 183 | static void bcd2tm(struct rtc_time *tm) |
@@ -237,8 +233,7 @@ static int spear_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
237 | struct spear_rtc_config *config = dev_get_drvdata(dev); | 233 | struct spear_rtc_config *config = dev_get_drvdata(dev); |
238 | unsigned int time, date; | 234 | unsigned int time, date; |
239 | 235 | ||
240 | if (tm2bcd(tm) < 0) | 236 | tm2bcd(tm); |
241 | return -EINVAL; | ||
242 | 237 | ||
243 | rtc_wait_not_busy(config); | 238 | rtc_wait_not_busy(config); |
244 | time = (tm->tm_sec << SECOND_SHIFT) | (tm->tm_min << MINUTE_SHIFT) | | 239 | time = (tm->tm_sec << SECOND_SHIFT) | (tm->tm_min << MINUTE_SHIFT) | |
@@ -295,8 +290,7 @@ static int spear_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm) | |||
295 | unsigned int time, date; | 290 | unsigned int time, date; |
296 | int err; | 291 | int err; |
297 | 292 | ||
298 | if (tm2bcd(&alm->time) < 0) | 293 | tm2bcd(&alm->time); |
299 | return -EINVAL; | ||
300 | 294 | ||
301 | rtc_wait_not_busy(config); | 295 | rtc_wait_not_busy(config); |
302 | 296 | ||
diff --git a/drivers/rtc/rtc-st-lpc.c b/drivers/rtc/rtc-st-lpc.c index 82b0af159a28..d5222667f892 100644 --- a/drivers/rtc/rtc-st-lpc.c +++ b/drivers/rtc/rtc-st-lpc.c | |||
@@ -195,7 +195,6 @@ static int st_rtc_probe(struct platform_device *pdev) | |||
195 | struct device_node *np = pdev->dev.of_node; | 195 | struct device_node *np = pdev->dev.of_node; |
196 | struct st_rtc *rtc; | 196 | struct st_rtc *rtc; |
197 | struct resource *res; | 197 | struct resource *res; |
198 | struct rtc_time tm_check; | ||
199 | uint32_t mode; | 198 | uint32_t mode; |
200 | int ret = 0; | 199 | int ret = 0; |
201 | 200 | ||
@@ -254,21 +253,6 @@ static int st_rtc_probe(struct platform_device *pdev) | |||
254 | 253 | ||
255 | platform_set_drvdata(pdev, rtc); | 254 | platform_set_drvdata(pdev, rtc); |
256 | 255 | ||
257 | /* | ||
258 | * The RTC-LPC is able to manage date.year > 2038 | ||
259 | * but currently the kernel can not manage this date! | ||
260 | * If the RTC-LPC has a date.year > 2038 then | ||
261 | * it's set to the epoch "Jan 1st 2000" | ||
262 | */ | ||
263 | st_rtc_read_time(&pdev->dev, &tm_check); | ||
264 | |||
265 | if (tm_check.tm_year >= (2038 - 1900)) { | ||
266 | memset(&tm_check, 0, sizeof(tm_check)); | ||
267 | tm_check.tm_year = 100; | ||
268 | tm_check.tm_mday = 1; | ||
269 | st_rtc_set_time(&pdev->dev, &tm_check); | ||
270 | } | ||
271 | |||
272 | rtc->rtc_dev = rtc_device_register("st-lpc-rtc", &pdev->dev, | 256 | rtc->rtc_dev = rtc_device_register("st-lpc-rtc", &pdev->dev, |
273 | &st_rtc_ops, THIS_MODULE); | 257 | &st_rtc_ops, THIS_MODULE); |
274 | if (IS_ERR(rtc->rtc_dev)) { | 258 | if (IS_ERR(rtc->rtc_dev)) { |
diff --git a/drivers/rtc/rtc-starfire.c b/drivers/rtc/rtc-starfire.c index 7fc36973fa33..a7d49329d626 100644 --- a/drivers/rtc/rtc-starfire.c +++ b/drivers/rtc/rtc-starfire.c | |||
@@ -28,7 +28,7 @@ static u32 starfire_get_time(void) | |||
28 | static int starfire_read_time(struct device *dev, struct rtc_time *tm) | 28 | static int starfire_read_time(struct device *dev, struct rtc_time *tm) |
29 | { | 29 | { |
30 | rtc_time_to_tm(starfire_get_time(), tm); | 30 | rtc_time_to_tm(starfire_get_time(), tm); |
31 | return rtc_valid_tm(tm); | 31 | return 0; |
32 | } | 32 | } |
33 | 33 | ||
34 | static const struct rtc_class_ops starfire_rtc_ops = { | 34 | static const struct rtc_class_ops starfire_rtc_ops = { |
diff --git a/drivers/rtc/rtc-stk17ta8.c b/drivers/rtc/rtc-stk17ta8.c index a456cb6177ea..e70b78d17a98 100644 --- a/drivers/rtc/rtc-stk17ta8.c +++ b/drivers/rtc/rtc-stk17ta8.c | |||
@@ -129,10 +129,6 @@ static int stk17ta8_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
129 | /* year is 1900 + tm->tm_year */ | 129 | /* year is 1900 + tm->tm_year */ |
130 | tm->tm_year = bcd2bin(year) + bcd2bin(century) * 100 - 1900; | 130 | tm->tm_year = bcd2bin(year) + bcd2bin(century) * 100 - 1900; |
131 | 131 | ||
132 | if (rtc_valid_tm(tm) < 0) { | ||
133 | dev_err(dev, "retrieved date/time is not valid.\n"); | ||
134 | rtc_time_to_tm(0, tm); | ||
135 | } | ||
136 | return 0; | 132 | return 0; |
137 | } | 133 | } |
138 | 134 | ||
@@ -242,46 +238,30 @@ static const struct rtc_class_ops stk17ta8_rtc_ops = { | |||
242 | .alarm_irq_enable = stk17ta8_rtc_alarm_irq_enable, | 238 | .alarm_irq_enable = stk17ta8_rtc_alarm_irq_enable, |
243 | }; | 239 | }; |
244 | 240 | ||
245 | static ssize_t stk17ta8_nvram_read(struct file *filp, struct kobject *kobj, | 241 | static int stk17ta8_nvram_read(void *priv, unsigned int pos, void *val, |
246 | struct bin_attribute *attr, char *buf, | 242 | size_t bytes) |
247 | loff_t pos, size_t size) | ||
248 | { | 243 | { |
249 | struct device *dev = container_of(kobj, struct device, kobj); | 244 | struct rtc_plat_data *pdata = priv; |
250 | struct platform_device *pdev = to_platform_device(dev); | ||
251 | struct rtc_plat_data *pdata = platform_get_drvdata(pdev); | ||
252 | void __iomem *ioaddr = pdata->ioaddr; | 245 | void __iomem *ioaddr = pdata->ioaddr; |
253 | ssize_t count; | 246 | u8 *buf = val; |
254 | 247 | ||
255 | for (count = 0; count < size; count++) | 248 | for (; bytes; bytes--) |
256 | *buf++ = readb(ioaddr + pos++); | 249 | *buf++ = readb(ioaddr + pos++); |
257 | return count; | 250 | return 0; |
258 | } | 251 | } |
259 | 252 | ||
260 | static ssize_t stk17ta8_nvram_write(struct file *filp, struct kobject *kobj, | 253 | static int stk17ta8_nvram_write(void *priv, unsigned int pos, void *val, |
261 | struct bin_attribute *attr, char *buf, | 254 | size_t bytes) |
262 | loff_t pos, size_t size) | ||
263 | { | 255 | { |
264 | struct device *dev = container_of(kobj, struct device, kobj); | 256 | struct rtc_plat_data *pdata = priv; |
265 | struct platform_device *pdev = to_platform_device(dev); | ||
266 | struct rtc_plat_data *pdata = platform_get_drvdata(pdev); | ||
267 | void __iomem *ioaddr = pdata->ioaddr; | 257 | void __iomem *ioaddr = pdata->ioaddr; |
268 | ssize_t count; | 258 | u8 *buf = val; |
269 | 259 | ||
270 | for (count = 0; count < size; count++) | 260 | for (; bytes; bytes--) |
271 | writeb(*buf++, ioaddr + pos++); | 261 | writeb(*buf++, ioaddr + pos++); |
272 | return count; | 262 | return 0; |
273 | } | 263 | } |
274 | 264 | ||
275 | static struct bin_attribute stk17ta8_nvram_attr = { | ||
276 | .attr = { | ||
277 | .name = "nvram", | ||
278 | .mode = S_IRUGO | S_IWUSR, | ||
279 | }, | ||
280 | .size = RTC_OFFSET, | ||
281 | .read = stk17ta8_nvram_read, | ||
282 | .write = stk17ta8_nvram_write, | ||
283 | }; | ||
284 | |||
285 | static int stk17ta8_rtc_probe(struct platform_device *pdev) | 265 | static int stk17ta8_rtc_probe(struct platform_device *pdev) |
286 | { | 266 | { |
287 | struct resource *res; | 267 | struct resource *res; |
@@ -290,6 +270,14 @@ static int stk17ta8_rtc_probe(struct platform_device *pdev) | |||
290 | struct rtc_plat_data *pdata; | 270 | struct rtc_plat_data *pdata; |
291 | void __iomem *ioaddr; | 271 | void __iomem *ioaddr; |
292 | int ret = 0; | 272 | int ret = 0; |
273 | struct nvmem_config nvmem_cfg = { | ||
274 | .name = "stk17ta8_nvram", | ||
275 | .word_size = 1, | ||
276 | .stride = 1, | ||
277 | .size = RTC_OFFSET, | ||
278 | .reg_read = stk17ta8_nvram_read, | ||
279 | .reg_write = stk17ta8_nvram_write, | ||
280 | }; | ||
293 | 281 | ||
294 | pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); | 282 | pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); |
295 | if (!pdata) | 283 | if (!pdata) |
@@ -328,24 +316,19 @@ static int stk17ta8_rtc_probe(struct platform_device *pdev) | |||
328 | } | 316 | } |
329 | } | 317 | } |
330 | 318 | ||
331 | pdata->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, | 319 | pdata->rtc = devm_rtc_allocate_device(&pdev->dev); |
332 | &stk17ta8_rtc_ops, THIS_MODULE); | ||
333 | if (IS_ERR(pdata->rtc)) | 320 | if (IS_ERR(pdata->rtc)) |
334 | return PTR_ERR(pdata->rtc); | 321 | return PTR_ERR(pdata->rtc); |
335 | 322 | ||
336 | ret = sysfs_create_bin_file(&pdev->dev.kobj, &stk17ta8_nvram_attr); | 323 | pdata->rtc->ops = &stk17ta8_rtc_ops; |
324 | pdata->rtc->nvram_old_abi = true; | ||
337 | 325 | ||
338 | return ret; | 326 | nvmem_cfg.priv = pdata; |
339 | } | 327 | ret = rtc_nvmem_register(pdata->rtc, &nvmem_cfg); |
328 | if (ret) | ||
329 | return ret; | ||
340 | 330 | ||
341 | static int stk17ta8_rtc_remove(struct platform_device *pdev) | 331 | return rtc_register_device(pdata->rtc); |
342 | { | ||
343 | struct rtc_plat_data *pdata = platform_get_drvdata(pdev); | ||
344 | |||
345 | sysfs_remove_bin_file(&pdev->dev.kobj, &stk17ta8_nvram_attr); | ||
346 | if (pdata->irq > 0) | ||
347 | writeb(0, pdata->ioaddr + RTC_INTERRUPTS); | ||
348 | return 0; | ||
349 | } | 332 | } |
350 | 333 | ||
351 | /* work with hotplug and coldplug */ | 334 | /* work with hotplug and coldplug */ |
@@ -353,7 +336,6 @@ MODULE_ALIAS("platform:stk17ta8"); | |||
353 | 336 | ||
354 | static struct platform_driver stk17ta8_rtc_driver = { | 337 | static struct platform_driver stk17ta8_rtc_driver = { |
355 | .probe = stk17ta8_rtc_probe, | 338 | .probe = stk17ta8_rtc_probe, |
356 | .remove = stk17ta8_rtc_remove, | ||
357 | .driver = { | 339 | .driver = { |
358 | .name = "stk17ta8", | 340 | .name = "stk17ta8", |
359 | }, | 341 | }, |
diff --git a/drivers/rtc/rtc-sun6i.c b/drivers/rtc/rtc-sun6i.c index 5bc28eed1adf..2e6fb275acc8 100644 --- a/drivers/rtc/rtc-sun6i.c +++ b/drivers/rtc/rtc-sun6i.c | |||
@@ -349,7 +349,7 @@ static int sun6i_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm) | |||
349 | */ | 349 | */ |
350 | rtc_tm->tm_year += SUN6I_YEAR_OFF; | 350 | rtc_tm->tm_year += SUN6I_YEAR_OFF; |
351 | 351 | ||
352 | return rtc_valid_tm(rtc_tm); | 352 | return 0; |
353 | } | 353 | } |
354 | 354 | ||
355 | static int sun6i_rtc_getalarm(struct device *dev, struct rtc_wkalrm *wkalrm) | 355 | static int sun6i_rtc_getalarm(struct device *dev, struct rtc_wkalrm *wkalrm) |
diff --git a/drivers/rtc/rtc-sunxi.c b/drivers/rtc/rtc-sunxi.c index abada609ddc7..dadbf8b324ad 100644 --- a/drivers/rtc/rtc-sunxi.c +++ b/drivers/rtc/rtc-sunxi.c | |||
@@ -261,7 +261,7 @@ static int sunxi_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm) | |||
261 | */ | 261 | */ |
262 | rtc_tm->tm_year += SUNXI_YEAR_OFF(chip->data_year); | 262 | rtc_tm->tm_year += SUNXI_YEAR_OFF(chip->data_year); |
263 | 263 | ||
264 | return rtc_valid_tm(rtc_tm); | 264 | return 0; |
265 | } | 265 | } |
266 | 266 | ||
267 | static int sunxi_rtc_setalarm(struct device *dev, struct rtc_wkalrm *wkalrm) | 267 | static int sunxi_rtc_setalarm(struct device *dev, struct rtc_wkalrm *wkalrm) |
diff --git a/drivers/rtc/rtc-sysfs.c b/drivers/rtc/rtc-sysfs.c index 92ff2edb86a6..454da38c6012 100644 --- a/drivers/rtc/rtc-sysfs.c +++ b/drivers/rtc/rtc-sysfs.c | |||
@@ -248,6 +248,14 @@ offset_store(struct device *dev, struct device_attribute *attr, | |||
248 | } | 248 | } |
249 | static DEVICE_ATTR_RW(offset); | 249 | static DEVICE_ATTR_RW(offset); |
250 | 250 | ||
251 | static ssize_t | ||
252 | range_show(struct device *dev, struct device_attribute *attr, char *buf) | ||
253 | { | ||
254 | return sprintf(buf, "[%lld,%llu]\n", to_rtc_device(dev)->range_min, | ||
255 | to_rtc_device(dev)->range_max); | ||
256 | } | ||
257 | static DEVICE_ATTR_RO(range); | ||
258 | |||
251 | static struct attribute *rtc_attrs[] = { | 259 | static struct attribute *rtc_attrs[] = { |
252 | &dev_attr_name.attr, | 260 | &dev_attr_name.attr, |
253 | &dev_attr_date.attr, | 261 | &dev_attr_date.attr, |
@@ -257,6 +265,7 @@ static struct attribute *rtc_attrs[] = { | |||
257 | &dev_attr_hctosys.attr, | 265 | &dev_attr_hctosys.attr, |
258 | &dev_attr_wakealarm.attr, | 266 | &dev_attr_wakealarm.attr, |
259 | &dev_attr_offset.attr, | 267 | &dev_attr_offset.attr, |
268 | &dev_attr_range.attr, | ||
260 | NULL, | 269 | NULL, |
261 | }; | 270 | }; |
262 | 271 | ||
@@ -286,6 +295,9 @@ static umode_t rtc_attr_is_visible(struct kobject *kobj, | |||
286 | } else if (attr == &dev_attr_offset.attr) { | 295 | } else if (attr == &dev_attr_offset.attr) { |
287 | if (!rtc->ops->set_offset) | 296 | if (!rtc->ops->set_offset) |
288 | mode = 0; | 297 | mode = 0; |
298 | } else if (attr == &dev_attr_range.attr) { | ||
299 | if (!(rtc->range_max - rtc->range_min)) | ||
300 | mode = 0; | ||
289 | } | 301 | } |
290 | 302 | ||
291 | return mode; | 303 | return mode; |
diff --git a/drivers/rtc/rtc-tegra.c b/drivers/rtc/rtc-tegra.c index d30d57b048d3..66efff60c4d5 100644 --- a/drivers/rtc/rtc-tegra.c +++ b/drivers/rtc/rtc-tegra.c | |||
@@ -144,10 +144,6 @@ static int tegra_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
144 | int ret; | 144 | int ret; |
145 | 145 | ||
146 | /* convert tm to seconds. */ | 146 | /* convert tm to seconds. */ |
147 | ret = rtc_valid_tm(tm); | ||
148 | if (ret) | ||
149 | return ret; | ||
150 | |||
151 | rtc_tm_to_time(tm, &sec); | 147 | rtc_tm_to_time(tm, &sec); |
152 | 148 | ||
153 | dev_vdbg(dev, "time set to %lu. %d/%d/%d %d:%02u:%02u\n", | 149 | dev_vdbg(dev, "time set to %lu. %d/%d/%d %d:%02u:%02u\n", |
diff --git a/drivers/rtc/rtc-tps6586x.c b/drivers/rtc/rtc-tps6586x.c index a3418a8a3796..d7785ae0a2b4 100644 --- a/drivers/rtc/rtc-tps6586x.c +++ b/drivers/rtc/rtc-tps6586x.c | |||
@@ -90,7 +90,7 @@ static int tps6586x_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
90 | seconds = ticks >> 10; | 90 | seconds = ticks >> 10; |
91 | seconds += rtc->epoch_start; | 91 | seconds += rtc->epoch_start; |
92 | rtc_time_to_tm(seconds, tm); | 92 | rtc_time_to_tm(seconds, tm); |
93 | return rtc_valid_tm(tm); | 93 | return 0; |
94 | } | 94 | } |
95 | 95 | ||
96 | static int tps6586x_rtc_set_time(struct device *dev, struct rtc_time *tm) | 96 | static int tps6586x_rtc_set_time(struct device *dev, struct rtc_time *tm) |
diff --git a/drivers/rtc/rtc-tx4939.c b/drivers/rtc/rtc-tx4939.c index 560d9a5e0225..08dbefc79520 100644 --- a/drivers/rtc/rtc-tx4939.c +++ b/drivers/rtc/rtc-tx4939.c | |||
@@ -14,7 +14,30 @@ | |||
14 | #include <linux/module.h> | 14 | #include <linux/module.h> |
15 | #include <linux/io.h> | 15 | #include <linux/io.h> |
16 | #include <linux/gfp.h> | 16 | #include <linux/gfp.h> |
17 | #include <asm/txx9/tx4939.h> | 17 | |
18 | #define TX4939_RTCCTL_ALME 0x00000080 | ||
19 | #define TX4939_RTCCTL_ALMD 0x00000040 | ||
20 | #define TX4939_RTCCTL_BUSY 0x00000020 | ||
21 | |||
22 | #define TX4939_RTCCTL_COMMAND 0x00000007 | ||
23 | #define TX4939_RTCCTL_COMMAND_NOP 0x00000000 | ||
24 | #define TX4939_RTCCTL_COMMAND_GETTIME 0x00000001 | ||
25 | #define TX4939_RTCCTL_COMMAND_SETTIME 0x00000002 | ||
26 | #define TX4939_RTCCTL_COMMAND_GETALARM 0x00000003 | ||
27 | #define TX4939_RTCCTL_COMMAND_SETALARM 0x00000004 | ||
28 | |||
29 | #define TX4939_RTCTBC_PM 0x00000080 | ||
30 | #define TX4939_RTCTBC_COMP 0x0000007f | ||
31 | |||
32 | #define TX4939_RTC_REG_RAMSIZE 0x00000100 | ||
33 | #define TX4939_RTC_REG_RWBSIZE 0x00000006 | ||
34 | |||
35 | struct tx4939_rtc_reg { | ||
36 | __u32 ctl; | ||
37 | __u32 adr; | ||
38 | __u32 dat; | ||
39 | __u32 tbc; | ||
40 | }; | ||
18 | 41 | ||
19 | struct tx4939rtc_plat_data { | 42 | struct tx4939rtc_plat_data { |
20 | struct rtc_device *rtc; | 43 | struct rtc_device *rtc; |
@@ -86,9 +109,10 @@ static int tx4939_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
86 | for (i = 2; i < 6; i++) | 109 | for (i = 2; i < 6; i++) |
87 | buf[i] = __raw_readl(&rtcreg->dat); | 110 | buf[i] = __raw_readl(&rtcreg->dat); |
88 | spin_unlock_irq(&pdata->lock); | 111 | spin_unlock_irq(&pdata->lock); |
89 | sec = (buf[5] << 24) | (buf[4] << 16) | (buf[3] << 8) | buf[2]; | 112 | sec = ((unsigned long)buf[5] << 24) | (buf[4] << 16) | |
113 | (buf[3] << 8) | buf[2]; | ||
90 | rtc_time_to_tm(sec, tm); | 114 | rtc_time_to_tm(sec, tm); |
91 | return rtc_valid_tm(tm); | 115 | return 0; |
92 | } | 116 | } |
93 | 117 | ||
94 | static int tx4939_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) | 118 | static int tx4939_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) |
@@ -147,7 +171,8 @@ static int tx4939_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
147 | alrm->enabled = (ctl & TX4939_RTCCTL_ALME) ? 1 : 0; | 171 | alrm->enabled = (ctl & TX4939_RTCCTL_ALME) ? 1 : 0; |
148 | alrm->pending = (ctl & TX4939_RTCCTL_ALMD) ? 1 : 0; | 172 | alrm->pending = (ctl & TX4939_RTCCTL_ALMD) ? 1 : 0; |
149 | spin_unlock_irq(&pdata->lock); | 173 | spin_unlock_irq(&pdata->lock); |
150 | sec = (buf[5] << 24) | (buf[4] << 16) | (buf[3] << 8) | buf[2]; | 174 | sec = ((unsigned long)buf[5] << 24) | (buf[4] << 16) | |
175 | (buf[3] << 8) | buf[2]; | ||
151 | rtc_time_to_tm(sec, &alrm->time); | 176 | rtc_time_to_tm(sec, &alrm->time); |
152 | return rtc_valid_tm(&alrm->time); | 177 | return rtc_valid_tm(&alrm->time); |
153 | } | 178 | } |
@@ -189,58 +214,52 @@ static const struct rtc_class_ops tx4939_rtc_ops = { | |||
189 | .alarm_irq_enable = tx4939_rtc_alarm_irq_enable, | 214 | .alarm_irq_enable = tx4939_rtc_alarm_irq_enable, |
190 | }; | 215 | }; |
191 | 216 | ||
192 | static ssize_t tx4939_rtc_nvram_read(struct file *filp, struct kobject *kobj, | 217 | static int tx4939_nvram_read(void *priv, unsigned int pos, void *val, |
193 | struct bin_attribute *bin_attr, | 218 | size_t bytes) |
194 | char *buf, loff_t pos, size_t size) | ||
195 | { | 219 | { |
196 | struct device *dev = container_of(kobj, struct device, kobj); | 220 | struct tx4939rtc_plat_data *pdata = priv; |
197 | struct tx4939rtc_plat_data *pdata = get_tx4939rtc_plat_data(dev); | ||
198 | struct tx4939_rtc_reg __iomem *rtcreg = pdata->rtcreg; | 221 | struct tx4939_rtc_reg __iomem *rtcreg = pdata->rtcreg; |
199 | ssize_t count; | 222 | u8 *buf = val; |
200 | 223 | ||
201 | spin_lock_irq(&pdata->lock); | 224 | spin_lock_irq(&pdata->lock); |
202 | for (count = 0; count < size; count++) { | 225 | for (; bytes; bytes--) { |
203 | __raw_writel(pos++, &rtcreg->adr); | 226 | __raw_writel(pos++, &rtcreg->adr); |
204 | *buf++ = __raw_readl(&rtcreg->dat); | 227 | *buf++ = __raw_readl(&rtcreg->dat); |
205 | } | 228 | } |
206 | spin_unlock_irq(&pdata->lock); | 229 | spin_unlock_irq(&pdata->lock); |
207 | return count; | 230 | return 0; |
208 | } | 231 | } |
209 | 232 | ||
210 | static ssize_t tx4939_rtc_nvram_write(struct file *filp, struct kobject *kobj, | 233 | static int tx4939_nvram_write(void *priv, unsigned int pos, void *val, |
211 | struct bin_attribute *bin_attr, | 234 | size_t bytes) |
212 | char *buf, loff_t pos, size_t size) | ||
213 | { | 235 | { |
214 | struct device *dev = container_of(kobj, struct device, kobj); | 236 | struct tx4939rtc_plat_data *pdata = priv; |
215 | struct tx4939rtc_plat_data *pdata = get_tx4939rtc_plat_data(dev); | ||
216 | struct tx4939_rtc_reg __iomem *rtcreg = pdata->rtcreg; | 237 | struct tx4939_rtc_reg __iomem *rtcreg = pdata->rtcreg; |
217 | ssize_t count; | 238 | u8 *buf = val; |
218 | 239 | ||
219 | spin_lock_irq(&pdata->lock); | 240 | spin_lock_irq(&pdata->lock); |
220 | for (count = 0; count < size; count++) { | 241 | for (; bytes; bytes--) { |
221 | __raw_writel(pos++, &rtcreg->adr); | 242 | __raw_writel(pos++, &rtcreg->adr); |
222 | __raw_writel(*buf++, &rtcreg->dat); | 243 | __raw_writel(*buf++, &rtcreg->dat); |
223 | } | 244 | } |
224 | spin_unlock_irq(&pdata->lock); | 245 | spin_unlock_irq(&pdata->lock); |
225 | return count; | 246 | return 0; |
226 | } | 247 | } |
227 | 248 | ||
228 | static struct bin_attribute tx4939_rtc_nvram_attr = { | ||
229 | .attr = { | ||
230 | .name = "nvram", | ||
231 | .mode = S_IRUGO | S_IWUSR, | ||
232 | }, | ||
233 | .size = TX4939_RTC_REG_RAMSIZE, | ||
234 | .read = tx4939_rtc_nvram_read, | ||
235 | .write = tx4939_rtc_nvram_write, | ||
236 | }; | ||
237 | |||
238 | static int __init tx4939_rtc_probe(struct platform_device *pdev) | 249 | static int __init tx4939_rtc_probe(struct platform_device *pdev) |
239 | { | 250 | { |
240 | struct rtc_device *rtc; | 251 | struct rtc_device *rtc; |
241 | struct tx4939rtc_plat_data *pdata; | 252 | struct tx4939rtc_plat_data *pdata; |
242 | struct resource *res; | 253 | struct resource *res; |
243 | int irq, ret; | 254 | int irq, ret; |
255 | struct nvmem_config nvmem_cfg = { | ||
256 | .name = "rv8803_nvram", | ||
257 | .word_size = 4, | ||
258 | .stride = 4, | ||
259 | .size = TX4939_RTC_REG_RAMSIZE, | ||
260 | .reg_read = tx4939_nvram_read, | ||
261 | .reg_write = tx4939_nvram_write, | ||
262 | }; | ||
244 | 263 | ||
245 | irq = platform_get_irq(pdev, 0); | 264 | irq = platform_get_irq(pdev, 0); |
246 | if (irq < 0) | 265 | if (irq < 0) |
@@ -260,21 +279,27 @@ static int __init tx4939_rtc_probe(struct platform_device *pdev) | |||
260 | if (devm_request_irq(&pdev->dev, irq, tx4939_rtc_interrupt, | 279 | if (devm_request_irq(&pdev->dev, irq, tx4939_rtc_interrupt, |
261 | 0, pdev->name, &pdev->dev) < 0) | 280 | 0, pdev->name, &pdev->dev) < 0) |
262 | return -EBUSY; | 281 | return -EBUSY; |
263 | rtc = devm_rtc_device_register(&pdev->dev, pdev->name, | 282 | rtc = devm_rtc_allocate_device(&pdev->dev); |
264 | &tx4939_rtc_ops, THIS_MODULE); | ||
265 | if (IS_ERR(rtc)) | 283 | if (IS_ERR(rtc)) |
266 | return PTR_ERR(rtc); | 284 | return PTR_ERR(rtc); |
285 | |||
286 | rtc->ops = &tx4939_rtc_ops; | ||
287 | rtc->nvram_old_abi = true; | ||
288 | |||
267 | pdata->rtc = rtc; | 289 | pdata->rtc = rtc; |
268 | ret = sysfs_create_bin_file(&pdev->dev.kobj, &tx4939_rtc_nvram_attr); | ||
269 | 290 | ||
270 | return ret; | 291 | nvmem_cfg.priv = pdata; |
292 | ret = rtc_nvmem_register(rtc, &nvmem_cfg); | ||
293 | if (ret) | ||
294 | return ret; | ||
295 | |||
296 | return rtc_register_device(rtc); | ||
271 | } | 297 | } |
272 | 298 | ||
273 | static int __exit tx4939_rtc_remove(struct platform_device *pdev) | 299 | static int __exit tx4939_rtc_remove(struct platform_device *pdev) |
274 | { | 300 | { |
275 | struct tx4939rtc_plat_data *pdata = platform_get_drvdata(pdev); | 301 | struct tx4939rtc_plat_data *pdata = platform_get_drvdata(pdev); |
276 | 302 | ||
277 | sysfs_remove_bin_file(&pdev->dev.kobj, &tx4939_rtc_nvram_attr); | ||
278 | spin_lock_irq(&pdata->lock); | 303 | spin_lock_irq(&pdata->lock); |
279 | tx4939_rtc_cmd(pdata->rtcreg, TX4939_RTCCTL_COMMAND_NOP); | 304 | tx4939_rtc_cmd(pdata->rtcreg, TX4939_RTCCTL_COMMAND_NOP); |
280 | spin_unlock_irq(&pdata->lock); | 305 | spin_unlock_irq(&pdata->lock); |
diff --git a/drivers/rtc/rtc-wm831x.c b/drivers/rtc/rtc-wm831x.c index 75aea4c4d334..7b824dabf104 100644 --- a/drivers/rtc/rtc-wm831x.c +++ b/drivers/rtc/rtc-wm831x.c | |||
@@ -156,7 +156,7 @@ static int wm831x_rtc_readtime(struct device *dev, struct rtc_time *tm) | |||
156 | u32 time = (time1[0] << 16) | time1[1]; | 156 | u32 time = (time1[0] << 16) | time1[1]; |
157 | 157 | ||
158 | rtc_time_to_tm(time, tm); | 158 | rtc_time_to_tm(time, tm); |
159 | return rtc_valid_tm(tm); | 159 | return 0; |
160 | } | 160 | } |
161 | 161 | ||
162 | } while (++count < WM831X_GET_TIME_RETRIES); | 162 | } while (++count < WM831X_GET_TIME_RETRIES); |
diff --git a/drivers/rtc/rtc-xgene.c b/drivers/rtc/rtc-xgene.c index 0c34d3b81279..153820876a82 100644 --- a/drivers/rtc/rtc-xgene.c +++ b/drivers/rtc/rtc-xgene.c | |||
@@ -60,7 +60,7 @@ static int xgene_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
60 | struct xgene_rtc_dev *pdata = dev_get_drvdata(dev); | 60 | struct xgene_rtc_dev *pdata = dev_get_drvdata(dev); |
61 | 61 | ||
62 | rtc_time_to_tm(readl(pdata->csr_base + RTC_CCVR), tm); | 62 | rtc_time_to_tm(readl(pdata->csr_base + RTC_CCVR), tm); |
63 | return rtc_valid_tm(tm); | 63 | return 0; |
64 | } | 64 | } |
65 | 65 | ||
66 | static int xgene_rtc_set_mmss(struct device *dev, unsigned long secs) | 66 | static int xgene_rtc_set_mmss(struct device *dev, unsigned long secs) |
diff --git a/drivers/rtc/rtc-zynqmp.c b/drivers/rtc/rtc-zynqmp.c index da18a8ae3c1d..fba994dc31eb 100644 --- a/drivers/rtc/rtc-zynqmp.c +++ b/drivers/rtc/rtc-zynqmp.c | |||
@@ -122,7 +122,7 @@ static int xlnx_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
122 | rtc_time64_to_tm(read_time, tm); | 122 | rtc_time64_to_tm(read_time, tm); |
123 | } | 123 | } |
124 | 124 | ||
125 | return rtc_valid_tm(tm); | 125 | return 0; |
126 | } | 126 | } |
127 | 127 | ||
128 | static int xlnx_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) | 128 | static int xlnx_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) |
diff --git a/drivers/rtc/systohc.c b/drivers/rtc/systohc.c index 0c177647ea6c..718293d72426 100644 --- a/drivers/rtc/systohc.c +++ b/drivers/rtc/systohc.c | |||
@@ -20,7 +20,7 @@ | |||
20 | * cases. | 20 | * cases. |
21 | * | 21 | * |
22 | * -EPROTO is returned if now.tv_nsec is not close enough to *target_nsec. | 22 | * -EPROTO is returned if now.tv_nsec is not close enough to *target_nsec. |
23 | ( | 23 | * |
24 | * If temporary failure is indicated the caller should try again 'soon' | 24 | * If temporary failure is indicated the caller should try again 'soon' |
25 | */ | 25 | */ |
26 | int rtc_set_ntp_time(struct timespec64 now, unsigned long *target_nsec) | 26 | int rtc_set_ntp_time(struct timespec64 now, unsigned long *target_nsec) |
diff --git a/include/linux/mfd/samsung/rtc.h b/include/linux/mfd/samsung/rtc.h index 48c3c5be7eb1..9ed2871ea335 100644 --- a/include/linux/mfd/samsung/rtc.h +++ b/include/linux/mfd/samsung/rtc.h | |||
@@ -141,15 +141,4 @@ enum s2mps_rtc_reg { | |||
141 | #define WTSR_ENABLE_SHIFT 6 | 141 | #define WTSR_ENABLE_SHIFT 6 |
142 | #define WTSR_ENABLE_MASK (1 << WTSR_ENABLE_SHIFT) | 142 | #define WTSR_ENABLE_MASK (1 << WTSR_ENABLE_SHIFT) |
143 | 143 | ||
144 | enum { | ||
145 | RTC_SEC = 0, | ||
146 | RTC_MIN, | ||
147 | RTC_HOUR, | ||
148 | RTC_WEEKDAY, | ||
149 | RTC_DATE, | ||
150 | RTC_MONTH, | ||
151 | RTC_YEAR1, | ||
152 | RTC_YEAR2, | ||
153 | }; | ||
154 | |||
155 | #endif /* __LINUX_MFD_SEC_RTC_H */ | 144 | #endif /* __LINUX_MFD_SEC_RTC_H */ |
diff --git a/include/linux/rtc.h b/include/linux/rtc.h index fc6c90b57be0..4c007f69082f 100644 --- a/include/linux/rtc.h +++ b/include/linux/rtc.h | |||
@@ -145,12 +145,17 @@ struct rtc_device { | |||
145 | 145 | ||
146 | bool registered; | 146 | bool registered; |
147 | 147 | ||
148 | struct nvmem_config *nvmem_config; | ||
149 | struct nvmem_device *nvmem; | 148 | struct nvmem_device *nvmem; |
150 | /* Old ABI support */ | 149 | /* Old ABI support */ |
151 | bool nvram_old_abi; | 150 | bool nvram_old_abi; |
152 | struct bin_attribute *nvram; | 151 | struct bin_attribute *nvram; |
153 | 152 | ||
153 | time64_t range_min; | ||
154 | timeu64_t range_max; | ||
155 | time64_t start_secs; | ||
156 | time64_t offset_secs; | ||
157 | bool set_start_time; | ||
158 | |||
154 | #ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL | 159 | #ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL |
155 | struct work_struct uie_task; | 160 | struct work_struct uie_task; |
156 | struct timer_list uie_timer; | 161 | struct timer_list uie_timer; |
@@ -164,6 +169,11 @@ struct rtc_device { | |||
164 | }; | 169 | }; |
165 | #define to_rtc_device(d) container_of(d, struct rtc_device, dev) | 170 | #define to_rtc_device(d) container_of(d, struct rtc_device, dev) |
166 | 171 | ||
172 | /* useful timestamps */ | ||
173 | #define RTC_TIMESTAMP_BEGIN_1900 -2208989361LL /* 1900-01-01 00:00:00 */ | ||
174 | #define RTC_TIMESTAMP_BEGIN_2000 946684800LL /* 2000-01-01 00:00:00 */ | ||
175 | #define RTC_TIMESTAMP_END_2099 4102444799LL /* 2099-12-31 23:59:59 */ | ||
176 | |||
167 | extern struct rtc_device *rtc_device_register(const char *name, | 177 | extern struct rtc_device *rtc_device_register(const char *name, |
168 | struct device *dev, | 178 | struct device *dev, |
169 | const struct rtc_class_ops *ops, | 179 | const struct rtc_class_ops *ops, |
@@ -212,10 +222,6 @@ void rtc_aie_update_irq(void *private); | |||
212 | void rtc_uie_update_irq(void *private); | 222 | void rtc_uie_update_irq(void *private); |
213 | enum hrtimer_restart rtc_pie_update_irq(struct hrtimer *timer); | 223 | enum hrtimer_restart rtc_pie_update_irq(struct hrtimer *timer); |
214 | 224 | ||
215 | int rtc_register(rtc_task_t *task); | ||
216 | int rtc_unregister(rtc_task_t *task); | ||
217 | int rtc_control(rtc_task_t *t, unsigned int cmd, unsigned long arg); | ||
218 | |||
219 | void rtc_timer_init(struct rtc_timer *timer, void (*f)(void *p), void *data); | 225 | void rtc_timer_init(struct rtc_timer *timer, void (*f)(void *p), void *data); |
220 | int rtc_timer_start(struct rtc_device *rtc, struct rtc_timer *timer, | 226 | int rtc_timer_start(struct rtc_device *rtc, struct rtc_timer *timer, |
221 | ktime_t expires, ktime_t period); | 227 | ktime_t expires, ktime_t period); |
@@ -271,4 +277,17 @@ extern int rtc_hctosys_ret; | |||
271 | #define rtc_hctosys_ret -ENODEV | 277 | #define rtc_hctosys_ret -ENODEV |
272 | #endif | 278 | #endif |
273 | 279 | ||
280 | #ifdef CONFIG_RTC_NVMEM | ||
281 | int rtc_nvmem_register(struct rtc_device *rtc, | ||
282 | struct nvmem_config *nvmem_config); | ||
283 | void rtc_nvmem_unregister(struct rtc_device *rtc); | ||
284 | #else | ||
285 | static inline int rtc_nvmem_register(struct rtc_device *rtc, | ||
286 | struct nvmem_config *nvmem_config) | ||
287 | { | ||
288 | return -ENODEV; | ||
289 | } | ||
290 | static inline void rtc_nvmem_unregister(struct rtc_device *rtc) {} | ||
291 | #endif | ||
292 | |||
274 | #endif /* _LINUX_RTC_H_ */ | 293 | #endif /* _LINUX_RTC_H_ */ |
diff --git a/include/trace/events/rtc.h b/include/trace/events/rtc.h new file mode 100644 index 000000000000..621333f1c890 --- /dev/null +++ b/include/trace/events/rtc.h | |||
@@ -0,0 +1,206 @@ | |||
1 | #undef TRACE_SYSTEM | ||
2 | #define TRACE_SYSTEM rtc | ||
3 | |||
4 | #if !defined(_TRACE_RTC_H) || defined(TRACE_HEADER_MULTI_READ) | ||
5 | #define _TRACE_RTC_H | ||
6 | |||
7 | #include <linux/rtc.h> | ||
8 | #include <linux/tracepoint.h> | ||
9 | |||
10 | DECLARE_EVENT_CLASS(rtc_time_alarm_class, | ||
11 | |||
12 | TP_PROTO(time64_t secs, int err), | ||
13 | |||
14 | TP_ARGS(secs, err), | ||
15 | |||
16 | TP_STRUCT__entry( | ||
17 | __field(time64_t, secs) | ||
18 | __field(int, err) | ||
19 | ), | ||
20 | |||
21 | TP_fast_assign( | ||
22 | __entry->secs = secs; | ||
23 | __entry->err = err; | ||
24 | ), | ||
25 | |||
26 | TP_printk("UTC (%lld) (%d)", | ||
27 | __entry->secs, __entry->err | ||
28 | ) | ||
29 | ); | ||
30 | |||
31 | DEFINE_EVENT(rtc_time_alarm_class, rtc_set_time, | ||
32 | |||
33 | TP_PROTO(time64_t secs, int err), | ||
34 | |||
35 | TP_ARGS(secs, err) | ||
36 | ); | ||
37 | |||
38 | DEFINE_EVENT(rtc_time_alarm_class, rtc_read_time, | ||
39 | |||
40 | TP_PROTO(time64_t secs, int err), | ||
41 | |||
42 | TP_ARGS(secs, err) | ||
43 | ); | ||
44 | |||
45 | DEFINE_EVENT(rtc_time_alarm_class, rtc_set_alarm, | ||
46 | |||
47 | TP_PROTO(time64_t secs, int err), | ||
48 | |||
49 | TP_ARGS(secs, err) | ||
50 | ); | ||
51 | |||
52 | DEFINE_EVENT(rtc_time_alarm_class, rtc_read_alarm, | ||
53 | |||
54 | TP_PROTO(time64_t secs, int err), | ||
55 | |||
56 | TP_ARGS(secs, err) | ||
57 | ); | ||
58 | |||
59 | TRACE_EVENT(rtc_irq_set_freq, | ||
60 | |||
61 | TP_PROTO(int freq, int err), | ||
62 | |||
63 | TP_ARGS(freq, err), | ||
64 | |||
65 | TP_STRUCT__entry( | ||
66 | __field(int, freq) | ||
67 | __field(int, err) | ||
68 | ), | ||
69 | |||
70 | TP_fast_assign( | ||
71 | __entry->freq = freq; | ||
72 | __entry->err = err; | ||
73 | ), | ||
74 | |||
75 | TP_printk("set RTC periodic IRQ frequency:%u (%d)", | ||
76 | __entry->freq, __entry->err | ||
77 | ) | ||
78 | ); | ||
79 | |||
80 | TRACE_EVENT(rtc_irq_set_state, | ||
81 | |||
82 | TP_PROTO(int enabled, int err), | ||
83 | |||
84 | TP_ARGS(enabled, err), | ||
85 | |||
86 | TP_STRUCT__entry( | ||
87 | __field(int, enabled) | ||
88 | __field(int, err) | ||
89 | ), | ||
90 | |||
91 | TP_fast_assign( | ||
92 | __entry->enabled = enabled; | ||
93 | __entry->err = err; | ||
94 | ), | ||
95 | |||
96 | TP_printk("%s RTC 2^N Hz periodic IRQs (%d)", | ||
97 | __entry->enabled ? "enable" : "disable", | ||
98 | __entry->err | ||
99 | ) | ||
100 | ); | ||
101 | |||
102 | TRACE_EVENT(rtc_alarm_irq_enable, | ||
103 | |||
104 | TP_PROTO(unsigned int enabled, int err), | ||
105 | |||
106 | TP_ARGS(enabled, err), | ||
107 | |||
108 | TP_STRUCT__entry( | ||
109 | __field(unsigned int, enabled) | ||
110 | __field(int, err) | ||
111 | ), | ||
112 | |||
113 | TP_fast_assign( | ||
114 | __entry->enabled = enabled; | ||
115 | __entry->err = err; | ||
116 | ), | ||
117 | |||
118 | TP_printk("%s RTC alarm IRQ (%d)", | ||
119 | __entry->enabled ? "enable" : "disable", | ||
120 | __entry->err | ||
121 | ) | ||
122 | ); | ||
123 | |||
124 | DECLARE_EVENT_CLASS(rtc_offset_class, | ||
125 | |||
126 | TP_PROTO(long offset, int err), | ||
127 | |||
128 | TP_ARGS(offset, err), | ||
129 | |||
130 | TP_STRUCT__entry( | ||
131 | __field(long, offset) | ||
132 | __field(int, err) | ||
133 | ), | ||
134 | |||
135 | TP_fast_assign( | ||
136 | __entry->offset = offset; | ||
137 | __entry->err = err; | ||
138 | ), | ||
139 | |||
140 | TP_printk("RTC offset: %ld (%d)", | ||
141 | __entry->offset, __entry->err | ||
142 | ) | ||
143 | ); | ||
144 | |||
145 | DEFINE_EVENT(rtc_offset_class, rtc_set_offset, | ||
146 | |||
147 | TP_PROTO(long offset, int err), | ||
148 | |||
149 | TP_ARGS(offset, err) | ||
150 | ); | ||
151 | |||
152 | DEFINE_EVENT(rtc_offset_class, rtc_read_offset, | ||
153 | |||
154 | TP_PROTO(long offset, int err), | ||
155 | |||
156 | TP_ARGS(offset, err) | ||
157 | ); | ||
158 | |||
159 | DECLARE_EVENT_CLASS(rtc_timer_class, | ||
160 | |||
161 | TP_PROTO(struct rtc_timer *timer), | ||
162 | |||
163 | TP_ARGS(timer), | ||
164 | |||
165 | TP_STRUCT__entry( | ||
166 | __field(struct rtc_timer *, timer) | ||
167 | __field(ktime_t, expires) | ||
168 | __field(ktime_t, period) | ||
169 | ), | ||
170 | |||
171 | TP_fast_assign( | ||
172 | __entry->timer = timer; | ||
173 | __entry->expires = timer->node.expires; | ||
174 | __entry->period = timer->period; | ||
175 | ), | ||
176 | |||
177 | TP_printk("RTC timer:(%p) expires:%lld period:%lld", | ||
178 | __entry->timer, __entry->expires, __entry->period | ||
179 | ) | ||
180 | ); | ||
181 | |||
182 | DEFINE_EVENT(rtc_timer_class, rtc_timer_enqueue, | ||
183 | |||
184 | TP_PROTO(struct rtc_timer *timer), | ||
185 | |||
186 | TP_ARGS(timer) | ||
187 | ); | ||
188 | |||
189 | DEFINE_EVENT(rtc_timer_class, rtc_timer_dequeue, | ||
190 | |||
191 | TP_PROTO(struct rtc_timer *timer), | ||
192 | |||
193 | TP_ARGS(timer) | ||
194 | ); | ||
195 | |||
196 | DEFINE_EVENT(rtc_timer_class, rtc_timer_fired, | ||
197 | |||
198 | TP_PROTO(struct rtc_timer *timer), | ||
199 | |||
200 | TP_ARGS(timer) | ||
201 | ); | ||
202 | |||
203 | #endif /* _TRACE_RTC_H */ | ||
204 | |||
205 | /* This part must be outside protection */ | ||
206 | #include <trace/define_trace.h> | ||