diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2019-01-01 16:24:31 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-01-01 16:24:31 -0500 |
| commit | 28e8c4bc8eb483c22d977e147a0b98fc63efadf7 (patch) | |
| tree | 8006dd759601c70d4dd1fc644ed817e9597cec55 /drivers/rtc | |
| parent | c9bef4a651769927445900564781a9c99fdf6258 (diff) | |
| parent | 36e14f5fdfdf7cec8887b7ff69cd9bb5051ecf62 (diff) | |
Merge tag 'rtc-4.21' of git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux
Pull RTC updates from Alexandre Belloni:
"Subsystem:
- new %ptR printk format
- rename core files
- allow registration of multiple nvmem devices
New driver:
- i.MX system controller RTC
Driver updates:
- abx80x: handle voltage ioctls, correct binding doc
- m41t80: correct month in alarm reads
- pcf85363: add pcf85263 support
- pcf8523: properly handle battery low flag
- s3c: limit alarm to one year in the future as ALMYEAR is broken
- sun6i: rework clock output binding"
* tag 'rtc-4.21' of git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux: (54 commits)
rtc: rename core files
rtc: nvmem: fix possible use after free
rtc: add i.MX system controller RTC support
dt-bindings: fsl: scu: add rtc binding
rtc: pcf2123: Add Microcrystal rv2123
rtc: class: reimplement devm_rtc_device_register
rtc: enforce rtc_timer_init private_data type
rtc: abx80x: Implement RTC_VL_READ,CLR ioctls
rtc: pcf85363: Add support for NXP pcf85263 rtc
dt-bindings: rtc: pcf85363: Document pcf85263 real-time clock
rtc: pcf8523: don't return invalid date when battery is low
dt-bindings: rtc: use a generic node name for ds1307
PM: Switch to use %ptR
m68k/mac: Switch to use %ptR
Input: hp_sdc_rtc - Switch to use %ptR
rtc: tegra: Switch to use %ptR
rtc: s5m: Switch to use %ptR
rtc: s3c: Switch to use %ptR
rtc: rx8025: Switch to use %ptR
rtc: rx6110: Switch to use %ptR
...
Diffstat (limited to 'drivers/rtc')
38 files changed, 510 insertions, 525 deletions
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index a819ef07b7ec..225b0b8516f3 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig | |||
| @@ -1677,6 +1677,13 @@ config RTC_DRV_SNVS | |||
| 1677 | This driver can also be built as a module, if so, the module | 1677 | This driver can also be built as a module, if so, the module |
| 1678 | will be called "rtc-snvs". | 1678 | will be called "rtc-snvs". |
| 1679 | 1679 | ||
| 1680 | config RTC_DRV_IMX_SC | ||
| 1681 | depends on IMX_SCU | ||
| 1682 | tristate "NXP i.MX System Controller RTC support" | ||
| 1683 | help | ||
| 1684 | If you say yes here you get support for the NXP i.MX System | ||
| 1685 | Controller RTC module. | ||
| 1686 | |||
| 1680 | config RTC_DRV_SIRFSOC | 1687 | config RTC_DRV_SIRFSOC |
| 1681 | tristate "SiRFSOC RTC" | 1688 | tristate "SiRFSOC RTC" |
| 1682 | depends on ARCH_SIRF | 1689 | depends on ARCH_SIRF |
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index 290c1730fb0a..df022d820bee 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | 5 | ||
| 6 | ccflags-$(CONFIG_RTC_DEBUG) := -DDEBUG | 6 | ccflags-$(CONFIG_RTC_DEBUG) := -DDEBUG |
| 7 | 7 | ||
| 8 | obj-$(CONFIG_RTC_LIB) += rtc-lib.o | 8 | obj-$(CONFIG_RTC_LIB) += lib.o |
| 9 | obj-$(CONFIG_RTC_HCTOSYS) += hctosys.o | 9 | obj-$(CONFIG_RTC_HCTOSYS) += hctosys.o |
| 10 | obj-$(CONFIG_RTC_SYSTOHC) += systohc.o | 10 | obj-$(CONFIG_RTC_SYSTOHC) += systohc.o |
| 11 | obj-$(CONFIG_RTC_CLASS) += rtc-core.o | 11 | obj-$(CONFIG_RTC_CLASS) += rtc-core.o |
| @@ -17,9 +17,9 @@ rtc-core-y += rtc-efi-platform.o | |||
| 17 | endif | 17 | endif |
| 18 | 18 | ||
| 19 | rtc-core-$(CONFIG_RTC_NVMEM) += nvmem.o | 19 | rtc-core-$(CONFIG_RTC_NVMEM) += nvmem.o |
| 20 | rtc-core-$(CONFIG_RTC_INTF_DEV) += rtc-dev.o | 20 | rtc-core-$(CONFIG_RTC_INTF_DEV) += dev.o |
| 21 | rtc-core-$(CONFIG_RTC_INTF_PROC) += rtc-proc.o | 21 | rtc-core-$(CONFIG_RTC_INTF_PROC) += proc.o |
| 22 | rtc-core-$(CONFIG_RTC_INTF_SYSFS) += rtc-sysfs.o | 22 | rtc-core-$(CONFIG_RTC_INTF_SYSFS) += sysfs.o |
| 23 | 23 | ||
| 24 | # Keep the list ordered. | 24 | # Keep the list ordered. |
| 25 | 25 | ||
| @@ -75,6 +75,7 @@ obj-$(CONFIG_RTC_DRV_GOLDFISH) += rtc-goldfish.o | |||
| 75 | obj-$(CONFIG_RTC_DRV_HID_SENSOR_TIME) += rtc-hid-sensor-time.o | 75 | obj-$(CONFIG_RTC_DRV_HID_SENSOR_TIME) += rtc-hid-sensor-time.o |
| 76 | obj-$(CONFIG_RTC_DRV_HYM8563) += rtc-hym8563.o | 76 | obj-$(CONFIG_RTC_DRV_HYM8563) += rtc-hym8563.o |
| 77 | obj-$(CONFIG_RTC_DRV_IMXDI) += rtc-imxdi.o | 77 | obj-$(CONFIG_RTC_DRV_IMXDI) += rtc-imxdi.o |
| 78 | obj-$(CONFIG_RTC_DRV_IMX_SC) += rtc-imx-sc.o | ||
| 78 | obj-$(CONFIG_RTC_DRV_ISL12022) += rtc-isl12022.o | 79 | obj-$(CONFIG_RTC_DRV_ISL12022) += rtc-isl12022.o |
| 79 | obj-$(CONFIG_RTC_DRV_ISL12026) += rtc-isl12026.o | 80 | obj-$(CONFIG_RTC_DRV_ISL12026) += rtc-isl12026.o |
| 80 | obj-$(CONFIG_RTC_DRV_ISL1208) += rtc-isl1208.o | 81 | obj-$(CONFIG_RTC_DRV_ISL1208) += rtc-isl1208.o |
diff --git a/drivers/rtc/class.c b/drivers/rtc/class.c index 3b43787f154b..ac93b76f2b11 100644 --- a/drivers/rtc/class.c +++ b/drivers/rtc/class.c | |||
| @@ -178,9 +178,9 @@ static struct rtc_device *rtc_allocate_device(void) | |||
| 178 | timerqueue_init_head(&rtc->timerqueue); | 178 | timerqueue_init_head(&rtc->timerqueue); |
| 179 | INIT_WORK(&rtc->irqwork, rtc_timer_do_work); | 179 | INIT_WORK(&rtc->irqwork, rtc_timer_do_work); |
| 180 | /* Init aie timer */ | 180 | /* Init aie timer */ |
| 181 | rtc_timer_init(&rtc->aie_timer, rtc_aie_update_irq, (void *)rtc); | 181 | rtc_timer_init(&rtc->aie_timer, rtc_aie_update_irq, rtc); |
| 182 | /* Init uie timer */ | 182 | /* Init uie timer */ |
| 183 | rtc_timer_init(&rtc->uie_rtctimer, rtc_uie_update_irq, (void *)rtc); | 183 | rtc_timer_init(&rtc->uie_rtctimer, rtc_uie_update_irq, rtc); |
| 184 | /* Init pie timer */ | 184 | /* Init pie timer */ |
| 185 | hrtimer_init(&rtc->pie_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); | 185 | hrtimer_init(&rtc->pie_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); |
| 186 | rtc->pie_timer.function = rtc_pie_update_irq; | 186 | rtc->pie_timer.function = rtc_pie_update_irq; |
| @@ -278,82 +278,6 @@ static void rtc_device_get_offset(struct rtc_device *rtc) | |||
| 278 | } | 278 | } |
| 279 | 279 | ||
| 280 | /** | 280 | /** |
| 281 | * rtc_device_register - register w/ RTC class | ||
| 282 | * @dev: the device to register | ||
| 283 | * | ||
| 284 | * rtc_device_unregister() must be called when the class device is no | ||
| 285 | * longer needed. | ||
| 286 | * | ||
| 287 | * Returns the pointer to the new struct class device. | ||
| 288 | */ | ||
| 289 | static struct rtc_device *rtc_device_register(const char *name, | ||
| 290 | struct device *dev, | ||
| 291 | const struct rtc_class_ops *ops, | ||
| 292 | struct module *owner) | ||
| 293 | { | ||
| 294 | struct rtc_device *rtc; | ||
| 295 | struct rtc_wkalrm alrm; | ||
| 296 | int id, err; | ||
| 297 | |||
| 298 | id = rtc_device_get_id(dev); | ||
| 299 | if (id < 0) { | ||
| 300 | err = id; | ||
| 301 | goto exit; | ||
| 302 | } | ||
| 303 | |||
| 304 | rtc = rtc_allocate_device(); | ||
| 305 | if (!rtc) { | ||
| 306 | err = -ENOMEM; | ||
| 307 | goto exit_ida; | ||
| 308 | } | ||
| 309 | |||
| 310 | rtc->id = id; | ||
| 311 | rtc->ops = ops; | ||
| 312 | rtc->owner = owner; | ||
| 313 | rtc->dev.parent = dev; | ||
| 314 | |||
| 315 | dev_set_name(&rtc->dev, "rtc%d", id); | ||
| 316 | |||
| 317 | rtc_device_get_offset(rtc); | ||
| 318 | |||
| 319 | /* Check to see if there is an ALARM already set in hw */ | ||
| 320 | err = __rtc_read_alarm(rtc, &alrm); | ||
| 321 | |||
| 322 | if (!err && !rtc_valid_tm(&alrm.time)) | ||
| 323 | rtc_initialize_alarm(rtc, &alrm); | ||
| 324 | |||
| 325 | rtc_dev_prepare(rtc); | ||
| 326 | |||
| 327 | err = cdev_device_add(&rtc->char_dev, &rtc->dev); | ||
| 328 | if (err) { | ||
| 329 | dev_warn(&rtc->dev, "%s: failed to add char device %d:%d\n", | ||
| 330 | name, MAJOR(rtc->dev.devt), rtc->id); | ||
| 331 | |||
| 332 | /* This will free both memory and the ID */ | ||
| 333 | put_device(&rtc->dev); | ||
| 334 | goto exit; | ||
| 335 | } else { | ||
| 336 | dev_dbg(&rtc->dev, "%s: dev (%d:%d)\n", name, | ||
| 337 | MAJOR(rtc->dev.devt), rtc->id); | ||
| 338 | } | ||
| 339 | |||
| 340 | rtc_proc_add_device(rtc); | ||
| 341 | |||
| 342 | dev_info(dev, "rtc core: registered %s as %s\n", | ||
| 343 | name, dev_name(&rtc->dev)); | ||
| 344 | |||
| 345 | return rtc; | ||
| 346 | |||
| 347 | exit_ida: | ||
| 348 | ida_simple_remove(&rtc_ida, id); | ||
| 349 | |||
| 350 | exit: | ||
| 351 | dev_err(dev, "rtc core: unable to register %s, err = %d\n", | ||
| 352 | name, err); | ||
| 353 | return ERR_PTR(err); | ||
| 354 | } | ||
| 355 | |||
| 356 | /** | ||
| 357 | * rtc_device_unregister - removes the previously registered RTC class device | 281 | * rtc_device_unregister - removes the previously registered RTC class device |
| 358 | * | 282 | * |
| 359 | * @rtc: the RTC class device to destroy | 283 | * @rtc: the RTC class device to destroy |
| @@ -372,77 +296,6 @@ static void rtc_device_unregister(struct rtc_device *rtc) | |||
| 372 | put_device(&rtc->dev); | 296 | put_device(&rtc->dev); |
| 373 | } | 297 | } |
| 374 | 298 | ||
| 375 | static void devm_rtc_device_release(struct device *dev, void *res) | ||
| 376 | { | ||
| 377 | struct rtc_device *rtc = *(struct rtc_device **)res; | ||
| 378 | |||
| 379 | rtc_nvmem_unregister(rtc); | ||
| 380 | rtc_device_unregister(rtc); | ||
| 381 | } | ||
| 382 | |||
| 383 | static int devm_rtc_device_match(struct device *dev, void *res, void *data) | ||
| 384 | { | ||
| 385 | struct rtc **r = res; | ||
| 386 | |||
| 387 | return *r == data; | ||
| 388 | } | ||
| 389 | |||
| 390 | /** | ||
| 391 | * devm_rtc_device_register - resource managed rtc_device_register() | ||
| 392 | * @dev: the device to register | ||
| 393 | * @name: the name of the device | ||
| 394 | * @ops: the rtc operations structure | ||
| 395 | * @owner: the module owner | ||
| 396 | * | ||
| 397 | * @return a struct rtc on success, or an ERR_PTR on error | ||
| 398 | * | ||
| 399 | * Managed rtc_device_register(). The rtc_device returned from this function | ||
| 400 | * are automatically freed on driver detach. See rtc_device_register() | ||
| 401 | * for more information. | ||
| 402 | */ | ||
| 403 | |||
| 404 | struct rtc_device *devm_rtc_device_register(struct device *dev, | ||
| 405 | const char *name, | ||
| 406 | const struct rtc_class_ops *ops, | ||
| 407 | struct module *owner) | ||
| 408 | { | ||
| 409 | struct rtc_device **ptr, *rtc; | ||
| 410 | |||
| 411 | ptr = devres_alloc(devm_rtc_device_release, sizeof(*ptr), GFP_KERNEL); | ||
| 412 | if (!ptr) | ||
| 413 | return ERR_PTR(-ENOMEM); | ||
| 414 | |||
| 415 | rtc = rtc_device_register(name, dev, ops, owner); | ||
| 416 | if (!IS_ERR(rtc)) { | ||
| 417 | *ptr = rtc; | ||
| 418 | devres_add(dev, ptr); | ||
| 419 | } else { | ||
| 420 | devres_free(ptr); | ||
| 421 | } | ||
| 422 | |||
| 423 | return rtc; | ||
| 424 | } | ||
| 425 | EXPORT_SYMBOL_GPL(devm_rtc_device_register); | ||
| 426 | |||
| 427 | /** | ||
| 428 | * devm_rtc_device_unregister - resource managed devm_rtc_device_unregister() | ||
| 429 | * @dev: the device to unregister | ||
| 430 | * @rtc: the RTC class device to unregister | ||
| 431 | * | ||
| 432 | * Deallocated a rtc allocated with devm_rtc_device_register(). Normally this | ||
| 433 | * function will not need to be called and the resource management code will | ||
| 434 | * ensure that the resource is freed. | ||
| 435 | */ | ||
| 436 | void devm_rtc_device_unregister(struct device *dev, struct rtc_device *rtc) | ||
| 437 | { | ||
| 438 | int rc; | ||
| 439 | |||
| 440 | rc = devres_release(dev, devm_rtc_device_release, | ||
| 441 | devm_rtc_device_match, rtc); | ||
| 442 | WARN_ON(rc); | ||
| 443 | } | ||
| 444 | EXPORT_SYMBOL_GPL(devm_rtc_device_unregister); | ||
| 445 | |||
| 446 | static void devm_rtc_release_device(struct device *dev, void *res) | 299 | static void devm_rtc_release_device(struct device *dev, void *res) |
| 447 | { | 300 | { |
| 448 | struct rtc_device *rtc = *(struct rtc_device **)res; | 301 | struct rtc_device *rtc = *(struct rtc_device **)res; |
| @@ -529,6 +382,42 @@ int __rtc_register_device(struct module *owner, struct rtc_device *rtc) | |||
| 529 | } | 382 | } |
| 530 | EXPORT_SYMBOL_GPL(__rtc_register_device); | 383 | EXPORT_SYMBOL_GPL(__rtc_register_device); |
| 531 | 384 | ||
| 385 | /** | ||
| 386 | * devm_rtc_device_register - resource managed rtc_device_register() | ||
| 387 | * @dev: the device to register | ||
| 388 | * @name: the name of the device (unused) | ||
| 389 | * @ops: the rtc operations structure | ||
| 390 | * @owner: the module owner | ||
| 391 | * | ||
| 392 | * @return a struct rtc on success, or an ERR_PTR on error | ||
| 393 | * | ||
| 394 | * Managed rtc_device_register(). The rtc_device returned from this function | ||
| 395 | * are automatically freed on driver detach. | ||
| 396 | * This function is deprecated, use devm_rtc_allocate_device and | ||
| 397 | * rtc_register_device instead | ||
| 398 | */ | ||
| 399 | struct rtc_device *devm_rtc_device_register(struct device *dev, | ||
| 400 | const char *name, | ||
| 401 | const struct rtc_class_ops *ops, | ||
| 402 | struct module *owner) | ||
| 403 | { | ||
| 404 | struct rtc_device *rtc; | ||
| 405 | int err; | ||
| 406 | |||
| 407 | rtc = devm_rtc_allocate_device(dev); | ||
| 408 | if (IS_ERR(rtc)) | ||
| 409 | return rtc; | ||
| 410 | |||
| 411 | rtc->ops = ops; | ||
| 412 | |||
| 413 | err = __rtc_register_device(owner, rtc); | ||
| 414 | if (err) | ||
| 415 | return ERR_PTR(err); | ||
| 416 | |||
| 417 | return rtc; | ||
| 418 | } | ||
| 419 | EXPORT_SYMBOL_GPL(devm_rtc_device_register); | ||
| 420 | |||
| 532 | static int __init rtc_init(void) | 421 | static int __init rtc_init(void) |
| 533 | { | 422 | { |
| 534 | rtc_class = class_create(THIS_MODULE, "rtc"); | 423 | rtc_class = class_create(THIS_MODULE, "rtc"); |
diff --git a/drivers/rtc/rtc-dev.c b/drivers/rtc/dev.c index 43d962a9c210..43d962a9c210 100644 --- a/drivers/rtc/rtc-dev.c +++ b/drivers/rtc/dev.c | |||
diff --git a/drivers/rtc/hctosys.c b/drivers/rtc/hctosys.c index b9ec4a16db1f..ff2092a0d38c 100644 --- a/drivers/rtc/hctosys.c +++ b/drivers/rtc/hctosys.c | |||
| @@ -58,12 +58,8 @@ static int __init rtc_hctosys(void) | |||
| 58 | 58 | ||
| 59 | err = do_settimeofday64(&tv64); | 59 | err = do_settimeofday64(&tv64); |
| 60 | 60 | ||
| 61 | dev_info(rtc->dev.parent, | 61 | dev_info(rtc->dev.parent, "setting system clock to %ptR UTC (%lld)\n", |
| 62 | "setting system clock to " | 62 | &tm, (long long)tv64.tv_sec); |
| 63 | "%d-%02d-%02d %02d:%02d:%02d UTC (%lld)\n", | ||
| 64 | tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, | ||
| 65 | tm.tm_hour, tm.tm_min, tm.tm_sec, | ||
| 66 | (long long) tv64.tv_sec); | ||
| 67 | 63 | ||
| 68 | err_read: | 64 | err_read: |
| 69 | rtc_class_close(rtc); | 65 | rtc_class_close(rtc); |
diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c index 612a83d3ddcc..98d9c87b0d1b 100644 --- a/drivers/rtc/interface.c +++ b/drivers/rtc/interface.c | |||
| @@ -368,12 +368,8 @@ int __rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm) | |||
| 368 | err = rtc_valid_tm(&alarm->time); | 368 | err = rtc_valid_tm(&alarm->time); |
| 369 | 369 | ||
| 370 | done: | 370 | done: |
| 371 | if (err) { | 371 | if (err) |
| 372 | dev_warn(&rtc->dev, "invalid alarm value: %d-%d-%d %d:%d:%d\n", | 372 | dev_warn(&rtc->dev, "invalid alarm value: %ptR\n", &alarm->time); |
| 373 | alarm->time.tm_year + 1900, alarm->time.tm_mon + 1, | ||
| 374 | alarm->time.tm_mday, alarm->time.tm_hour, alarm->time.tm_min, | ||
| 375 | alarm->time.tm_sec); | ||
| 376 | } | ||
| 377 | 373 | ||
| 378 | return err; | 374 | return err; |
| 379 | } | 375 | } |
| @@ -613,26 +609,24 @@ void rtc_handle_legacy_irq(struct rtc_device *rtc, int num, int mode) | |||
| 613 | 609 | ||
| 614 | /** | 610 | /** |
| 615 | * rtc_aie_update_irq - AIE mode rtctimer hook | 611 | * rtc_aie_update_irq - AIE mode rtctimer hook |
| 616 | * @private: pointer to the rtc_device | 612 | * @rtc: pointer to the rtc_device |
| 617 | * | 613 | * |
| 618 | * This functions is called when the aie_timer expires. | 614 | * This functions is called when the aie_timer expires. |
| 619 | */ | 615 | */ |
| 620 | void rtc_aie_update_irq(void *private) | 616 | void rtc_aie_update_irq(struct rtc_device *rtc) |
| 621 | { | 617 | { |
| 622 | struct rtc_device *rtc = (struct rtc_device *)private; | ||
| 623 | rtc_handle_legacy_irq(rtc, 1, RTC_AF); | 618 | rtc_handle_legacy_irq(rtc, 1, RTC_AF); |
| 624 | } | 619 | } |
| 625 | 620 | ||
| 626 | 621 | ||
| 627 | /** | 622 | /** |
| 628 | * rtc_uie_update_irq - UIE mode rtctimer hook | 623 | * rtc_uie_update_irq - UIE mode rtctimer hook |
| 629 | * @private: pointer to the rtc_device | 624 | * @rtc: pointer to the rtc_device |
| 630 | * | 625 | * |
| 631 | * This functions is called when the uie_timer expires. | 626 | * This functions is called when the uie_timer expires. |
| 632 | */ | 627 | */ |
| 633 | void rtc_uie_update_irq(void *private) | 628 | void rtc_uie_update_irq(struct rtc_device *rtc) |
| 634 | { | 629 | { |
| 635 | struct rtc_device *rtc = (struct rtc_device *)private; | ||
| 636 | rtc_handle_legacy_irq(rtc, 1, RTC_UF); | 630 | rtc_handle_legacy_irq(rtc, 1, RTC_UF); |
| 637 | } | 631 | } |
| 638 | 632 | ||
| @@ -912,7 +906,7 @@ again: | |||
| 912 | trace_rtc_timer_dequeue(timer); | 906 | trace_rtc_timer_dequeue(timer); |
| 913 | timer->enabled = 0; | 907 | timer->enabled = 0; |
| 914 | if (timer->func) | 908 | if (timer->func) |
| 915 | timer->func(timer->private_data); | 909 | timer->func(timer->rtc); |
| 916 | 910 | ||
| 917 | trace_rtc_timer_fired(timer); | 911 | trace_rtc_timer_fired(timer); |
| 918 | /* Re-add/fwd periodic timers */ | 912 | /* Re-add/fwd periodic timers */ |
| @@ -959,16 +953,17 @@ reprogram: | |||
| 959 | /* rtc_timer_init - Initializes an rtc_timer | 953 | /* rtc_timer_init - Initializes an rtc_timer |
| 960 | * @timer: timer to be intiialized | 954 | * @timer: timer to be intiialized |
| 961 | * @f: function pointer to be called when timer fires | 955 | * @f: function pointer to be called when timer fires |
| 962 | * @data: private data passed to function pointer | 956 | * @rtc: pointer to the rtc_device |
| 963 | * | 957 | * |
| 964 | * Kernel interface to initializing an rtc_timer. | 958 | * Kernel interface to initializing an rtc_timer. |
| 965 | */ | 959 | */ |
| 966 | void rtc_timer_init(struct rtc_timer *timer, void (*f)(void *p), void *data) | 960 | void rtc_timer_init(struct rtc_timer *timer, void (*f)(struct rtc_device *r), |
| 961 | struct rtc_device *rtc) | ||
| 967 | { | 962 | { |
| 968 | timerqueue_init(&timer->node); | 963 | timerqueue_init(&timer->node); |
| 969 | timer->enabled = 0; | 964 | timer->enabled = 0; |
| 970 | timer->func = f; | 965 | timer->func = f; |
| 971 | timer->private_data = data; | 966 | timer->rtc = rtc; |
| 972 | } | 967 | } |
| 973 | 968 | ||
| 974 | /* rtc_timer_start - Sets an rtc_timer to fire in the future | 969 | /* rtc_timer_start - Sets an rtc_timer to fire in the future |
diff --git a/drivers/rtc/rtc-lib.c b/drivers/rtc/lib.c index ef160da84220..ef160da84220 100644 --- a/drivers/rtc/rtc-lib.c +++ b/drivers/rtc/lib.c | |||
diff --git a/drivers/rtc/nvmem.c b/drivers/rtc/nvmem.c index 36ab183c42f1..dce518d5e50e 100644 --- a/drivers/rtc/nvmem.c +++ b/drivers/rtc/nvmem.c | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include <linux/types.h> | 12 | #include <linux/types.h> |
| 13 | #include <linux/nvmem-consumer.h> | 13 | #include <linux/nvmem-consumer.h> |
| 14 | #include <linux/rtc.h> | 14 | #include <linux/rtc.h> |
| 15 | #include <linux/slab.h> | ||
| 15 | #include <linux/sysfs.h> | 16 | #include <linux/sysfs.h> |
| 16 | 17 | ||
| 17 | /* | 18 | /* |
| @@ -25,11 +26,9 @@ rtc_nvram_read(struct file *filp, struct kobject *kobj, | |||
| 25 | struct bin_attribute *attr, | 26 | struct bin_attribute *attr, |
| 26 | char *buf, loff_t off, size_t count) | 27 | char *buf, loff_t off, size_t count) |
| 27 | { | 28 | { |
| 28 | struct rtc_device *rtc = attr->private; | ||
| 29 | |||
| 30 | dev_warn_once(kobj_to_dev(kobj), nvram_warning); | 29 | dev_warn_once(kobj_to_dev(kobj), nvram_warning); |
| 31 | 30 | ||
| 32 | return nvmem_device_read(rtc->nvmem, off, count, buf); | 31 | return nvmem_device_read(attr->private, off, count, buf); |
| 33 | } | 32 | } |
| 34 | 33 | ||
| 35 | static ssize_t | 34 | static ssize_t |
| @@ -37,26 +36,23 @@ rtc_nvram_write(struct file *filp, struct kobject *kobj, | |||
| 37 | struct bin_attribute *attr, | 36 | struct bin_attribute *attr, |
| 38 | char *buf, loff_t off, size_t count) | 37 | char *buf, loff_t off, size_t count) |
| 39 | { | 38 | { |
| 40 | struct rtc_device *rtc = attr->private; | ||
| 41 | |||
| 42 | dev_warn_once(kobj_to_dev(kobj), nvram_warning); | 39 | dev_warn_once(kobj_to_dev(kobj), nvram_warning); |
| 43 | 40 | ||
| 44 | return nvmem_device_write(rtc->nvmem, off, count, buf); | 41 | return nvmem_device_write(attr->private, off, count, buf); |
| 45 | } | 42 | } |
| 46 | 43 | ||
| 47 | static int rtc_nvram_register(struct rtc_device *rtc, size_t size) | 44 | static int rtc_nvram_register(struct rtc_device *rtc, |
| 45 | struct nvmem_device *nvmem, size_t size) | ||
| 48 | { | 46 | { |
| 49 | int err; | 47 | int err; |
| 50 | 48 | ||
| 51 | rtc->nvram = devm_kzalloc(rtc->dev.parent, | 49 | rtc->nvram = kzalloc(sizeof(struct bin_attribute), GFP_KERNEL); |
| 52 | sizeof(struct bin_attribute), | ||
| 53 | GFP_KERNEL); | ||
| 54 | if (!rtc->nvram) | 50 | if (!rtc->nvram) |
| 55 | return -ENOMEM; | 51 | return -ENOMEM; |
| 56 | 52 | ||
| 57 | rtc->nvram->attr.name = "nvram"; | 53 | rtc->nvram->attr.name = "nvram"; |
| 58 | rtc->nvram->attr.mode = 0644; | 54 | rtc->nvram->attr.mode = 0644; |
| 59 | rtc->nvram->private = rtc; | 55 | rtc->nvram->private = nvmem; |
| 60 | 56 | ||
| 61 | sysfs_bin_attr_init(rtc->nvram); | 57 | sysfs_bin_attr_init(rtc->nvram); |
| 62 | 58 | ||
| @@ -67,7 +63,7 @@ static int rtc_nvram_register(struct rtc_device *rtc, size_t size) | |||
| 67 | err = sysfs_create_bin_file(&rtc->dev.parent->kobj, | 63 | err = sysfs_create_bin_file(&rtc->dev.parent->kobj, |
| 68 | rtc->nvram); | 64 | rtc->nvram); |
| 69 | if (err) { | 65 | if (err) { |
| 70 | devm_kfree(rtc->dev.parent, rtc->nvram); | 66 | kfree(rtc->nvram); |
| 71 | rtc->nvram = NULL; | 67 | rtc->nvram = NULL; |
| 72 | } | 68 | } |
| 73 | 69 | ||
| @@ -77,6 +73,8 @@ static int rtc_nvram_register(struct rtc_device *rtc, size_t size) | |||
| 77 | static void rtc_nvram_unregister(struct rtc_device *rtc) | 73 | static void rtc_nvram_unregister(struct rtc_device *rtc) |
| 78 | { | 74 | { |
| 79 | sysfs_remove_bin_file(&rtc->dev.parent->kobj, rtc->nvram); | 75 | sysfs_remove_bin_file(&rtc->dev.parent->kobj, rtc->nvram); |
| 76 | kfree(rtc->nvram); | ||
| 77 | rtc->nvram = NULL; | ||
| 80 | } | 78 | } |
| 81 | 79 | ||
| 82 | /* | 80 | /* |
| @@ -85,21 +83,20 @@ static void rtc_nvram_unregister(struct rtc_device *rtc) | |||
| 85 | int rtc_nvmem_register(struct rtc_device *rtc, | 83 | int rtc_nvmem_register(struct rtc_device *rtc, |
| 86 | struct nvmem_config *nvmem_config) | 84 | struct nvmem_config *nvmem_config) |
| 87 | { | 85 | { |
| 88 | if (!IS_ERR_OR_NULL(rtc->nvmem)) | 86 | struct nvmem_device *nvmem; |
| 89 | return -EBUSY; | ||
| 90 | 87 | ||
| 91 | if (!nvmem_config) | 88 | if (!nvmem_config) |
| 92 | return -ENODEV; | 89 | return -ENODEV; |
| 93 | 90 | ||
| 94 | nvmem_config->dev = rtc->dev.parent; | 91 | nvmem_config->dev = rtc->dev.parent; |
| 95 | nvmem_config->owner = rtc->owner; | 92 | nvmem_config->owner = rtc->owner; |
| 96 | rtc->nvmem = nvmem_register(nvmem_config); | 93 | nvmem = devm_nvmem_register(rtc->dev.parent, nvmem_config); |
| 97 | if (IS_ERR(rtc->nvmem)) | 94 | if (IS_ERR(nvmem)) |
| 98 | return PTR_ERR(rtc->nvmem); | 95 | return PTR_ERR(nvmem); |
| 99 | 96 | ||
| 100 | /* Register the old ABI */ | 97 | /* Register the old ABI */ |
| 101 | if (rtc->nvram_old_abi) | 98 | if (rtc->nvram_old_abi) |
| 102 | rtc_nvram_register(rtc, nvmem_config->size); | 99 | rtc_nvram_register(rtc, nvmem, nvmem_config->size); |
| 103 | 100 | ||
| 104 | return 0; | 101 | return 0; |
| 105 | } | 102 | } |
| @@ -107,12 +104,7 @@ EXPORT_SYMBOL_GPL(rtc_nvmem_register); | |||
| 107 | 104 | ||
| 108 | void rtc_nvmem_unregister(struct rtc_device *rtc) | 105 | void rtc_nvmem_unregister(struct rtc_device *rtc) |
| 109 | { | 106 | { |
| 110 | if (IS_ERR_OR_NULL(rtc->nvmem)) | ||
| 111 | return; | ||
| 112 | |||
| 113 | /* unregister the old ABI */ | 107 | /* unregister the old ABI */ |
| 114 | if (rtc->nvram) | 108 | if (rtc->nvram) |
| 115 | rtc_nvram_unregister(rtc); | 109 | rtc_nvram_unregister(rtc); |
| 116 | |||
| 117 | nvmem_unregister(rtc->nvmem); | ||
| 118 | } | 110 | } |
diff --git a/drivers/rtc/rtc-proc.c b/drivers/rtc/proc.c index a9dd9218fae2..4d74e4f4ff30 100644 --- a/drivers/rtc/rtc-proc.c +++ b/drivers/rtc/proc.c | |||
| @@ -50,41 +50,15 @@ static int rtc_proc_show(struct seq_file *seq, void *offset) | |||
| 50 | err = rtc_read_time(rtc, &tm); | 50 | err = rtc_read_time(rtc, &tm); |
| 51 | if (err == 0) { | 51 | if (err == 0) { |
| 52 | seq_printf(seq, | 52 | seq_printf(seq, |
| 53 | "rtc_time\t: %02d:%02d:%02d\n" | 53 | "rtc_time\t: %ptRt\n" |
| 54 | "rtc_date\t: %04d-%02d-%02d\n", | 54 | "rtc_date\t: %ptRd\n", |
| 55 | tm.tm_hour, tm.tm_min, tm.tm_sec, | 55 | &tm, &tm); |
| 56 | tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday); | ||
| 57 | } | 56 | } |
| 58 | 57 | ||
| 59 | err = rtc_read_alarm(rtc, &alrm); | 58 | err = rtc_read_alarm(rtc, &alrm); |
| 60 | if (err == 0) { | 59 | if (err == 0) { |
| 61 | seq_printf(seq, "alrm_time\t: "); | 60 | seq_printf(seq, "alrm_time\t: %ptRt\n", &alrm.time); |
| 62 | if ((unsigned int)alrm.time.tm_hour <= 24) | 61 | seq_printf(seq, "alrm_date\t: %ptRd\n", &alrm.time); |
| 63 | seq_printf(seq, "%02d:", alrm.time.tm_hour); | ||
| 64 | else | ||
| 65 | seq_printf(seq, "**:"); | ||
| 66 | if ((unsigned int)alrm.time.tm_min <= 59) | ||
| 67 | seq_printf(seq, "%02d:", alrm.time.tm_min); | ||
| 68 | else | ||
| 69 | seq_printf(seq, "**:"); | ||
| 70 | if ((unsigned int)alrm.time.tm_sec <= 59) | ||
| 71 | seq_printf(seq, "%02d\n", alrm.time.tm_sec); | ||
| 72 | else | ||
| 73 | seq_printf(seq, "**\n"); | ||
| 74 | |||
| 75 | seq_printf(seq, "alrm_date\t: "); | ||
| 76 | if ((unsigned int)alrm.time.tm_year <= 200) | ||
| 77 | seq_printf(seq, "%04d-", alrm.time.tm_year + 1900); | ||
| 78 | else | ||
| 79 | seq_printf(seq, "****-"); | ||
| 80 | if ((unsigned int)alrm.time.tm_mon <= 11) | ||
| 81 | seq_printf(seq, "%02d-", alrm.time.tm_mon + 1); | ||
| 82 | else | ||
| 83 | seq_printf(seq, "**-"); | ||
| 84 | if (alrm.time.tm_mday && (unsigned int)alrm.time.tm_mday <= 31) | ||
| 85 | seq_printf(seq, "%02d\n", alrm.time.tm_mday); | ||
| 86 | else | ||
| 87 | seq_printf(seq, "**\n"); | ||
| 88 | seq_printf(seq, "alarm_IRQ\t: %s\n", | 62 | seq_printf(seq, "alarm_IRQ\t: %s\n", |
| 89 | alrm.enabled ? "yes" : "no"); | 63 | alrm.enabled ? "yes" : "no"); |
| 90 | seq_printf(seq, "alrm_pending\t: %s\n", | 64 | seq_printf(seq, "alrm_pending\t: %s\n", |
diff --git a/drivers/rtc/rtc-abx80x.c b/drivers/rtc/rtc-abx80x.c index d8e94edcb0ba..4d24f7288ad7 100644 --- a/drivers/rtc/rtc-abx80x.c +++ b/drivers/rtc/rtc-abx80x.c | |||
| @@ -38,6 +38,7 @@ | |||
| 38 | 38 | ||
| 39 | #define ABX8XX_REG_STATUS 0x0f | 39 | #define ABX8XX_REG_STATUS 0x0f |
| 40 | #define ABX8XX_STATUS_AF BIT(2) | 40 | #define ABX8XX_STATUS_AF BIT(2) |
| 41 | #define ABX8XX_STATUS_BLF BIT(4) | ||
| 41 | #define ABX8XX_STATUS_WDT BIT(6) | 42 | #define ABX8XX_STATUS_WDT BIT(6) |
| 42 | 43 | ||
| 43 | #define ABX8XX_REG_CTRL1 0x10 | 44 | #define ABX8XX_REG_CTRL1 0x10 |
| @@ -507,12 +508,49 @@ static int abx80x_alarm_irq_enable(struct device *dev, unsigned int enabled) | |||
| 507 | return err; | 508 | return err; |
| 508 | } | 509 | } |
| 509 | 510 | ||
| 511 | static int abx80x_ioctl(struct device *dev, unsigned int cmd, unsigned long arg) | ||
| 512 | { | ||
| 513 | struct i2c_client *client = to_i2c_client(dev); | ||
| 514 | int status, tmp; | ||
| 515 | |||
| 516 | switch (cmd) { | ||
| 517 | case RTC_VL_READ: | ||
| 518 | status = i2c_smbus_read_byte_data(client, ABX8XX_REG_STATUS); | ||
| 519 | if (status < 0) | ||
| 520 | return status; | ||
| 521 | |||
| 522 | tmp = !!(status & ABX8XX_STATUS_BLF); | ||
| 523 | |||
| 524 | if (copy_to_user((void __user *)arg, &tmp, sizeof(int))) | ||
| 525 | return -EFAULT; | ||
| 526 | |||
| 527 | return 0; | ||
| 528 | |||
| 529 | case RTC_VL_CLR: | ||
| 530 | status = i2c_smbus_read_byte_data(client, ABX8XX_REG_STATUS); | ||
| 531 | if (status < 0) | ||
| 532 | return status; | ||
| 533 | |||
| 534 | status &= ~ABX8XX_STATUS_BLF; | ||
| 535 | |||
| 536 | tmp = i2c_smbus_write_byte_data(client, ABX8XX_REG_STATUS, 0); | ||
| 537 | if (tmp < 0) | ||
| 538 | return tmp; | ||
| 539 | |||
| 540 | return 0; | ||
| 541 | |||
| 542 | default: | ||
| 543 | return -ENOIOCTLCMD; | ||
| 544 | } | ||
| 545 | } | ||
| 546 | |||
| 510 | static const struct rtc_class_ops abx80x_rtc_ops = { | 547 | static const struct rtc_class_ops abx80x_rtc_ops = { |
| 511 | .read_time = abx80x_rtc_read_time, | 548 | .read_time = abx80x_rtc_read_time, |
| 512 | .set_time = abx80x_rtc_set_time, | 549 | .set_time = abx80x_rtc_set_time, |
| 513 | .read_alarm = abx80x_read_alarm, | 550 | .read_alarm = abx80x_read_alarm, |
| 514 | .set_alarm = abx80x_set_alarm, | 551 | .set_alarm = abx80x_set_alarm, |
| 515 | .alarm_irq_enable = abx80x_alarm_irq_enable, | 552 | .alarm_irq_enable = abx80x_alarm_irq_enable, |
| 553 | .ioctl = abx80x_ioctl, | ||
| 516 | }; | 554 | }; |
| 517 | 555 | ||
| 518 | static int abx80x_dt_trickle_cfg(struct device_node *np) | 556 | static int abx80x_dt_trickle_cfg(struct device_node *np) |
diff --git a/drivers/rtc/rtc-at91rm9200.c b/drivers/rtc/rtc-at91rm9200.c index caa71d04e989..862b993c3142 100644 --- a/drivers/rtc/rtc-at91rm9200.c +++ b/drivers/rtc/rtc-at91rm9200.c | |||
| @@ -147,9 +147,7 @@ static int at91_rtc_readtime(struct device *dev, struct rtc_time *tm) | |||
| 147 | tm->tm_yday = rtc_year_days(tm->tm_mday, tm->tm_mon, tm->tm_year); | 147 | tm->tm_yday = rtc_year_days(tm->tm_mday, tm->tm_mon, tm->tm_year); |
| 148 | tm->tm_year = tm->tm_year - 1900; | 148 | tm->tm_year = tm->tm_year - 1900; |
| 149 | 149 | ||
| 150 | dev_dbg(dev, "%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__, | 150 | dev_dbg(dev, "%s(): %ptR\n", __func__, tm); |
| 151 | 1900 + tm->tm_year, tm->tm_mon, tm->tm_mday, | ||
| 152 | tm->tm_hour, tm->tm_min, tm->tm_sec); | ||
| 153 | 151 | ||
| 154 | return 0; | 152 | return 0; |
| 155 | } | 153 | } |
| @@ -161,9 +159,7 @@ static int at91_rtc_settime(struct device *dev, struct rtc_time *tm) | |||
| 161 | { | 159 | { |
| 162 | unsigned long cr; | 160 | unsigned long cr; |
| 163 | 161 | ||
| 164 | dev_dbg(dev, "%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__, | 162 | dev_dbg(dev, "%s(): %ptR\n", __func__, tm); |
| 165 | 1900 + tm->tm_year, tm->tm_mon, tm->tm_mday, | ||
| 166 | tm->tm_hour, tm->tm_min, tm->tm_sec); | ||
| 167 | 163 | ||
| 168 | wait_for_completion(&at91_rtc_upd_rdy); | 164 | wait_for_completion(&at91_rtc_upd_rdy); |
| 169 | 165 | ||
| @@ -209,8 +205,7 @@ static int at91_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 209 | alrm->enabled = (at91_rtc_read_imr() & AT91_RTC_ALARM) | 205 | alrm->enabled = (at91_rtc_read_imr() & AT91_RTC_ALARM) |
| 210 | ? 1 : 0; | 206 | ? 1 : 0; |
| 211 | 207 | ||
| 212 | dev_dbg(dev, "%s(): %02d-%02d %02d:%02d:%02d %sabled\n", __func__, | 208 | dev_dbg(dev, "%s(): %ptR %sabled\n", __func__, tm, |
| 213 | tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, | ||
| 214 | alrm->enabled ? "en" : "dis"); | 209 | alrm->enabled ? "en" : "dis"); |
| 215 | 210 | ||
| 216 | return 0; | 211 | return 0; |
| @@ -247,9 +242,7 @@ static int at91_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 247 | at91_rtc_write_ier(AT91_RTC_ALARM); | 242 | at91_rtc_write_ier(AT91_RTC_ALARM); |
| 248 | } | 243 | } |
| 249 | 244 | ||
| 250 | dev_dbg(dev, "%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__, | 245 | dev_dbg(dev, "%s(): %ptR\n", __func__, &tm); |
| 251 | tm.tm_year, tm.tm_mon, tm.tm_mday, tm.tm_hour, | ||
| 252 | tm.tm_min, tm.tm_sec); | ||
| 253 | 246 | ||
| 254 | return 0; | 247 | return 0; |
| 255 | } | 248 | } |
diff --git a/drivers/rtc/rtc-at91sam9.c b/drivers/rtc/rtc-at91sam9.c index ee71e647fd43..1d31c0ae6334 100644 --- a/drivers/rtc/rtc-at91sam9.c +++ b/drivers/rtc/rtc-at91sam9.c | |||
| @@ -124,9 +124,7 @@ static int at91_rtc_readtime(struct device *dev, struct rtc_time *tm) | |||
| 124 | 124 | ||
| 125 | rtc_time_to_tm(offset + secs, tm); | 125 | rtc_time_to_tm(offset + secs, tm); |
| 126 | 126 | ||
| 127 | dev_dbg(dev, "%s: %4d-%02d-%02d %02d:%02d:%02d\n", "readtime", | 127 | dev_dbg(dev, "%s: %ptR\n", __func__, tm); |
| 128 | 1900 + tm->tm_year, tm->tm_mon, tm->tm_mday, | ||
| 129 | tm->tm_hour, tm->tm_min, tm->tm_sec); | ||
| 130 | 128 | ||
| 131 | return 0; | 129 | return 0; |
| 132 | } | 130 | } |
| @@ -141,9 +139,7 @@ static int at91_rtc_settime(struct device *dev, struct rtc_time *tm) | |||
| 141 | u32 offset, alarm, mr; | 139 | u32 offset, alarm, mr; |
| 142 | unsigned long secs; | 140 | unsigned long secs; |
| 143 | 141 | ||
| 144 | dev_dbg(dev, "%s: %4d-%02d-%02d %02d:%02d:%02d\n", "settime", | 142 | dev_dbg(dev, "%s: %ptR\n", __func__, tm); |
| 145 | 1900 + tm->tm_year, tm->tm_mon, tm->tm_mday, | ||
| 146 | tm->tm_hour, tm->tm_min, tm->tm_sec); | ||
| 147 | 143 | ||
| 148 | err = rtc_tm_to_time(tm, &secs); | 144 | err = rtc_tm_to_time(tm, &secs); |
| 149 | if (err != 0) | 145 | if (err != 0) |
| @@ -199,9 +195,7 @@ static int at91_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 199 | if (alarm != ALARM_DISABLED && offset != 0) { | 195 | if (alarm != ALARM_DISABLED && offset != 0) { |
| 200 | rtc_time_to_tm(offset + alarm, tm); | 196 | rtc_time_to_tm(offset + alarm, tm); |
| 201 | 197 | ||
| 202 | dev_dbg(dev, "%s: %4d-%02d-%02d %02d:%02d:%02d\n", "readalarm", | 198 | dev_dbg(dev, "%s: %ptR\n", __func__, tm); |
| 203 | 1900 + tm->tm_year, tm->tm_mon, tm->tm_mday, | ||
| 204 | tm->tm_hour, tm->tm_min, tm->tm_sec); | ||
| 205 | 199 | ||
| 206 | if (rtt_readl(rtc, MR) & AT91_RTT_ALMIEN) | 200 | if (rtt_readl(rtc, MR) & AT91_RTT_ALMIEN) |
| 207 | alrm->enabled = 1; | 201 | alrm->enabled = 1; |
| @@ -242,9 +236,7 @@ static int at91_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 242 | if (alrm->enabled) | 236 | if (alrm->enabled) |
| 243 | rtt_writel(rtc, MR, mr | AT91_RTT_ALMIEN); | 237 | rtt_writel(rtc, MR, mr | AT91_RTT_ALMIEN); |
| 244 | 238 | ||
| 245 | dev_dbg(dev, "%s: %4d-%02d-%02d %02d:%02d:%02d\n", "setalarm", | 239 | dev_dbg(dev, "%s: %ptR\n", __func__, tm); |
| 246 | tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_hour, | ||
| 247 | tm->tm_min, tm->tm_sec); | ||
| 248 | 240 | ||
| 249 | return 0; | 241 | return 0; |
| 250 | } | 242 | } |
diff --git a/drivers/rtc/rtc-ep93xx.c b/drivers/rtc/rtc-ep93xx.c index 694038208745..1932a4f861d1 100644 --- a/drivers/rtc/rtc-ep93xx.c +++ b/drivers/rtc/rtc-ep93xx.c | |||
| @@ -61,7 +61,7 @@ static int ep93xx_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
| 61 | struct ep93xx_rtc *ep93xx_rtc = dev_get_platdata(dev); | 61 | struct ep93xx_rtc *ep93xx_rtc = dev_get_platdata(dev); |
| 62 | unsigned long time; | 62 | unsigned long time; |
| 63 | 63 | ||
| 64 | time = readl(ep93xx_rtc->mmio_base + EP93XX_RTC_DATA); | 64 | time = readl(ep93xx_rtc->mmio_base + EP93XX_RTC_DATA); |
| 65 | 65 | ||
| 66 | rtc_time_to_tm(time, tm); | 66 | rtc_time_to_tm(time, tm); |
| 67 | return 0; | 67 | return 0; |
diff --git a/drivers/rtc/rtc-imx-sc.c b/drivers/rtc/rtc-imx-sc.c new file mode 100644 index 000000000000..7ff08544532a --- /dev/null +++ b/drivers/rtc/rtc-imx-sc.c | |||
| @@ -0,0 +1,91 @@ | |||
| 1 | // SPDX-License-Identifier: GPL-2.0+ | ||
| 2 | /* | ||
| 3 | * Copyright 2018 NXP. | ||
| 4 | */ | ||
| 5 | |||
| 6 | #include <linux/firmware/imx/sci.h> | ||
| 7 | #include <linux/module.h> | ||
| 8 | #include <linux/of.h> | ||
| 9 | #include <linux/platform_device.h> | ||
| 10 | #include <linux/rtc.h> | ||
| 11 | |||
| 12 | #define IMX_SC_TIMER_FUNC_GET_RTC_SEC1970 9 | ||
| 13 | #define IMX_SC_TIMER_FUNC_SET_RTC_TIME 6 | ||
| 14 | |||
| 15 | static struct imx_sc_ipc *rtc_ipc_handle; | ||
| 16 | static struct rtc_device *imx_sc_rtc; | ||
| 17 | |||
| 18 | struct imx_sc_msg_timer_get_rtc_time { | ||
| 19 | struct imx_sc_rpc_msg hdr; | ||
| 20 | u32 time; | ||
| 21 | } __packed; | ||
| 22 | |||
| 23 | static int imx_sc_rtc_read_time(struct device *dev, struct rtc_time *tm) | ||
| 24 | { | ||
| 25 | struct imx_sc_msg_timer_get_rtc_time msg; | ||
| 26 | struct imx_sc_rpc_msg *hdr = &msg.hdr; | ||
| 27 | int ret; | ||
| 28 | |||
| 29 | hdr->ver = IMX_SC_RPC_VERSION; | ||
| 30 | hdr->svc = IMX_SC_RPC_SVC_TIMER; | ||
| 31 | hdr->func = IMX_SC_TIMER_FUNC_GET_RTC_SEC1970; | ||
| 32 | hdr->size = 1; | ||
| 33 | |||
| 34 | ret = imx_scu_call_rpc(rtc_ipc_handle, &msg, true); | ||
| 35 | if (ret) { | ||
| 36 | dev_err(dev, "read rtc time failed, ret %d\n", ret); | ||
| 37 | return ret; | ||
| 38 | } | ||
| 39 | |||
| 40 | rtc_time_to_tm(msg.time, tm); | ||
| 41 | |||
| 42 | return 0; | ||
| 43 | } | ||
| 44 | |||
| 45 | static const struct rtc_class_ops imx_sc_rtc_ops = { | ||
| 46 | .read_time = imx_sc_rtc_read_time, | ||
| 47 | }; | ||
| 48 | |||
| 49 | static int imx_sc_rtc_probe(struct platform_device *pdev) | ||
| 50 | { | ||
| 51 | int ret; | ||
| 52 | |||
| 53 | ret = imx_scu_get_handle(&rtc_ipc_handle); | ||
| 54 | if (ret) | ||
| 55 | return ret; | ||
| 56 | |||
| 57 | imx_sc_rtc = devm_rtc_allocate_device(&pdev->dev); | ||
| 58 | if (IS_ERR(imx_sc_rtc)) | ||
| 59 | return PTR_ERR(imx_sc_rtc); | ||
| 60 | |||
| 61 | imx_sc_rtc->ops = &imx_sc_rtc_ops; | ||
| 62 | imx_sc_rtc->range_min = 0; | ||
| 63 | imx_sc_rtc->range_max = U32_MAX; | ||
| 64 | |||
| 65 | ret = rtc_register_device(imx_sc_rtc); | ||
| 66 | if (ret) { | ||
| 67 | dev_err(&pdev->dev, "failed to register rtc: %d\n", ret); | ||
| 68 | return ret; | ||
| 69 | } | ||
| 70 | |||
| 71 | return 0; | ||
| 72 | } | ||
| 73 | |||
| 74 | static const struct of_device_id imx_sc_dt_ids[] = { | ||
| 75 | { .compatible = "fsl,imx8qxp-sc-rtc", }, | ||
| 76 | {} | ||
| 77 | }; | ||
| 78 | MODULE_DEVICE_TABLE(of, imx_sc_dt_ids); | ||
| 79 | |||
| 80 | static struct platform_driver imx_sc_rtc_driver = { | ||
| 81 | .driver = { | ||
| 82 | .name = "imx-sc-rtc", | ||
| 83 | .of_match_table = imx_sc_dt_ids, | ||
| 84 | }, | ||
| 85 | .probe = imx_sc_rtc_probe, | ||
| 86 | }; | ||
| 87 | module_platform_driver(imx_sc_rtc_driver); | ||
| 88 | |||
| 89 | MODULE_AUTHOR("Anson Huang <Anson.Huang@nxp.com>"); | ||
| 90 | MODULE_DESCRIPTION("NXP i.MX System Controller RTC Driver"); | ||
| 91 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/rtc/rtc-isl1208.c b/drivers/rtc/rtc-isl1208.c index ec5ef518a09b..37ab3e1d25f5 100644 --- a/drivers/rtc/rtc-isl1208.c +++ b/drivers/rtc/rtc-isl1208.c | |||
| @@ -84,29 +84,13 @@ static int | |||
| 84 | isl1208_i2c_read_regs(struct i2c_client *client, u8 reg, u8 buf[], | 84 | isl1208_i2c_read_regs(struct i2c_client *client, u8 reg, u8 buf[], |
| 85 | unsigned len) | 85 | unsigned len) |
| 86 | { | 86 | { |
| 87 | u8 reg_addr[1] = { reg }; | ||
| 88 | struct i2c_msg msgs[2] = { | ||
| 89 | { | ||
| 90 | .addr = client->addr, | ||
| 91 | .len = sizeof(reg_addr), | ||
| 92 | .buf = reg_addr | ||
| 93 | }, | ||
| 94 | { | ||
| 95 | .addr = client->addr, | ||
| 96 | .flags = I2C_M_RD, | ||
| 97 | .len = len, | ||
| 98 | .buf = buf | ||
| 99 | } | ||
| 100 | }; | ||
| 101 | int ret; | 87 | int ret; |
| 102 | 88 | ||
| 103 | WARN_ON(reg > ISL1219_REG_YRT); | 89 | WARN_ON(reg > ISL1219_REG_YRT); |
| 104 | WARN_ON(reg + len > ISL1219_REG_YRT + 1); | 90 | WARN_ON(reg + len > ISL1219_REG_YRT + 1); |
| 105 | 91 | ||
| 106 | ret = i2c_transfer(client->adapter, msgs, 2); | 92 | ret = i2c_smbus_read_i2c_block_data(client, reg, len, buf); |
| 107 | if (ret > 0) | 93 | return (ret < 0) ? ret : 0; |
| 108 | ret = 0; | ||
| 109 | return ret; | ||
| 110 | } | 94 | } |
| 111 | 95 | ||
| 112 | /* block write */ | 96 | /* block write */ |
| @@ -114,26 +98,13 @@ static int | |||
| 114 | isl1208_i2c_set_regs(struct i2c_client *client, u8 reg, u8 const buf[], | 98 | isl1208_i2c_set_regs(struct i2c_client *client, u8 reg, u8 const buf[], |
| 115 | unsigned len) | 99 | unsigned len) |
| 116 | { | 100 | { |
| 117 | u8 i2c_buf[ISL1208_REG_USR2 + 2]; | ||
| 118 | struct i2c_msg msgs[1] = { | ||
| 119 | { | ||
| 120 | .addr = client->addr, | ||
| 121 | .len = len + 1, | ||
| 122 | .buf = i2c_buf | ||
| 123 | } | ||
| 124 | }; | ||
| 125 | int ret; | 101 | int ret; |
| 126 | 102 | ||
| 127 | WARN_ON(reg > ISL1219_REG_YRT); | 103 | WARN_ON(reg > ISL1219_REG_YRT); |
| 128 | WARN_ON(reg + len > ISL1219_REG_YRT + 1); | 104 | WARN_ON(reg + len > ISL1219_REG_YRT + 1); |
| 129 | 105 | ||
| 130 | i2c_buf[0] = reg; | 106 | ret = i2c_smbus_write_i2c_block_data(client, reg, len, buf); |
| 131 | memcpy(&i2c_buf[1], &buf[0], len); | 107 | return (ret < 0) ? ret : 0; |
| 132 | |||
| 133 | ret = i2c_transfer(client->adapter, msgs, 1); | ||
| 134 | if (ret > 0) | ||
| 135 | ret = 0; | ||
| 136 | return ret; | ||
| 137 | } | 108 | } |
| 138 | 109 | ||
| 139 | /* simple check to see whether we have a isl1208 */ | 110 | /* simple check to see whether we have a isl1208 */ |
diff --git a/drivers/rtc/rtc-m41t80.c b/drivers/rtc/rtc-m41t80.c index a3fb235fea0d..ebf50b1540f2 100644 --- a/drivers/rtc/rtc-m41t80.c +++ b/drivers/rtc/rtc-m41t80.c | |||
| @@ -217,7 +217,7 @@ static int m41t80_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
| 217 | sizeof(buf), buf); | 217 | sizeof(buf), buf); |
| 218 | if (err < 0) { | 218 | if (err < 0) { |
| 219 | dev_err(&client->dev, "Unable to read date\n"); | 219 | dev_err(&client->dev, "Unable to read date\n"); |
| 220 | return -EIO; | 220 | return err; |
| 221 | } | 221 | } |
| 222 | 222 | ||
| 223 | tm->tm_sec = bcd2bin(buf[M41T80_REG_SEC] & 0x7f); | 223 | tm->tm_sec = bcd2bin(buf[M41T80_REG_SEC] & 0x7f); |
| @@ -274,10 +274,11 @@ static int m41t80_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
| 274 | if (flags < 0) | 274 | if (flags < 0) |
| 275 | return flags; | 275 | return flags; |
| 276 | 276 | ||
| 277 | if (i2c_smbus_write_byte_data(client, M41T80_REG_FLAGS, | 277 | err = i2c_smbus_write_byte_data(client, M41T80_REG_FLAGS, |
| 278 | flags & ~M41T80_FLAGS_OF)) { | 278 | flags & ~M41T80_FLAGS_OF); |
| 279 | if (err < 0) { | ||
| 279 | dev_err(&client->dev, "Unable to write flags register\n"); | 280 | dev_err(&client->dev, "Unable to write flags register\n"); |
| 280 | return -EIO; | 281 | return err; |
| 281 | } | 282 | } |
| 282 | 283 | ||
| 283 | return err; | 284 | return err; |
| @@ -287,10 +288,12 @@ static int m41t80_rtc_proc(struct device *dev, struct seq_file *seq) | |||
| 287 | { | 288 | { |
| 288 | struct i2c_client *client = to_i2c_client(dev); | 289 | struct i2c_client *client = to_i2c_client(dev); |
| 289 | struct m41t80_data *clientdata = i2c_get_clientdata(client); | 290 | struct m41t80_data *clientdata = i2c_get_clientdata(client); |
| 290 | u8 reg; | 291 | int reg; |
| 291 | 292 | ||
| 292 | if (clientdata->features & M41T80_FEATURE_BL) { | 293 | if (clientdata->features & M41T80_FEATURE_BL) { |
| 293 | reg = i2c_smbus_read_byte_data(client, M41T80_REG_FLAGS); | 294 | reg = i2c_smbus_read_byte_data(client, M41T80_REG_FLAGS); |
| 295 | if (reg < 0) | ||
| 296 | return reg; | ||
| 294 | seq_printf(seq, "battery\t\t: %s\n", | 297 | seq_printf(seq, "battery\t\t: %s\n", |
| 295 | (reg & M41T80_FLAGS_BATT_LOW) ? "exhausted" : "ok"); | 298 | (reg & M41T80_FLAGS_BATT_LOW) ? "exhausted" : "ok"); |
| 296 | } | 299 | } |
| @@ -393,7 +396,7 @@ static int m41t80_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 393 | alrm->time.tm_min = bcd2bin(alarmvals[3] & 0x7f); | 396 | alrm->time.tm_min = bcd2bin(alarmvals[3] & 0x7f); |
| 394 | alrm->time.tm_hour = bcd2bin(alarmvals[2] & 0x3f); | 397 | alrm->time.tm_hour = bcd2bin(alarmvals[2] & 0x3f); |
| 395 | alrm->time.tm_mday = bcd2bin(alarmvals[1] & 0x3f); | 398 | alrm->time.tm_mday = bcd2bin(alarmvals[1] & 0x3f); |
| 396 | alrm->time.tm_mon = bcd2bin(alarmvals[0] & 0x3f); | 399 | alrm->time.tm_mon = bcd2bin(alarmvals[0] & 0x3f) - 1; |
| 397 | 400 | ||
| 398 | alrm->enabled = !!(alarmvals[0] & M41T80_ALMON_AFE); | 401 | alrm->enabled = !!(alarmvals[0] & M41T80_ALMON_AFE); |
| 399 | alrm->pending = (flags & M41T80_FLAGS_AF) && alrm->enabled; | 402 | alrm->pending = (flags & M41T80_FLAGS_AF) && alrm->enabled; |
| @@ -939,11 +942,7 @@ static int m41t80_probe(struct i2c_client *client, | |||
| 939 | if (m41t80_data->features & M41T80_FEATURE_HT) { | 942 | if (m41t80_data->features & M41T80_FEATURE_HT) { |
| 940 | m41t80_rtc_read_time(&client->dev, &tm); | 943 | m41t80_rtc_read_time(&client->dev, &tm); |
| 941 | dev_info(&client->dev, "HT bit was set!\n"); | 944 | dev_info(&client->dev, "HT bit was set!\n"); |
| 942 | dev_info(&client->dev, | 945 | dev_info(&client->dev, "Power Down at %ptR\n", &tm); |
| 943 | "Power Down at %04i-%02i-%02i %02i:%02i:%02i\n", | ||
| 944 | tm.tm_year + 1900, | ||
| 945 | tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, | ||
| 946 | tm.tm_min, tm.tm_sec); | ||
| 947 | } | 946 | } |
| 948 | rc = i2c_smbus_write_byte_data(client, M41T80_REG_ALARM_HOUR, | 947 | rc = i2c_smbus_write_byte_data(client, M41T80_REG_ALARM_HOUR, |
| 949 | rc & ~M41T80_ALHOUR_HT); | 948 | rc & ~M41T80_ALHOUR_HT); |
diff --git a/drivers/rtc/rtc-m48t59.c b/drivers/rtc/rtc-m48t59.c index ac9ca1042889..3c8ad1cdfd7c 100644 --- a/drivers/rtc/rtc-m48t59.c +++ b/drivers/rtc/rtc-m48t59.c | |||
| @@ -99,9 +99,7 @@ static int m48t59_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
| 99 | M48T59_CLEAR_BITS(M48T59_CNTL_READ, M48T59_CNTL); | 99 | M48T59_CLEAR_BITS(M48T59_CNTL_READ, M48T59_CNTL); |
| 100 | spin_unlock_irqrestore(&m48t59->lock, flags); | 100 | spin_unlock_irqrestore(&m48t59->lock, flags); |
| 101 | 101 | ||
| 102 | dev_dbg(dev, "RTC read time %04d-%02d-%02d %02d/%02d/%02d\n", | 102 | dev_dbg(dev, "RTC read time %ptR\n", tm); |
| 103 | tm->tm_year + 1900, tm->tm_mon, tm->tm_mday, | ||
| 104 | tm->tm_hour, tm->tm_min, tm->tm_sec); | ||
| 105 | return 0; | 103 | return 0; |
| 106 | } | 104 | } |
| 107 | 105 | ||
| @@ -188,9 +186,7 @@ static int m48t59_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 188 | M48T59_CLEAR_BITS(M48T59_CNTL_READ, M48T59_CNTL); | 186 | M48T59_CLEAR_BITS(M48T59_CNTL_READ, M48T59_CNTL); |
| 189 | spin_unlock_irqrestore(&m48t59->lock, flags); | 187 | spin_unlock_irqrestore(&m48t59->lock, flags); |
| 190 | 188 | ||
| 191 | dev_dbg(dev, "RTC read alarm time %04d-%02d-%02d %02d/%02d/%02d\n", | 189 | dev_dbg(dev, "RTC read alarm time %ptR\n", tm); |
| 192 | tm->tm_year + 1900, tm->tm_mon, tm->tm_mday, | ||
| 193 | tm->tm_hour, tm->tm_min, tm->tm_sec); | ||
| 194 | return rtc_valid_tm(tm); | 190 | return rtc_valid_tm(tm); |
| 195 | } | 191 | } |
| 196 | 192 | ||
diff --git a/drivers/rtc/rtc-max6916.c b/drivers/rtc/rtc-max6916.c index 7e908a490cf6..9d4b407cc4b8 100644 --- a/drivers/rtc/rtc-max6916.c +++ b/drivers/rtc/rtc-max6916.c | |||
| @@ -86,7 +86,7 @@ static int max6916_set_time(struct device *dev, struct rtc_time *dt) | |||
| 86 | if (dt->tm_year < 100 || dt->tm_year > 199) { | 86 | if (dt->tm_year < 100 || dt->tm_year > 199) { |
| 87 | dev_err(&spi->dev, "Year must be between 2000 and 2099. It's %d.\n", | 87 | dev_err(&spi->dev, "Year must be between 2000 and 2099. It's %d.\n", |
| 88 | dt->tm_year + 1900); | 88 | dt->tm_year + 1900); |
| 89 | return -EINVAL; | 89 | return -EINVAL; |
| 90 | } | 90 | } |
| 91 | 91 | ||
| 92 | buf[0] = MAX6916_CLOCK_BURST & 0x7F; | 92 | buf[0] = MAX6916_CLOCK_BURST & 0x7F; |
diff --git a/drivers/rtc/rtc-max77686.c b/drivers/rtc/rtc-max77686.c index 8a60900d6b8b..4aff349ae301 100644 --- a/drivers/rtc/rtc-max77686.c +++ b/drivers/rtc/rtc-max77686.c | |||
| @@ -360,7 +360,7 @@ static int max77686_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
| 360 | 360 | ||
| 361 | out: | 361 | out: |
| 362 | mutex_unlock(&info->lock); | 362 | mutex_unlock(&info->lock); |
| 363 | return 0; | 363 | return ret; |
| 364 | } | 364 | } |
| 365 | 365 | ||
| 366 | static int max77686_rtc_set_time(struct device *dev, struct rtc_time *tm) | 366 | 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 08c661a332ec..20e50d9fdf88 100644 --- a/drivers/rtc/rtc-max8997.c +++ b/drivers/rtc/rtc-max8997.c | |||
| @@ -215,7 +215,7 @@ static int max8997_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 215 | 215 | ||
| 216 | out: | 216 | out: |
| 217 | mutex_unlock(&info->lock); | 217 | mutex_unlock(&info->lock); |
| 218 | return 0; | 218 | return ret; |
| 219 | } | 219 | } |
| 220 | 220 | ||
| 221 | static int max8997_rtc_stop_alarm(struct max8997_rtc_info *info) | 221 | static int max8997_rtc_stop_alarm(struct max8997_rtc_info *info) |
diff --git a/drivers/rtc/rtc-mcp795.c b/drivers/rtc/rtc-mcp795.c index 00e11c1b2186..f22a945a3794 100644 --- a/drivers/rtc/rtc-mcp795.c +++ b/drivers/rtc/rtc-mcp795.c | |||
| @@ -233,9 +233,7 @@ static int mcp795_set_time(struct device *dev, struct rtc_time *tim) | |||
| 233 | if (ret) | 233 | if (ret) |
| 234 | return ret; | 234 | return ret; |
| 235 | 235 | ||
| 236 | dev_dbg(dev, "Set mcp795: %04d-%02d-%02d(%d) %02d:%02d:%02d\n", | 236 | dev_dbg(dev, "Set mcp795: %ptR\n", tim); |
| 237 | tim->tm_year + 1900, tim->tm_mon, tim->tm_mday, | ||
| 238 | tim->tm_wday, tim->tm_hour, tim->tm_min, tim->tm_sec); | ||
| 239 | 237 | ||
| 240 | return 0; | 238 | return 0; |
| 241 | } | 239 | } |
| @@ -258,9 +256,7 @@ static int mcp795_read_time(struct device *dev, struct rtc_time *tim) | |||
| 258 | tim->tm_mon = bcd2bin(data[5] & 0x1F) - 1; | 256 | tim->tm_mon = bcd2bin(data[5] & 0x1F) - 1; |
| 259 | tim->tm_year = bcd2bin(data[6]) + 100; /* Assume we are in 20xx */ | 257 | tim->tm_year = bcd2bin(data[6]) + 100; /* Assume we are in 20xx */ |
| 260 | 258 | ||
| 261 | dev_dbg(dev, "Read from mcp795: %04d-%02d-%02d(%d) %02d:%02d:%02d\n", | 259 | dev_dbg(dev, "Read from mcp795: %ptR\n", tim); |
| 262 | tim->tm_year + 1900, tim->tm_mon, tim->tm_mday, | ||
| 263 | tim->tm_wday, tim->tm_hour, tim->tm_min, tim->tm_sec); | ||
| 264 | 260 | ||
| 265 | return 0; | 261 | return 0; |
| 266 | } | 262 | } |
| @@ -319,9 +315,8 @@ static int mcp795_set_alarm(struct device *dev, struct rtc_wkalrm *alm) | |||
| 319 | return ret; | 315 | return ret; |
| 320 | dev_dbg(dev, "Alarm IRQ armed\n"); | 316 | dev_dbg(dev, "Alarm IRQ armed\n"); |
| 321 | } | 317 | } |
| 322 | dev_dbg(dev, "Set alarm: %02d-%02d(%d) %02d:%02d:%02d\n", | 318 | dev_dbg(dev, "Set alarm: %ptRdr(%d) %ptRt\n", |
| 323 | alm->time.tm_mon, alm->time.tm_mday, alm->time.tm_wday, | 319 | &alm->time, alm->time.tm_wday, &alm->time); |
| 324 | alm->time.tm_hour, alm->time.tm_min, alm->time.tm_sec); | ||
| 325 | return 0; | 320 | return 0; |
| 326 | } | 321 | } |
| 327 | 322 | ||
| @@ -345,9 +340,8 @@ static int mcp795_read_alarm(struct device *dev, struct rtc_wkalrm *alm) | |||
| 345 | alm->time.tm_isdst = -1; | 340 | alm->time.tm_isdst = -1; |
| 346 | alm->time.tm_yday = -1; | 341 | alm->time.tm_yday = -1; |
| 347 | 342 | ||
| 348 | dev_dbg(dev, "Read alarm: %02d-%02d(%d) %02d:%02d:%02d\n", | 343 | dev_dbg(dev, "Read alarm: %ptRdr(%d) %ptRt\n", |
| 349 | alm->time.tm_mon, alm->time.tm_mday, alm->time.tm_wday, | 344 | &alm->time, alm->time.tm_wday, &alm->time); |
| 350 | alm->time.tm_hour, alm->time.tm_min, alm->time.tm_sec); | ||
| 351 | return 0; | 345 | return 0; |
| 352 | } | 346 | } |
| 353 | 347 | ||
diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c index 320b4a520eb3..bbff0e2deb84 100644 --- a/drivers/rtc/rtc-omap.c +++ b/drivers/rtc/rtc-omap.c | |||
| @@ -566,9 +566,7 @@ static const struct pinctrl_ops rtc_pinctrl_ops = { | |||
| 566 | .dt_free_map = pinconf_generic_dt_free_map, | 566 | .dt_free_map = pinconf_generic_dt_free_map, |
| 567 | }; | 567 | }; |
| 568 | 568 | ||
| 569 | enum rtc_pin_config_param { | 569 | #define PIN_CONFIG_ACTIVE_HIGH (PIN_CONFIG_END + 1) |
| 570 | PIN_CONFIG_ACTIVE_HIGH = PIN_CONFIG_END + 1, | ||
| 571 | }; | ||
| 572 | 570 | ||
| 573 | static const struct pinconf_generic_params rtc_params[] = { | 571 | static const struct pinconf_generic_params rtc_params[] = { |
| 574 | {"ti,active-high", PIN_CONFIG_ACTIVE_HIGH, 0}, | 572 | {"ti,active-high", PIN_CONFIG_ACTIVE_HIGH, 0}, |
diff --git a/drivers/rtc/rtc-pcf2123.c b/drivers/rtc/rtc-pcf2123.c index e5222c5d8223..39da8b214275 100644 --- a/drivers/rtc/rtc-pcf2123.c +++ b/drivers/rtc/rtc-pcf2123.c | |||
| @@ -453,6 +453,7 @@ static int pcf2123_remove(struct spi_device *spi) | |||
| 453 | #ifdef CONFIG_OF | 453 | #ifdef CONFIG_OF |
| 454 | static const struct of_device_id pcf2123_dt_ids[] = { | 454 | static const struct of_device_id pcf2123_dt_ids[] = { |
| 455 | { .compatible = "nxp,rtc-pcf2123", }, | 455 | { .compatible = "nxp,rtc-pcf2123", }, |
| 456 | { .compatible = "microcrystal,rv2123", }, | ||
| 456 | { /* sentinel */ } | 457 | { /* sentinel */ } |
| 457 | }; | 458 | }; |
| 458 | MODULE_DEVICE_TABLE(of, pcf2123_dt_ids); | 459 | MODULE_DEVICE_TABLE(of, pcf2123_dt_ids); |
diff --git a/drivers/rtc/rtc-pcf50633.c b/drivers/rtc/rtc-pcf50633.c index ef72b0c389d7..0eb05b1d0b94 100644 --- a/drivers/rtc/rtc-pcf50633.c +++ b/drivers/rtc/rtc-pcf50633.c | |||
| @@ -131,9 +131,7 @@ static int pcf50633_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
| 131 | 131 | ||
| 132 | pcf2rtc_time(tm, &pcf_tm); | 132 | pcf2rtc_time(tm, &pcf_tm); |
| 133 | 133 | ||
| 134 | dev_dbg(dev, "RTC_TIME: %u.%u.%u %u:%u:%u\n", | 134 | dev_dbg(dev, "RTC_TIME: %ptRr\n", tm); |
| 135 | tm->tm_mday, tm->tm_mon, tm->tm_year, | ||
| 136 | tm->tm_hour, tm->tm_min, tm->tm_sec); | ||
| 137 | 135 | ||
| 138 | return 0; | 136 | return 0; |
| 139 | } | 137 | } |
| @@ -146,9 +144,7 @@ static int pcf50633_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
| 146 | 144 | ||
| 147 | rtc = dev_get_drvdata(dev); | 145 | rtc = dev_get_drvdata(dev); |
| 148 | 146 | ||
| 149 | dev_dbg(dev, "RTC_TIME: %u.%u.%u %u:%u:%u\n", | 147 | dev_dbg(dev, "RTC_TIME: %ptRr\n", tm); |
| 150 | tm->tm_mday, tm->tm_mon, tm->tm_year, | ||
| 151 | tm->tm_hour, tm->tm_min, tm->tm_sec); | ||
| 152 | 148 | ||
| 153 | rtc2pcf_time(&pcf_tm, tm); | 149 | rtc2pcf_time(&pcf_tm, tm); |
| 154 | 150 | ||
diff --git a/drivers/rtc/rtc-pcf8523.c b/drivers/rtc/rtc-pcf8523.c index 453615f8ac9a..3fcd2cbafc84 100644 --- a/drivers/rtc/rtc-pcf8523.c +++ b/drivers/rtc/rtc-pcf8523.c | |||
| @@ -85,6 +85,18 @@ static int pcf8523_write(struct i2c_client *client, u8 reg, u8 value) | |||
| 85 | return 0; | 85 | return 0; |
| 86 | } | 86 | } |
| 87 | 87 | ||
| 88 | static int pcf8523_voltage_low(struct i2c_client *client) | ||
| 89 | { | ||
| 90 | u8 value; | ||
| 91 | int err; | ||
| 92 | |||
| 93 | err = pcf8523_read(client, REG_CONTROL3, &value); | ||
| 94 | if (err < 0) | ||
| 95 | return err; | ||
| 96 | |||
| 97 | return !!(value & REG_CONTROL3_BLF); | ||
| 98 | } | ||
| 99 | |||
| 88 | static int pcf8523_select_capacitance(struct i2c_client *client, bool high) | 100 | static int pcf8523_select_capacitance(struct i2c_client *client, bool high) |
| 89 | { | 101 | { |
| 90 | u8 value; | 102 | u8 value; |
| @@ -167,6 +179,14 @@ static int pcf8523_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
| 167 | struct i2c_msg msgs[2]; | 179 | struct i2c_msg msgs[2]; |
| 168 | int err; | 180 | int err; |
| 169 | 181 | ||
| 182 | err = pcf8523_voltage_low(client); | ||
| 183 | if (err < 0) { | ||
| 184 | return err; | ||
| 185 | } else if (err > 0) { | ||
| 186 | dev_err(dev, "low voltage detected, time is unreliable\n"); | ||
| 187 | return -EINVAL; | ||
| 188 | } | ||
| 189 | |||
| 170 | msgs[0].addr = client->addr; | 190 | msgs[0].addr = client->addr; |
| 171 | msgs[0].flags = 0; | 191 | msgs[0].flags = 0; |
| 172 | msgs[0].len = 1; | 192 | msgs[0].len = 1; |
| @@ -251,17 +271,13 @@ static int pcf8523_rtc_ioctl(struct device *dev, unsigned int cmd, | |||
| 251 | unsigned long arg) | 271 | unsigned long arg) |
| 252 | { | 272 | { |
| 253 | struct i2c_client *client = to_i2c_client(dev); | 273 | struct i2c_client *client = to_i2c_client(dev); |
| 254 | u8 value; | 274 | int ret; |
| 255 | int ret = 0, err; | ||
| 256 | 275 | ||
| 257 | switch (cmd) { | 276 | switch (cmd) { |
| 258 | case RTC_VL_READ: | 277 | case RTC_VL_READ: |
| 259 | err = pcf8523_read(client, REG_CONTROL3, &value); | 278 | ret = pcf8523_voltage_low(client); |
| 260 | if (err < 0) | 279 | if (ret < 0) |
| 261 | return err; | 280 | return ret; |
| 262 | |||
| 263 | if (value & REG_CONTROL3_BLF) | ||
| 264 | ret = 1; | ||
| 265 | 281 | ||
| 266 | if (copy_to_user((void __user *)arg, &ret, sizeof(int))) | 282 | if (copy_to_user((void __user *)arg, &ret, sizeof(int))) |
| 267 | return -EFAULT; | 283 | return -EFAULT; |
diff --git a/drivers/rtc/rtc-pcf85363.c b/drivers/rtc/rtc-pcf85363.c index c04a1edcd571..a3988079f60a 100644 --- a/drivers/rtc/rtc-pcf85363.c +++ b/drivers/rtc/rtc-pcf85363.c | |||
| @@ -120,6 +120,11 @@ struct pcf85363 { | |||
| 120 | struct regmap *regmap; | 120 | struct regmap *regmap; |
| 121 | }; | 121 | }; |
| 122 | 122 | ||
| 123 | struct pcf85x63_config { | ||
| 124 | struct regmap_config regmap; | ||
| 125 | unsigned int num_nvram; | ||
| 126 | }; | ||
| 127 | |||
| 123 | static int pcf85363_rtc_read_time(struct device *dev, struct rtc_time *tm) | 128 | static int pcf85363_rtc_read_time(struct device *dev, struct rtc_time *tm) |
| 124 | { | 129 | { |
| 125 | struct pcf85363 *pcf85363 = dev_get_drvdata(dev); | 130 | struct pcf85363 *pcf85363 = dev_get_drvdata(dev); |
| @@ -311,25 +316,75 @@ static int pcf85363_nvram_write(void *priv, unsigned int offset, void *val, | |||
| 311 | val, bytes); | 316 | val, bytes); |
| 312 | } | 317 | } |
| 313 | 318 | ||
| 314 | static const struct regmap_config regmap_config = { | 319 | static int pcf85x63_nvram_read(void *priv, unsigned int offset, void *val, |
| 315 | .reg_bits = 8, | 320 | size_t bytes) |
| 316 | .val_bits = 8, | 321 | { |
| 317 | .max_register = 0x7f, | 322 | struct pcf85363 *pcf85363 = priv; |
| 323 | unsigned int tmp_val; | ||
| 324 | int ret; | ||
| 325 | |||
| 326 | ret = regmap_read(pcf85363->regmap, CTRL_RAMBYTE, &tmp_val); | ||
| 327 | (*(unsigned char *) val) = (unsigned char) tmp_val; | ||
| 328 | |||
| 329 | return ret; | ||
| 330 | } | ||
| 331 | |||
| 332 | static int pcf85x63_nvram_write(void *priv, unsigned int offset, void *val, | ||
| 333 | size_t bytes) | ||
| 334 | { | ||
| 335 | struct pcf85363 *pcf85363 = priv; | ||
| 336 | unsigned char tmp_val; | ||
| 337 | |||
| 338 | tmp_val = *((unsigned char *)val); | ||
| 339 | return regmap_write(pcf85363->regmap, CTRL_RAMBYTE, | ||
| 340 | (unsigned int)tmp_val); | ||
| 341 | } | ||
| 342 | |||
| 343 | static const struct pcf85x63_config pcf_85263_config = { | ||
| 344 | .regmap = { | ||
| 345 | .reg_bits = 8, | ||
| 346 | .val_bits = 8, | ||
| 347 | .max_register = 0x2f, | ||
| 348 | }, | ||
| 349 | .num_nvram = 1 | ||
| 350 | }; | ||
| 351 | |||
| 352 | static const struct pcf85x63_config pcf_85363_config = { | ||
| 353 | .regmap = { | ||
| 354 | .reg_bits = 8, | ||
| 355 | .val_bits = 8, | ||
| 356 | .max_register = 0x7f, | ||
| 357 | }, | ||
| 358 | .num_nvram = 2 | ||
| 318 | }; | 359 | }; |
| 319 | 360 | ||
| 320 | static int pcf85363_probe(struct i2c_client *client, | 361 | static int pcf85363_probe(struct i2c_client *client, |
| 321 | const struct i2c_device_id *id) | 362 | const struct i2c_device_id *id) |
| 322 | { | 363 | { |
| 323 | struct pcf85363 *pcf85363; | 364 | struct pcf85363 *pcf85363; |
| 324 | struct nvmem_config nvmem_cfg = { | 365 | const struct pcf85x63_config *config = &pcf_85363_config; |
| 325 | .name = "pcf85363-", | 366 | const void *data = of_device_get_match_data(&client->dev); |
| 326 | .word_size = 1, | 367 | static struct nvmem_config nvmem_cfg[] = { |
| 327 | .stride = 1, | 368 | { |
| 328 | .size = NVRAM_SIZE, | 369 | .name = "pcf85x63-", |
| 329 | .reg_read = pcf85363_nvram_read, | 370 | .word_size = 1, |
| 330 | .reg_write = pcf85363_nvram_write, | 371 | .stride = 1, |
| 372 | .size = 1, | ||
| 373 | .reg_read = pcf85x63_nvram_read, | ||
| 374 | .reg_write = pcf85x63_nvram_write, | ||
| 375 | }, { | ||
| 376 | .name = "pcf85363-", | ||
| 377 | .word_size = 1, | ||
| 378 | .stride = 1, | ||
| 379 | .size = NVRAM_SIZE, | ||
| 380 | .reg_read = pcf85363_nvram_read, | ||
| 381 | .reg_write = pcf85363_nvram_write, | ||
| 382 | }, | ||
| 331 | }; | 383 | }; |
| 332 | int ret; | 384 | int ret, i; |
| 385 | |||
| 386 | if (data) | ||
| 387 | config = data; | ||
| 333 | 388 | ||
| 334 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) | 389 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) |
| 335 | return -ENODEV; | 390 | return -ENODEV; |
| @@ -339,7 +394,7 @@ static int pcf85363_probe(struct i2c_client *client, | |||
| 339 | if (!pcf85363) | 394 | if (!pcf85363) |
| 340 | return -ENOMEM; | 395 | return -ENOMEM; |
| 341 | 396 | ||
| 342 | pcf85363->regmap = devm_regmap_init_i2c(client, ®map_config); | 397 | pcf85363->regmap = devm_regmap_init_i2c(client, &config->regmap); |
| 343 | if (IS_ERR(pcf85363->regmap)) { | 398 | if (IS_ERR(pcf85363->regmap)) { |
| 344 | dev_err(&client->dev, "regmap allocation failed\n"); | 399 | dev_err(&client->dev, "regmap allocation failed\n"); |
| 345 | return PTR_ERR(pcf85363->regmap); | 400 | return PTR_ERR(pcf85363->regmap); |
| @@ -370,15 +425,18 @@ static int pcf85363_probe(struct i2c_client *client, | |||
| 370 | 425 | ||
| 371 | ret = rtc_register_device(pcf85363->rtc); | 426 | ret = rtc_register_device(pcf85363->rtc); |
| 372 | 427 | ||
| 373 | nvmem_cfg.priv = pcf85363; | 428 | for (i = 0; i < config->num_nvram; i++) { |
| 374 | rtc_nvmem_register(pcf85363->rtc, &nvmem_cfg); | 429 | nvmem_cfg[i].priv = pcf85363; |
| 430 | rtc_nvmem_register(pcf85363->rtc, &nvmem_cfg[i]); | ||
| 431 | } | ||
| 375 | 432 | ||
| 376 | return ret; | 433 | return ret; |
| 377 | } | 434 | } |
| 378 | 435 | ||
| 379 | static const struct of_device_id dev_ids[] = { | 436 | static const struct of_device_id dev_ids[] = { |
| 380 | { .compatible = "nxp,pcf85363" }, | 437 | { .compatible = "nxp,pcf85263", .data = &pcf_85263_config }, |
| 381 | {} | 438 | { .compatible = "nxp,pcf85363", .data = &pcf_85363_config }, |
| 439 | { /* sentinel */ } | ||
| 382 | }; | 440 | }; |
| 383 | MODULE_DEVICE_TABLE(of, dev_ids); | 441 | MODULE_DEVICE_TABLE(of, dev_ids); |
| 384 | 442 | ||
| @@ -393,5 +451,5 @@ static struct i2c_driver pcf85363_driver = { | |||
| 393 | module_i2c_driver(pcf85363_driver); | 451 | module_i2c_driver(pcf85363_driver); |
| 394 | 452 | ||
| 395 | MODULE_AUTHOR("Eric Nelson"); | 453 | MODULE_AUTHOR("Eric Nelson"); |
| 396 | MODULE_DESCRIPTION("pcf85363 I2C RTC driver"); | 454 | MODULE_DESCRIPTION("pcf85263/pcf85363 I2C RTC driver"); |
| 397 | MODULE_LICENSE("GPL"); | 455 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/rtc/rtc-pic32.c b/drivers/rtc/rtc-pic32.c index 3c08eab4f1a8..d7ef0a6f8931 100644 --- a/drivers/rtc/rtc-pic32.c +++ b/drivers/rtc/rtc-pic32.c | |||
| @@ -170,9 +170,7 @@ static int pic32_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm) | |||
| 170 | 170 | ||
| 171 | rtc_tm->tm_year += 100; | 171 | rtc_tm->tm_year += 100; |
| 172 | 172 | ||
| 173 | dev_dbg(dev, "read time %04d.%02d.%02d %02d:%02d:%02d\n", | 173 | dev_dbg(dev, "read time %ptR\n", rtc_tm); |
| 174 | 1900 + rtc_tm->tm_year, rtc_tm->tm_mon, rtc_tm->tm_mday, | ||
| 175 | rtc_tm->tm_hour, rtc_tm->tm_min, rtc_tm->tm_sec); | ||
| 176 | 174 | ||
| 177 | clk_disable(pdata->clk); | 175 | clk_disable(pdata->clk); |
| 178 | return 0; | 176 | return 0; |
| @@ -184,9 +182,7 @@ static int pic32_rtc_settime(struct device *dev, struct rtc_time *tm) | |||
| 184 | void __iomem *base = pdata->reg_base; | 182 | void __iomem *base = pdata->reg_base; |
| 185 | int year = tm->tm_year - 100; | 183 | int year = tm->tm_year - 100; |
| 186 | 184 | ||
| 187 | dev_dbg(dev, "set time %04d.%02d.%02d %02d:%02d:%02d\n", | 185 | dev_dbg(dev, "set time %ptR\n", tm); |
| 188 | 1900 + tm->tm_year, tm->tm_mon, tm->tm_mday, | ||
| 189 | tm->tm_hour, tm->tm_min, tm->tm_sec); | ||
| 190 | 186 | ||
| 191 | if (year < 0 || year >= 100) { | 187 | if (year < 0 || year >= 100) { |
| 192 | dev_err(dev, "rtc only supports 100 years\n"); | 188 | dev_err(dev, "rtc only supports 100 years\n"); |
| @@ -224,10 +220,7 @@ static int pic32_rtc_getalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 224 | 220 | ||
| 225 | alrm->enabled = (alm_en & PIC32_RTCALRM_ALRMEN) ? 1 : 0; | 221 | alrm->enabled = (alm_en & PIC32_RTCALRM_ALRMEN) ? 1 : 0; |
| 226 | 222 | ||
| 227 | dev_dbg(dev, "getalarm: %d, %04d.%02d.%02d %02d:%02d:%02d\n", | 223 | dev_dbg(dev, "getalarm: %d, %ptR\n", alm_en, alm_tm); |
| 228 | alm_en, | ||
| 229 | 1900 + alm_tm->tm_year, alm_tm->tm_mon, alm_tm->tm_mday, | ||
| 230 | alm_tm->tm_hour, alm_tm->tm_min, alm_tm->tm_sec); | ||
| 231 | 224 | ||
| 232 | alm_tm->tm_sec = bcd2bin(alm_tm->tm_sec); | 225 | alm_tm->tm_sec = bcd2bin(alm_tm->tm_sec); |
| 233 | alm_tm->tm_min = bcd2bin(alm_tm->tm_min); | 226 | alm_tm->tm_min = bcd2bin(alm_tm->tm_min); |
| @@ -247,10 +240,7 @@ static int pic32_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 247 | void __iomem *base = pdata->reg_base; | 240 | void __iomem *base = pdata->reg_base; |
| 248 | 241 | ||
| 249 | clk_enable(pdata->clk); | 242 | clk_enable(pdata->clk); |
| 250 | dev_dbg(dev, "setalarm: %d, %04d.%02d.%02d %02d:%02d:%02d\n", | 243 | dev_dbg(dev, "setalarm: %d, %ptR\n", alrm->enabled, tm); |
| 251 | alrm->enabled, | ||
| 252 | 1900 + tm->tm_year, tm->tm_mon + 1, tm->tm_mday, | ||
| 253 | tm->tm_hour, tm->tm_min, tm->tm_sec); | ||
| 254 | 244 | ||
| 255 | writel(0x00, base + PIC32_ALRMTIME); | 245 | writel(0x00, base + PIC32_ALRMTIME); |
| 256 | writel(0x00, base + PIC32_ALRMDATE); | 246 | writel(0x00, base + PIC32_ALRMDATE); |
diff --git a/drivers/rtc/rtc-pm8xxx.c b/drivers/rtc/rtc-pm8xxx.c index 29358a045925..1074e3dbfc1d 100644 --- a/drivers/rtc/rtc-pm8xxx.c +++ b/drivers/rtc/rtc-pm8xxx.c | |||
| @@ -217,9 +217,7 @@ static int pm8xxx_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
| 217 | 217 | ||
| 218 | rtc_time_to_tm(secs, tm); | 218 | rtc_time_to_tm(secs, tm); |
| 219 | 219 | ||
| 220 | 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 == %ptRt, y-m-d = %ptRdr\n", secs, tm, tm); |
| 221 | secs, tm->tm_hour, tm->tm_min, tm->tm_sec, | ||
| 222 | tm->tm_mday, tm->tm_mon, tm->tm_year); | ||
| 223 | 221 | ||
| 224 | return 0; | 222 | return 0; |
| 225 | } | 223 | } |
| @@ -264,10 +262,8 @@ static int pm8xxx_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm) | |||
| 264 | goto rtc_rw_fail; | 262 | goto rtc_rw_fail; |
| 265 | } | 263 | } |
| 266 | 264 | ||
| 267 | dev_dbg(dev, "Alarm Set for h:r:s=%d:%d:%d, d/m/y=%d/%d/%d\n", | 265 | dev_dbg(dev, "Alarm Set for h:m:s=%ptRt, y-m-d=%ptRdr\n", |
| 268 | alarm->time.tm_hour, alarm->time.tm_min, | 266 | &alarm->time, &alarm->time); |
| 269 | alarm->time.tm_sec, alarm->time.tm_mday, | ||
| 270 | alarm->time.tm_mon, alarm->time.tm_year); | ||
| 271 | rtc_rw_fail: | 267 | rtc_rw_fail: |
| 272 | spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); | 268 | spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); |
| 273 | return rc; | 269 | return rc; |
| @@ -298,10 +294,8 @@ static int pm8xxx_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm) | |||
| 298 | return rc; | 294 | return rc; |
| 299 | } | 295 | } |
| 300 | 296 | ||
| 301 | dev_dbg(dev, "Alarm set for - h:r:s=%d:%d:%d, d/m/y=%d/%d/%d\n", | 297 | dev_dbg(dev, "Alarm set for - h:m:s=%ptRt, y-m-d=%ptRdr\n", |
| 302 | alarm->time.tm_hour, alarm->time.tm_min, | 298 | &alarm->time, &alarm->time); |
| 303 | alarm->time.tm_sec, alarm->time.tm_mday, | ||
| 304 | alarm->time.tm_mon, alarm->time.tm_year); | ||
| 305 | 299 | ||
| 306 | return 0; | 300 | return 0; |
| 307 | } | 301 | } |
diff --git a/drivers/rtc/rtc-puv3.c b/drivers/rtc/rtc-puv3.c index 9e83be32ff43..f77ef282f013 100644 --- a/drivers/rtc/rtc-puv3.c +++ b/drivers/rtc/rtc-puv3.c | |||
| @@ -90,9 +90,7 @@ static int puv3_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm) | |||
| 90 | { | 90 | { |
| 91 | rtc_time_to_tm(readl(RTC_RCNR), rtc_tm); | 91 | rtc_time_to_tm(readl(RTC_RCNR), rtc_tm); |
| 92 | 92 | ||
| 93 | dev_dbg(dev, "read time %02x.%02x.%02x %02x/%02x/%02x\n", | 93 | dev_dbg(dev, "read time %ptRr\n", rtc_tm); |
| 94 | rtc_tm->tm_year, rtc_tm->tm_mon, rtc_tm->tm_mday, | ||
| 95 | rtc_tm->tm_hour, rtc_tm->tm_min, rtc_tm->tm_sec); | ||
| 96 | 94 | ||
| 97 | return 0; | 95 | return 0; |
| 98 | } | 96 | } |
| @@ -101,9 +99,7 @@ static int puv3_rtc_settime(struct device *dev, struct rtc_time *tm) | |||
| 101 | { | 99 | { |
| 102 | unsigned long rtc_count = 0; | 100 | unsigned long rtc_count = 0; |
| 103 | 101 | ||
| 104 | dev_dbg(dev, "set time %02d.%02d.%02d %02d/%02d/%02d\n", | 102 | dev_dbg(dev, "set time %ptRr\n", tm); |
| 105 | tm->tm_year, tm->tm_mon, tm->tm_mday, | ||
| 106 | tm->tm_hour, tm->tm_min, tm->tm_sec); | ||
| 107 | 103 | ||
| 108 | rtc_tm_to_time(tm, &rtc_count); | 104 | rtc_tm_to_time(tm, &rtc_count); |
| 109 | writel(rtc_count, RTC_RCNR); | 105 | writel(rtc_count, RTC_RCNR); |
| @@ -119,10 +115,7 @@ static int puv3_rtc_getalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 119 | 115 | ||
| 120 | alrm->enabled = readl(RTC_RTSR) & RTC_RTSR_ALE; | 116 | alrm->enabled = readl(RTC_RTSR) & RTC_RTSR_ALE; |
| 121 | 117 | ||
| 122 | dev_dbg(dev, "read alarm %02x %02x.%02x.%02x %02x/%02x/%02x\n", | 118 | dev_dbg(dev, "read alarm: %d, %ptRr\n", alrm->enabled, alm_tm); |
| 123 | alrm->enabled, | ||
| 124 | alm_tm->tm_year, alm_tm->tm_mon, alm_tm->tm_mday, | ||
| 125 | alm_tm->tm_hour, alm_tm->tm_min, alm_tm->tm_sec); | ||
| 126 | 119 | ||
| 127 | return 0; | 120 | return 0; |
| 128 | } | 121 | } |
| @@ -132,10 +125,7 @@ static int puv3_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 132 | struct rtc_time *tm = &alrm->time; | 125 | struct rtc_time *tm = &alrm->time; |
| 133 | unsigned long rtcalarm_count = 0; | 126 | unsigned long rtcalarm_count = 0; |
| 134 | 127 | ||
| 135 | dev_dbg(dev, "puv3_rtc_setalarm: %d, %02x/%02x/%02x %02x.%02x.%02x\n", | 128 | dev_dbg(dev, "set alarm: %d, %ptRr\n", alrm->enabled, tm); |
| 136 | alrm->enabled, | ||
| 137 | tm->tm_mday & 0xff, tm->tm_mon & 0xff, tm->tm_year & 0xff, | ||
| 138 | tm->tm_hour & 0xff, tm->tm_min & 0xff, tm->tm_sec); | ||
| 139 | 129 | ||
| 140 | rtc_tm_to_time(tm, &rtcalarm_count); | 130 | rtc_tm_to_time(tm, &rtcalarm_count); |
| 141 | writel(rtcalarm_count, RTC_RTAR); | 131 | writel(rtcalarm_count, RTC_RTAR); |
diff --git a/drivers/rtc/rtc-rk808.c b/drivers/rtc/rtc-rk808.c index 739c0d42e835..1fb864d4ef83 100644 --- a/drivers/rtc/rtc-rk808.c +++ b/drivers/rtc/rtc-rk808.c | |||
| @@ -138,9 +138,7 @@ static int rk808_rtc_readtime(struct device *dev, struct rtc_time *tm) | |||
| 138 | tm->tm_year = (bcd2bin(rtc_data[5] & YEARS_REG_MSK)) + 100; | 138 | tm->tm_year = (bcd2bin(rtc_data[5] & YEARS_REG_MSK)) + 100; |
| 139 | tm->tm_wday = bcd2bin(rtc_data[6] & WEEKS_REG_MSK); | 139 | tm->tm_wday = bcd2bin(rtc_data[6] & WEEKS_REG_MSK); |
| 140 | rockchip_to_gregorian(tm); | 140 | rockchip_to_gregorian(tm); |
| 141 | dev_dbg(dev, "RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n", | 141 | dev_dbg(dev, "RTC date/time %ptRd(%d) %ptRt\n", tm, tm->tm_wday, tm); |
| 142 | 1900 + tm->tm_year, tm->tm_mon + 1, tm->tm_mday, | ||
| 143 | tm->tm_wday, tm->tm_hour, tm->tm_min, tm->tm_sec); | ||
| 144 | 142 | ||
| 145 | return ret; | 143 | return ret; |
| 146 | } | 144 | } |
| @@ -153,9 +151,7 @@ static int rk808_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
| 153 | u8 rtc_data[NUM_TIME_REGS]; | 151 | u8 rtc_data[NUM_TIME_REGS]; |
| 154 | int ret; | 152 | int ret; |
| 155 | 153 | ||
| 156 | dev_dbg(dev, "set RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n", | 154 | dev_dbg(dev, "set RTC date/time %ptRd(%d) %ptRt\n", tm, tm->tm_wday, tm); |
| 157 | 1900 + tm->tm_year, tm->tm_mon + 1, tm->tm_mday, | ||
| 158 | tm->tm_wday, tm->tm_hour, tm->tm_min, tm->tm_sec); | ||
| 159 | gregorian_to_rockchip(tm); | 155 | gregorian_to_rockchip(tm); |
| 160 | rtc_data[0] = bin2bcd(tm->tm_sec); | 156 | rtc_data[0] = bin2bcd(tm->tm_sec); |
| 161 | rtc_data[1] = bin2bcd(tm->tm_min); | 157 | rtc_data[1] = bin2bcd(tm->tm_min); |
| @@ -216,10 +212,8 @@ static int rk808_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 216 | return ret; | 212 | return ret; |
| 217 | } | 213 | } |
| 218 | 214 | ||
| 219 | dev_dbg(dev, "alrm read RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n", | 215 | dev_dbg(dev, "alrm read RTC date/time %ptRd(%d) %ptRt\n", |
| 220 | 1900 + alrm->time.tm_year, alrm->time.tm_mon + 1, | 216 | &alrm->time, alrm->time.tm_wday, &alrm->time); |
| 221 | alrm->time.tm_mday, alrm->time.tm_wday, alrm->time.tm_hour, | ||
| 222 | alrm->time.tm_min, alrm->time.tm_sec); | ||
| 223 | 217 | ||
| 224 | alrm->enabled = (int_reg & BIT_RTC_INTERRUPTS_REG_IT_ALARM_M) ? 1 : 0; | 218 | alrm->enabled = (int_reg & BIT_RTC_INTERRUPTS_REG_IT_ALARM_M) ? 1 : 0; |
| 225 | 219 | ||
| @@ -261,10 +255,8 @@ static int rk808_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 261 | dev_err(dev, "Failed to stop alarm: %d\n", ret); | 255 | dev_err(dev, "Failed to stop alarm: %d\n", ret); |
| 262 | return ret; | 256 | return ret; |
| 263 | } | 257 | } |
| 264 | dev_dbg(dev, "alrm set RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n", | 258 | dev_dbg(dev, "alrm set RTC date/time %ptRd(%d) %ptRt\n", |
| 265 | 1900 + alrm->time.tm_year, alrm->time.tm_mon + 1, | 259 | &alrm->time, alrm->time.tm_wday, &alrm->time); |
| 266 | alrm->time.tm_mday, alrm->time.tm_wday, alrm->time.tm_hour, | ||
| 267 | alrm->time.tm_min, alrm->time.tm_sec); | ||
| 268 | 260 | ||
| 269 | gregorian_to_rockchip(&alrm->time); | 261 | gregorian_to_rockchip(&alrm->time); |
| 270 | alrm_data[0] = bin2bcd(alrm->time.tm_sec); | 262 | alrm_data[0] = bin2bcd(alrm->time.tm_sec); |
| @@ -400,7 +392,7 @@ static int rk808_rtc_probe(struct platform_device *pdev) | |||
| 400 | if (ret) { | 392 | if (ret) { |
| 401 | dev_err(&pdev->dev, | 393 | dev_err(&pdev->dev, |
| 402 | "Failed to write RTC status: %d\n", ret); | 394 | "Failed to write RTC status: %d\n", ret); |
| 403 | return ret; | 395 | return ret; |
| 404 | } | 396 | } |
| 405 | 397 | ||
| 406 | device_init_wakeup(&pdev->dev, 1); | 398 | device_init_wakeup(&pdev->dev, 1); |
diff --git a/drivers/rtc/rtc-rx6110.c b/drivers/rtc/rtc-rx6110.c index 8e322d884cc2..5899ca368d59 100644 --- a/drivers/rtc/rtc-rx6110.c +++ b/drivers/rtc/rtc-rx6110.c | |||
| @@ -114,9 +114,7 @@ struct rx6110_data { | |||
| 114 | */ | 114 | */ |
| 115 | static int rx6110_rtc_tm_to_data(struct rtc_time *tm, u8 *data) | 115 | static int rx6110_rtc_tm_to_data(struct rtc_time *tm, u8 *data) |
| 116 | { | 116 | { |
| 117 | pr_debug("%s: date %ds %dm %dh %dmd %dm %dy\n", __func__, | 117 | pr_debug("%s: date %ptRr\n", __func__, tm); |
| 118 | tm->tm_sec, tm->tm_min, tm->tm_hour, | ||
| 119 | tm->tm_mday, tm->tm_mon, tm->tm_year); | ||
| 120 | 118 | ||
| 121 | /* | 119 | /* |
| 122 | * The year in the RTC is a value between 0 and 99. | 120 | * The year in the RTC is a value between 0 and 99. |
| @@ -154,9 +152,7 @@ static int rx6110_data_to_rtc_tm(u8 *data, struct rtc_time *tm) | |||
| 154 | tm->tm_mon = bcd2bin(data[RTC_MONTH] & 0x1f) - 1; | 152 | tm->tm_mon = bcd2bin(data[RTC_MONTH] & 0x1f) - 1; |
| 155 | tm->tm_year = bcd2bin(data[RTC_YEAR]) + 100; | 153 | tm->tm_year = bcd2bin(data[RTC_YEAR]) + 100; |
| 156 | 154 | ||
| 157 | pr_debug("%s: date %ds %dm %dh %dmd %dm %dy\n", __func__, | 155 | pr_debug("%s: date %ptRr\n", __func__, tm); |
| 158 | tm->tm_sec, tm->tm_min, tm->tm_hour, | ||
| 159 | tm->tm_mday, tm->tm_mon, tm->tm_year); | ||
| 160 | 156 | ||
| 161 | /* | 157 | /* |
| 162 | * The year in the RTC is a value between 0 and 99. | 158 | * The year in the RTC is a value between 0 and 99. |
| @@ -248,9 +244,7 @@ static int rx6110_get_time(struct device *dev, struct rtc_time *tm) | |||
| 248 | if (ret) | 244 | if (ret) |
| 249 | return ret; | 245 | return ret; |
| 250 | 246 | ||
| 251 | dev_dbg(dev, "%s: date %ds %dm %dh %dmd %dm %dy\n", __func__, | 247 | dev_dbg(dev, "%s: date %ptRr\n", __func__, tm); |
| 252 | tm->tm_sec, tm->tm_min, tm->tm_hour, | ||
| 253 | tm->tm_mday, tm->tm_mon, tm->tm_year); | ||
| 254 | 248 | ||
| 255 | return 0; | 249 | return 0; |
| 256 | } | 250 | } |
diff --git a/drivers/rtc/rtc-rx8025.c b/drivers/rtc/rtc-rx8025.c index 41127adf5765..41de38acc570 100644 --- a/drivers/rtc/rtc-rx8025.c +++ b/drivers/rtc/rtc-rx8025.c | |||
| @@ -193,10 +193,7 @@ static int rx8025_get_time(struct device *dev, struct rtc_time *dt) | |||
| 193 | if (err) | 193 | if (err) |
| 194 | return err; | 194 | return err; |
| 195 | 195 | ||
| 196 | dev_dbg(dev, "%s: read 0x%02x 0x%02x " | 196 | dev_dbg(dev, "%s: read %7ph\n", __func__, date); |
| 197 | "0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", __func__, | ||
| 198 | date[0], date[1], date[2], date[3], date[4], | ||
| 199 | date[5], date[6]); | ||
| 200 | 197 | ||
| 201 | dt->tm_sec = bcd2bin(date[RX8025_REG_SEC] & 0x7f); | 198 | dt->tm_sec = bcd2bin(date[RX8025_REG_SEC] & 0x7f); |
| 202 | dt->tm_min = bcd2bin(date[RX8025_REG_MIN] & 0x7f); | 199 | dt->tm_min = bcd2bin(date[RX8025_REG_MIN] & 0x7f); |
| @@ -210,9 +207,7 @@ static int rx8025_get_time(struct device *dev, struct rtc_time *dt) | |||
| 210 | dt->tm_mon = bcd2bin(date[RX8025_REG_MONTH] & 0x1f) - 1; | 207 | dt->tm_mon = bcd2bin(date[RX8025_REG_MONTH] & 0x1f) - 1; |
| 211 | dt->tm_year = bcd2bin(date[RX8025_REG_YEAR]) + 100; | 208 | dt->tm_year = bcd2bin(date[RX8025_REG_YEAR]) + 100; |
| 212 | 209 | ||
| 213 | dev_dbg(dev, "%s: date %ds %dm %dh %dmd %dm %dy\n", __func__, | 210 | dev_dbg(dev, "%s: date %ptRr\n", __func__, dt); |
| 214 | dt->tm_sec, dt->tm_min, dt->tm_hour, | ||
| 215 | dt->tm_mday, dt->tm_mon, dt->tm_year); | ||
| 216 | 211 | ||
| 217 | return 0; | 212 | return 0; |
| 218 | } | 213 | } |
| @@ -243,10 +238,7 @@ static int rx8025_set_time(struct device *dev, struct rtc_time *dt) | |||
| 243 | date[RX8025_REG_MONTH] = bin2bcd(dt->tm_mon + 1); | 238 | date[RX8025_REG_MONTH] = bin2bcd(dt->tm_mon + 1); |
| 244 | date[RX8025_REG_YEAR] = bin2bcd(dt->tm_year - 100); | 239 | date[RX8025_REG_YEAR] = bin2bcd(dt->tm_year - 100); |
| 245 | 240 | ||
| 246 | dev_dbg(dev, | 241 | dev_dbg(dev, "%s: write %7ph\n", __func__, date); |
| 247 | "%s: write 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", | ||
| 248 | __func__, | ||
| 249 | date[0], date[1], date[2], date[3], date[4], date[5], date[6]); | ||
| 250 | 242 | ||
| 251 | ret = rx8025_write_regs(rx8025->client, RX8025_REG_SEC, 7, date); | 243 | ret = rx8025_write_regs(rx8025->client, RX8025_REG_SEC, 7, date); |
| 252 | if (ret < 0) | 244 | if (ret < 0) |
| @@ -319,10 +311,7 @@ static int rx8025_read_alarm(struct device *dev, struct rtc_wkalrm *t) | |||
| 319 | t->time.tm_hour = bcd2bin(ald[1] & 0x1f) % 12 | 311 | t->time.tm_hour = bcd2bin(ald[1] & 0x1f) % 12 |
| 320 | + (ald[1] & 0x20 ? 12 : 0); | 312 | + (ald[1] & 0x20 ? 12 : 0); |
| 321 | 313 | ||
| 322 | dev_dbg(dev, "%s: date: %ds %dm %dh %dmd %dm %dy\n", | 314 | dev_dbg(dev, "%s: date: %ptRr\n", __func__, t); |
| 323 | __func__, | ||
| 324 | t->time.tm_sec, t->time.tm_min, t->time.tm_hour, | ||
| 325 | t->time.tm_mday, t->time.tm_mon, t->time.tm_year); | ||
| 326 | t->enabled = !!(rx8025->ctrl1 & RX8025_BIT_CTRL1_DALE); | 315 | t->enabled = !!(rx8025->ctrl1 & RX8025_BIT_CTRL1_DALE); |
| 327 | t->pending = (ctrl2 & RX8025_BIT_CTRL2_DAFG) && t->enabled; | 316 | t->pending = (ctrl2 & RX8025_BIT_CTRL2_DAFG) && t->enabled; |
| 328 | 317 | ||
diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c index 75c8c5033e08..04c68178c42d 100644 --- a/drivers/rtc/rtc-s3c.c +++ b/drivers/rtc/rtc-s3c.c | |||
| @@ -225,13 +225,9 @@ retry_get_time: | |||
| 225 | s3c_rtc_disable_clk(info); | 225 | s3c_rtc_disable_clk(info); |
| 226 | 226 | ||
| 227 | rtc_tm->tm_year += 100; | 227 | rtc_tm->tm_year += 100; |
| 228 | |||
| 229 | dev_dbg(dev, "read time %04d.%02d.%02d %02d:%02d:%02d\n", | ||
| 230 | 1900 + rtc_tm->tm_year, rtc_tm->tm_mon, rtc_tm->tm_mday, | ||
| 231 | rtc_tm->tm_hour, rtc_tm->tm_min, rtc_tm->tm_sec); | ||
| 232 | |||
| 233 | rtc_tm->tm_mon -= 1; | 228 | rtc_tm->tm_mon -= 1; |
| 234 | 229 | ||
| 230 | dev_dbg(dev, "read time %ptR\n", rtc_tm); | ||
| 235 | return 0; | 231 | return 0; |
| 236 | } | 232 | } |
| 237 | 233 | ||
| @@ -241,9 +237,7 @@ static int s3c_rtc_settime(struct device *dev, struct rtc_time *tm) | |||
| 241 | int year = tm->tm_year - 100; | 237 | int year = tm->tm_year - 100; |
| 242 | int ret; | 238 | int ret; |
| 243 | 239 | ||
| 244 | dev_dbg(dev, "set time %04d.%02d.%02d %02d:%02d:%02d\n", | 240 | dev_dbg(dev, "set time %ptR\n", tm); |
| 245 | 1900 + tm->tm_year, tm->tm_mon, tm->tm_mday, | ||
| 246 | tm->tm_hour, tm->tm_min, tm->tm_sec); | ||
| 247 | 241 | ||
| 248 | /* we get around y2k by simply not supporting it */ | 242 | /* we get around y2k by simply not supporting it */ |
| 249 | 243 | ||
| @@ -292,10 +286,7 @@ static int s3c_rtc_getalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 292 | 286 | ||
| 293 | alrm->enabled = (alm_en & S3C2410_RTCALM_ALMEN) ? 1 : 0; | 287 | alrm->enabled = (alm_en & S3C2410_RTCALM_ALMEN) ? 1 : 0; |
| 294 | 288 | ||
| 295 | dev_dbg(dev, "read alarm %d, %04d.%02d.%02d %02d:%02d:%02d\n", | 289 | dev_dbg(dev, "read alarm %d, %ptR\n", alm_en, alm_tm); |
| 296 | alm_en, | ||
| 297 | 1900 + alm_tm->tm_year, alm_tm->tm_mon, alm_tm->tm_mday, | ||
| 298 | alm_tm->tm_hour, alm_tm->tm_min, alm_tm->tm_sec); | ||
| 299 | 290 | ||
| 300 | /* decode the alarm enable field */ | 291 | /* decode the alarm enable field */ |
| 301 | if (alm_en & S3C2410_RTCALM_SECEN) | 292 | if (alm_en & S3C2410_RTCALM_SECEN) |
| @@ -327,12 +318,8 @@ static int s3c_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 327 | struct rtc_time *tm = &alrm->time; | 318 | struct rtc_time *tm = &alrm->time; |
| 328 | unsigned int alrm_en; | 319 | unsigned int alrm_en; |
| 329 | int ret; | 320 | int ret; |
| 330 | int year = tm->tm_year - 100; | ||
| 331 | 321 | ||
| 332 | dev_dbg(dev, "s3c_rtc_setalarm: %d, %04d.%02d.%02d %02d:%02d:%02d\n", | 322 | dev_dbg(dev, "s3c_rtc_setalarm: %d, %ptR\n", alrm->enabled, tm); |
| 333 | alrm->enabled, | ||
| 334 | 1900 + tm->tm_year, tm->tm_mon + 1, tm->tm_mday, | ||
| 335 | tm->tm_hour, tm->tm_min, tm->tm_sec); | ||
| 336 | 323 | ||
| 337 | ret = s3c_rtc_enable_clk(info); | 324 | ret = s3c_rtc_enable_clk(info); |
| 338 | if (ret) | 325 | if (ret) |
| @@ -356,11 +343,6 @@ static int s3c_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 356 | writeb(bin2bcd(tm->tm_hour), info->base + S3C2410_ALMHOUR); | 343 | writeb(bin2bcd(tm->tm_hour), info->base + S3C2410_ALMHOUR); |
| 357 | } | 344 | } |
| 358 | 345 | ||
| 359 | if (year < 100 && year >= 0) { | ||
| 360 | alrm_en |= S3C2410_RTCALM_YEAREN; | ||
| 361 | writeb(bin2bcd(year), info->base + S3C2410_ALMYEAR); | ||
| 362 | } | ||
| 363 | |||
| 364 | if (tm->tm_mon < 12 && tm->tm_mon >= 0) { | 346 | if (tm->tm_mon < 12 && tm->tm_mon >= 0) { |
| 365 | alrm_en |= S3C2410_RTCALM_MONEN; | 347 | alrm_en |= S3C2410_RTCALM_MONEN; |
| 366 | writeb(bin2bcd(tm->tm_mon + 1), info->base + S3C2410_ALMMON); | 348 | writeb(bin2bcd(tm->tm_mon + 1), info->base + S3C2410_ALMMON); |
diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c index 6495f84f7428..c7f1bf823ea0 100644 --- a/drivers/rtc/rtc-s5m.c +++ b/drivers/rtc/rtc-s5m.c | |||
| @@ -406,9 +406,7 @@ static int s5m_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
| 406 | return -EINVAL; | 406 | return -EINVAL; |
| 407 | } | 407 | } |
| 408 | 408 | ||
| 409 | dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__, | 409 | dev_dbg(dev, "%s: %ptR(%d)\n", __func__, tm, tm->tm_wday); |
| 410 | 1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday, | ||
| 411 | tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_wday); | ||
| 412 | 410 | ||
| 413 | return 0; | 411 | return 0; |
| 414 | } | 412 | } |
| @@ -436,9 +434,7 @@ static int s5m_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
| 436 | if (ret < 0) | 434 | if (ret < 0) |
| 437 | return ret; | 435 | return ret; |
| 438 | 436 | ||
| 439 | dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__, | 437 | dev_dbg(dev, "%s: %ptR(%d)\n", __func__, tm, tm->tm_wday); |
| 440 | 1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday, | ||
| 441 | tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_wday); | ||
| 442 | 438 | ||
| 443 | ret = regmap_raw_write(info->regmap, info->regs->time, data, | 439 | ret = regmap_raw_write(info->regmap, info->regs->time, data, |
| 444 | info->regs->regs_count); | 440 | info->regs->regs_count); |
| @@ -490,11 +486,7 @@ static int s5m_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 490 | return -EINVAL; | 486 | return -EINVAL; |
| 491 | } | 487 | } |
| 492 | 488 | ||
| 493 | dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__, | 489 | dev_dbg(dev, "%s: %ptR(%d)\n", __func__, &alrm->time, alrm->time.tm_wday); |
| 494 | 1900 + alrm->time.tm_year, 1 + alrm->time.tm_mon, | ||
| 495 | alrm->time.tm_mday, alrm->time.tm_hour, | ||
| 496 | alrm->time.tm_min, alrm->time.tm_sec, | ||
| 497 | alrm->time.tm_wday); | ||
| 498 | 490 | ||
| 499 | ret = s5m_check_peding_alarm_interrupt(info, alrm); | 491 | ret = s5m_check_peding_alarm_interrupt(info, alrm); |
| 500 | 492 | ||
| @@ -513,9 +505,7 @@ static int s5m_rtc_stop_alarm(struct s5m_rtc_info *info) | |||
| 513 | return ret; | 505 | return ret; |
| 514 | 506 | ||
| 515 | s5m8767_data_to_tm(data, &tm, info->rtc_24hr_mode); | 507 | s5m8767_data_to_tm(data, &tm, info->rtc_24hr_mode); |
| 516 | dev_dbg(info->dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__, | 508 | dev_dbg(info->dev, "%s: %ptR(%d)\n", __func__, &tm, tm.tm_wday); |
| 517 | 1900 + tm.tm_year, 1 + tm.tm_mon, tm.tm_mday, | ||
| 518 | tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_wday); | ||
| 519 | 509 | ||
| 520 | switch (info->device_type) { | 510 | switch (info->device_type) { |
| 521 | case S5M8763X: | 511 | case S5M8763X: |
| @@ -558,9 +548,7 @@ static int s5m_rtc_start_alarm(struct s5m_rtc_info *info) | |||
| 558 | return ret; | 548 | return ret; |
| 559 | 549 | ||
| 560 | s5m8767_data_to_tm(data, &tm, info->rtc_24hr_mode); | 550 | s5m8767_data_to_tm(data, &tm, info->rtc_24hr_mode); |
| 561 | dev_dbg(info->dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__, | 551 | dev_dbg(info->dev, "%s: %ptR(%d)\n", __func__, &tm, tm.tm_wday); |
| 562 | 1900 + tm.tm_year, 1 + tm.tm_mon, tm.tm_mday, | ||
| 563 | tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_wday); | ||
| 564 | 552 | ||
| 565 | switch (info->device_type) { | 553 | switch (info->device_type) { |
| 566 | case S5M8763X: | 554 | case S5M8763X: |
| @@ -620,10 +608,7 @@ static int s5m_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 620 | return -EINVAL; | 608 | return -EINVAL; |
| 621 | } | 609 | } |
| 622 | 610 | ||
| 623 | dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__, | 611 | dev_dbg(dev, "%s: %ptR(%d)\n", __func__, &alrm->time, alrm->time.tm_wday); |
| 624 | 1900 + alrm->time.tm_year, 1 + alrm->time.tm_mon, | ||
| 625 | alrm->time.tm_mday, alrm->time.tm_hour, alrm->time.tm_min, | ||
| 626 | alrm->time.tm_sec, alrm->time.tm_wday); | ||
| 627 | 612 | ||
| 628 | ret = s5m_rtc_stop_alarm(info); | 613 | ret = s5m_rtc_stop_alarm(info); |
| 629 | if (ret < 0) | 614 | if (ret < 0) |
diff --git a/drivers/rtc/rtc-sh.c b/drivers/rtc/rtc-sh.c index 51ba414798a8..d417b203cbc5 100644 --- a/drivers/rtc/rtc-sh.c +++ b/drivers/rtc/rtc-sh.c | |||
| @@ -1,3 +1,4 @@ | |||
| 1 | // SPDX-License-Identifier: GPL-2.0 | ||
| 1 | /* | 2 | /* |
| 2 | * SuperH On-Chip RTC Support | 3 | * SuperH On-Chip RTC Support |
| 3 | * | 4 | * |
| @@ -9,10 +10,6 @@ | |||
| 9 | * | 10 | * |
| 10 | * Copyright (C) 2000 Philipp Rumpf <prumpf@tux.org> | 11 | * Copyright (C) 2000 Philipp Rumpf <prumpf@tux.org> |
| 11 | * Copyright (C) 1999 Tetsuya Okada & Niibe Yutaka | 12 | * Copyright (C) 1999 Tetsuya Okada & Niibe Yutaka |
| 12 | * | ||
| 13 | * This file is subject to the terms and conditions of the GNU General Public | ||
| 14 | * License. See the file "COPYING" in the main directory of this archive | ||
| 15 | * for more details. | ||
| 16 | */ | 13 | */ |
| 17 | #include <linux/module.h> | 14 | #include <linux/module.h> |
| 18 | #include <linux/mod_devicetable.h> | 15 | #include <linux/mod_devicetable.h> |
| @@ -681,5 +678,5 @@ MODULE_DESCRIPTION("SuperH on-chip RTC driver"); | |||
| 681 | MODULE_AUTHOR("Paul Mundt <lethal@linux-sh.org>, " | 678 | MODULE_AUTHOR("Paul Mundt <lethal@linux-sh.org>, " |
| 682 | "Jamie Lenehan <lenehan@twibble.org>, " | 679 | "Jamie Lenehan <lenehan@twibble.org>, " |
| 683 | "Angelo Castello <angelo.castello@st.com>"); | 680 | "Angelo Castello <angelo.castello@st.com>"); |
| 684 | MODULE_LICENSE("GPL"); | 681 | MODULE_LICENSE("GPL v2"); |
| 685 | MODULE_ALIAS("platform:" DRV_NAME); | 682 | MODULE_ALIAS("platform:" DRV_NAME); |
diff --git a/drivers/rtc/rtc-sun6i.c b/drivers/rtc/rtc-sun6i.c index fe07310952df..11f56de52179 100644 --- a/drivers/rtc/rtc-sun6i.c +++ b/drivers/rtc/rtc-sun6i.c | |||
| @@ -118,9 +118,31 @@ | |||
| 118 | #define SUN6I_YEAR_MAX 2033 | 118 | #define SUN6I_YEAR_MAX 2033 |
| 119 | #define SUN6I_YEAR_OFF (SUN6I_YEAR_MIN - 1900) | 119 | #define SUN6I_YEAR_OFF (SUN6I_YEAR_MIN - 1900) |
| 120 | 120 | ||
| 121 | /* | ||
| 122 | * There are other differences between models, including: | ||
| 123 | * | ||
| 124 | * - number of GPIO pins that can be configured to hold a certain level | ||
| 125 | * - crypto-key related registers (H5, H6) | ||
| 126 | * - boot process related (super standby, secondary processor entry address) | ||
| 127 | * registers (R40, H6) | ||
| 128 | * - SYS power domain controls (R40) | ||
| 129 | * - DCXO controls (H6) | ||
| 130 | * - RC oscillator calibration (H6) | ||
| 131 | * | ||
| 132 | * These functions are not covered by this driver. | ||
| 133 | */ | ||
| 134 | struct sun6i_rtc_clk_data { | ||
| 135 | unsigned long rc_osc_rate; | ||
| 136 | unsigned int fixed_prescaler : 16; | ||
| 137 | unsigned int has_prescaler : 1; | ||
| 138 | unsigned int has_out_clk : 1; | ||
| 139 | unsigned int export_iosc : 1; | ||
| 140 | }; | ||
| 141 | |||
| 121 | struct sun6i_rtc_dev { | 142 | struct sun6i_rtc_dev { |
| 122 | struct rtc_device *rtc; | 143 | struct rtc_device *rtc; |
| 123 | struct device *dev; | 144 | struct device *dev; |
| 145 | const struct sun6i_rtc_clk_data *data; | ||
| 124 | void __iomem *base; | 146 | void __iomem *base; |
| 125 | int irq; | 147 | int irq; |
| 126 | unsigned long alarm; | 148 | unsigned long alarm; |
| @@ -139,14 +161,19 @@ static unsigned long sun6i_rtc_osc_recalc_rate(struct clk_hw *hw, | |||
| 139 | unsigned long parent_rate) | 161 | unsigned long parent_rate) |
| 140 | { | 162 | { |
| 141 | struct sun6i_rtc_dev *rtc = container_of(hw, struct sun6i_rtc_dev, hw); | 163 | struct sun6i_rtc_dev *rtc = container_of(hw, struct sun6i_rtc_dev, hw); |
| 142 | u32 val; | 164 | u32 val = 0; |
| 143 | 165 | ||
| 144 | val = readl(rtc->base + SUN6I_LOSC_CTRL); | 166 | val = readl(rtc->base + SUN6I_LOSC_CTRL); |
| 145 | if (val & SUN6I_LOSC_CTRL_EXT_OSC) | 167 | if (val & SUN6I_LOSC_CTRL_EXT_OSC) |
| 146 | return parent_rate; | 168 | return parent_rate; |
| 147 | 169 | ||
| 148 | val = readl(rtc->base + SUN6I_LOSC_CLK_PRESCAL); | 170 | if (rtc->data->fixed_prescaler) |
| 149 | val &= GENMASK(4, 0); | 171 | parent_rate /= rtc->data->fixed_prescaler; |
| 172 | |||
| 173 | if (rtc->data->has_prescaler) { | ||
| 174 | val = readl(rtc->base + SUN6I_LOSC_CLK_PRESCAL); | ||
| 175 | val &= GENMASK(4, 0); | ||
| 176 | } | ||
| 150 | 177 | ||
| 151 | return parent_rate / (val + 1); | 178 | return parent_rate / (val + 1); |
| 152 | } | 179 | } |
| @@ -185,13 +212,16 @@ static const struct clk_ops sun6i_rtc_osc_ops = { | |||
| 185 | .set_parent = sun6i_rtc_osc_set_parent, | 212 | .set_parent = sun6i_rtc_osc_set_parent, |
| 186 | }; | 213 | }; |
| 187 | 214 | ||
| 188 | static void __init sun6i_rtc_clk_init(struct device_node *node) | 215 | static void __init sun6i_rtc_clk_init(struct device_node *node, |
| 216 | const struct sun6i_rtc_clk_data *data) | ||
| 189 | { | 217 | { |
| 190 | struct clk_hw_onecell_data *clk_data; | 218 | struct clk_hw_onecell_data *clk_data; |
| 191 | struct sun6i_rtc_dev *rtc; | 219 | struct sun6i_rtc_dev *rtc; |
| 192 | struct clk_init_data init = { | 220 | struct clk_init_data init = { |
| 193 | .ops = &sun6i_rtc_osc_ops, | 221 | .ops = &sun6i_rtc_osc_ops, |
| 222 | .name = "losc", | ||
| 194 | }; | 223 | }; |
| 224 | const char *iosc_name = "rtc-int-osc"; | ||
| 195 | const char *clkout_name = "osc32k-out"; | 225 | const char *clkout_name = "osc32k-out"; |
| 196 | const char *parents[2]; | 226 | const char *parents[2]; |
| 197 | 227 | ||
| @@ -199,7 +229,8 @@ static void __init sun6i_rtc_clk_init(struct device_node *node) | |||
| 199 | if (!rtc) | 229 | if (!rtc) |
| 200 | return; | 230 | return; |
| 201 | 231 | ||
| 202 | clk_data = kzalloc(struct_size(clk_data, hws, 2), GFP_KERNEL); | 232 | rtc->data = data; |
| 233 | clk_data = kzalloc(struct_size(clk_data, hws, 3), GFP_KERNEL); | ||
| 203 | if (!clk_data) { | 234 | if (!clk_data) { |
| 204 | kfree(rtc); | 235 | kfree(rtc); |
| 205 | return; | 236 | return; |
| @@ -224,10 +255,15 @@ static void __init sun6i_rtc_clk_init(struct device_node *node) | |||
| 224 | if (!of_get_property(node, "clocks", NULL)) | 255 | if (!of_get_property(node, "clocks", NULL)) |
| 225 | goto err; | 256 | goto err; |
| 226 | 257 | ||
| 258 | /* Only read IOSC name from device tree if it is exported */ | ||
| 259 | if (rtc->data->export_iosc) | ||
| 260 | of_property_read_string_index(node, "clock-output-names", 2, | ||
| 261 | &iosc_name); | ||
| 262 | |||
| 227 | rtc->int_osc = clk_hw_register_fixed_rate_with_accuracy(NULL, | 263 | rtc->int_osc = clk_hw_register_fixed_rate_with_accuracy(NULL, |
| 228 | "rtc-int-osc", | 264 | iosc_name, |
| 229 | NULL, 0, | 265 | NULL, 0, |
| 230 | 667000, | 266 | rtc->data->rc_osc_rate, |
| 231 | 300000000); | 267 | 300000000); |
| 232 | if (IS_ERR(rtc->int_osc)) { | 268 | if (IS_ERR(rtc->int_osc)) { |
| 233 | pr_crit("Couldn't register the internal oscillator\n"); | 269 | pr_crit("Couldn't register the internal oscillator\n"); |
| @@ -264,14 +300,71 @@ static void __init sun6i_rtc_clk_init(struct device_node *node) | |||
| 264 | clk_data->num = 2; | 300 | clk_data->num = 2; |
| 265 | clk_data->hws[0] = &rtc->hw; | 301 | clk_data->hws[0] = &rtc->hw; |
| 266 | clk_data->hws[1] = __clk_get_hw(rtc->ext_losc); | 302 | clk_data->hws[1] = __clk_get_hw(rtc->ext_losc); |
| 303 | if (rtc->data->export_iosc) { | ||
| 304 | clk_data->hws[2] = rtc->int_osc; | ||
| 305 | clk_data->num = 3; | ||
| 306 | } | ||
| 267 | of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data); | 307 | of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data); |
| 268 | return; | 308 | return; |
| 269 | 309 | ||
| 270 | err: | 310 | err: |
| 271 | kfree(clk_data); | 311 | kfree(clk_data); |
| 272 | } | 312 | } |
| 273 | CLK_OF_DECLARE_DRIVER(sun6i_rtc_clk, "allwinner,sun6i-a31-rtc", | 313 | |
| 274 | sun6i_rtc_clk_init); | 314 | static const struct sun6i_rtc_clk_data sun6i_a31_rtc_data = { |
| 315 | .rc_osc_rate = 667000, /* datasheet says 600 ~ 700 KHz */ | ||
| 316 | .has_prescaler = 1, | ||
| 317 | }; | ||
| 318 | |||
| 319 | static void __init sun6i_a31_rtc_clk_init(struct device_node *node) | ||
| 320 | { | ||
| 321 | sun6i_rtc_clk_init(node, &sun6i_a31_rtc_data); | ||
| 322 | } | ||
| 323 | CLK_OF_DECLARE_DRIVER(sun6i_a31_rtc_clk, "allwinner,sun6i-a31-rtc", | ||
| 324 | sun6i_a31_rtc_clk_init); | ||
| 325 | |||
| 326 | static const struct sun6i_rtc_clk_data sun8i_a23_rtc_data = { | ||
| 327 | .rc_osc_rate = 667000, /* datasheet says 600 ~ 700 KHz */ | ||
| 328 | .has_prescaler = 1, | ||
| 329 | .has_out_clk = 1, | ||
| 330 | }; | ||
| 331 | |||
| 332 | static void __init sun8i_a23_rtc_clk_init(struct device_node *node) | ||
| 333 | { | ||
| 334 | sun6i_rtc_clk_init(node, &sun8i_a23_rtc_data); | ||
| 335 | } | ||
| 336 | CLK_OF_DECLARE_DRIVER(sun8i_a23_rtc_clk, "allwinner,sun8i-a23-rtc", | ||
| 337 | sun8i_a23_rtc_clk_init); | ||
| 338 | |||
| 339 | static const struct sun6i_rtc_clk_data sun8i_h3_rtc_data = { | ||
| 340 | .rc_osc_rate = 16000000, | ||
| 341 | .fixed_prescaler = 32, | ||
| 342 | .has_prescaler = 1, | ||
| 343 | .has_out_clk = 1, | ||
| 344 | .export_iosc = 1, | ||
| 345 | }; | ||
| 346 | |||
| 347 | static void __init sun8i_h3_rtc_clk_init(struct device_node *node) | ||
| 348 | { | ||
| 349 | sun6i_rtc_clk_init(node, &sun8i_h3_rtc_data); | ||
| 350 | } | ||
| 351 | CLK_OF_DECLARE_DRIVER(sun8i_h3_rtc_clk, "allwinner,sun8i-h3-rtc", | ||
| 352 | sun8i_h3_rtc_clk_init); | ||
| 353 | /* As far as we are concerned, clocks for H5 are the same as H3 */ | ||
| 354 | CLK_OF_DECLARE_DRIVER(sun50i_h5_rtc_clk, "allwinner,sun50i-h5-rtc", | ||
| 355 | sun8i_h3_rtc_clk_init); | ||
| 356 | |||
| 357 | static const struct sun6i_rtc_clk_data sun8i_v3_rtc_data = { | ||
| 358 | .rc_osc_rate = 32000, | ||
| 359 | .has_out_clk = 1, | ||
| 360 | }; | ||
| 361 | |||
| 362 | static void __init sun8i_v3_rtc_clk_init(struct device_node *node) | ||
| 363 | { | ||
| 364 | sun6i_rtc_clk_init(node, &sun8i_v3_rtc_data); | ||
| 365 | } | ||
| 366 | CLK_OF_DECLARE_DRIVER(sun8i_v3_rtc_clk, "allwinner,sun8i-v3-rtc", | ||
| 367 | sun8i_v3_rtc_clk_init); | ||
| 275 | 368 | ||
| 276 | static irqreturn_t sun6i_rtc_alarmirq(int irq, void *id) | 369 | static irqreturn_t sun6i_rtc_alarmirq(int irq, void *id) |
| 277 | { | 370 | { |
| @@ -578,8 +671,18 @@ static int sun6i_rtc_probe(struct platform_device *pdev) | |||
| 578 | return 0; | 671 | return 0; |
| 579 | } | 672 | } |
| 580 | 673 | ||
| 674 | /* | ||
| 675 | * As far as RTC functionality goes, all models are the same. The | ||
| 676 | * datasheets claim that different models have different number of | ||
| 677 | * registers available for non-volatile storage, but experiments show | ||
| 678 | * that all SoCs have 16 registers available for this purpose. | ||
| 679 | */ | ||
| 581 | static const struct of_device_id sun6i_rtc_dt_ids[] = { | 680 | static const struct of_device_id sun6i_rtc_dt_ids[] = { |
| 582 | { .compatible = "allwinner,sun6i-a31-rtc" }, | 681 | { .compatible = "allwinner,sun6i-a31-rtc" }, |
| 682 | { .compatible = "allwinner,sun8i-a23-rtc" }, | ||
| 683 | { .compatible = "allwinner,sun8i-h3-rtc" }, | ||
| 684 | { .compatible = "allwinner,sun8i-v3-rtc" }, | ||
| 685 | { .compatible = "allwinner,sun50i-h5-rtc" }, | ||
| 583 | { /* sentinel */ }, | 686 | { /* sentinel */ }, |
| 584 | }; | 687 | }; |
| 585 | MODULE_DEVICE_TABLE(of, sun6i_rtc_dt_ids); | 688 | MODULE_DEVICE_TABLE(of, sun6i_rtc_dt_ids); |
diff --git a/drivers/rtc/rtc-tegra.c b/drivers/rtc/rtc-tegra.c index c9e77a83cd1b..c6b0a99aa3a9 100644 --- a/drivers/rtc/rtc-tegra.c +++ b/drivers/rtc/rtc-tegra.c | |||
| @@ -125,15 +125,7 @@ static int tegra_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
| 125 | 125 | ||
| 126 | rtc_time_to_tm(sec, tm); | 126 | rtc_time_to_tm(sec, tm); |
| 127 | 127 | ||
| 128 | dev_vdbg(dev, "time read as %lu. %d/%d/%d %d:%02u:%02u\n", | 128 | dev_vdbg(dev, "time read as %lu. %ptR\n", sec, tm); |
| 129 | sec, | ||
| 130 | tm->tm_mon + 1, | ||
| 131 | tm->tm_mday, | ||
| 132 | tm->tm_year + 1900, | ||
| 133 | tm->tm_hour, | ||
| 134 | tm->tm_min, | ||
| 135 | tm->tm_sec | ||
| 136 | ); | ||
| 137 | 129 | ||
| 138 | return 0; | 130 | return 0; |
| 139 | } | 131 | } |
| @@ -147,15 +139,7 @@ static int tegra_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
| 147 | /* convert tm to seconds. */ | 139 | /* convert tm to seconds. */ |
| 148 | rtc_tm_to_time(tm, &sec); | 140 | rtc_tm_to_time(tm, &sec); |
| 149 | 141 | ||
| 150 | dev_vdbg(dev, "time set to %lu. %d/%d/%d %d:%02u:%02u\n", | 142 | dev_vdbg(dev, "time set to %lu. %ptR\n", sec, tm); |
| 151 | sec, | ||
| 152 | tm->tm_mon+1, | ||
| 153 | tm->tm_mday, | ||
| 154 | tm->tm_year+1900, | ||
| 155 | tm->tm_hour, | ||
| 156 | tm->tm_min, | ||
| 157 | tm->tm_sec | ||
| 158 | ); | ||
| 159 | 143 | ||
| 160 | /* seconds only written if wait succeeded. */ | 144 | /* seconds only written if wait succeeded. */ |
| 161 | ret = tegra_rtc_wait_while_busy(dev); | 145 | ret = tegra_rtc_wait_while_busy(dev); |
| @@ -232,15 +216,7 @@ static int tegra_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm) | |||
| 232 | /* if successfully written and alarm is enabled ... */ | 216 | /* if successfully written and alarm is enabled ... */ |
| 233 | if (sec) { | 217 | if (sec) { |
| 234 | tegra_rtc_alarm_irq_enable(dev, 1); | 218 | tegra_rtc_alarm_irq_enable(dev, 1); |
| 235 | 219 | dev_vdbg(dev, "alarm set as %lu. %ptR\n", sec, &alarm->time); | |
| 236 | dev_vdbg(dev, "alarm set as %lu. %d/%d/%d %d:%02u:%02u\n", | ||
| 237 | sec, | ||
| 238 | alarm->time.tm_mon+1, | ||
| 239 | alarm->time.tm_mday, | ||
| 240 | alarm->time.tm_year+1900, | ||
| 241 | alarm->time.tm_hour, | ||
| 242 | alarm->time.tm_min, | ||
| 243 | alarm->time.tm_sec); | ||
| 244 | } else { | 220 | } else { |
| 245 | /* disable alarm if 0 or write error. */ | 221 | /* disable alarm if 0 or write error. */ |
| 246 | dev_vdbg(dev, "alarm disabled\n"); | 222 | dev_vdbg(dev, "alarm disabled\n"); |
diff --git a/drivers/rtc/rtc-sysfs.c b/drivers/rtc/sysfs.c index 9746c32eee2e..a8f22ee726bb 100644 --- a/drivers/rtc/rtc-sysfs.c +++ b/drivers/rtc/sysfs.c | |||
| @@ -39,12 +39,10 @@ date_show(struct device *dev, struct device_attribute *attr, char *buf) | |||
| 39 | struct rtc_time tm; | 39 | struct rtc_time tm; |
| 40 | 40 | ||
| 41 | retval = rtc_read_time(to_rtc_device(dev), &tm); | 41 | retval = rtc_read_time(to_rtc_device(dev), &tm); |
| 42 | if (retval == 0) { | 42 | if (retval) |
| 43 | retval = sprintf(buf, "%04d-%02d-%02d\n", | 43 | return retval; |
| 44 | tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday); | ||
| 45 | } | ||
| 46 | 44 | ||
| 47 | return retval; | 45 | return sprintf(buf, "%ptRd\n", &tm); |
| 48 | } | 46 | } |
| 49 | static DEVICE_ATTR_RO(date); | 47 | static DEVICE_ATTR_RO(date); |
| 50 | 48 | ||
| @@ -55,12 +53,10 @@ time_show(struct device *dev, struct device_attribute *attr, char *buf) | |||
| 55 | struct rtc_time tm; | 53 | struct rtc_time tm; |
| 56 | 54 | ||
| 57 | retval = rtc_read_time(to_rtc_device(dev), &tm); | 55 | retval = rtc_read_time(to_rtc_device(dev), &tm); |
| 58 | if (retval == 0) { | 56 | if (retval) |
| 59 | retval = sprintf(buf, "%02d:%02d:%02d\n", | 57 | return retval; |
| 60 | tm.tm_hour, tm.tm_min, tm.tm_sec); | ||
| 61 | } | ||
| 62 | 58 | ||
| 63 | return retval; | 59 | return sprintf(buf, "%ptRt\n", &tm); |
| 64 | } | 60 | } |
| 65 | static DEVICE_ATTR_RO(time); | 61 | static DEVICE_ATTR_RO(time); |
| 66 | 62 | ||
