diff options
Diffstat (limited to 'drivers/rtc/rtc-max77686.c')
-rw-r--r-- | drivers/rtc/rtc-max77686.c | 73 |
1 files changed, 27 insertions, 46 deletions
diff --git a/drivers/rtc/rtc-max77686.c b/drivers/rtc/rtc-max77686.c index 6b1337f9baf4..771812d62e6b 100644 --- a/drivers/rtc/rtc-max77686.c +++ b/drivers/rtc/rtc-max77686.c | |||
@@ -24,7 +24,7 @@ | |||
24 | 24 | ||
25 | /* RTC Control Register */ | 25 | /* RTC Control Register */ |
26 | #define BCD_EN_SHIFT 0 | 26 | #define BCD_EN_SHIFT 0 |
27 | #define BCD_EN_MASK (1 << BCD_EN_SHIFT) | 27 | #define BCD_EN_MASK (1 << BCD_EN_SHIFT) |
28 | #define MODEL24_SHIFT 1 | 28 | #define MODEL24_SHIFT 1 |
29 | #define MODEL24_MASK (1 << MODEL24_SHIFT) | 29 | #define MODEL24_MASK (1 << MODEL24_SHIFT) |
30 | /* RTC Update Register1 */ | 30 | /* RTC Update Register1 */ |
@@ -33,12 +33,12 @@ | |||
33 | #define RTC_RBUDR_SHIFT 4 | 33 | #define RTC_RBUDR_SHIFT 4 |
34 | #define RTC_RBUDR_MASK (1 << RTC_RBUDR_SHIFT) | 34 | #define RTC_RBUDR_MASK (1 << RTC_RBUDR_SHIFT) |
35 | /* WTSR and SMPL Register */ | 35 | /* WTSR and SMPL Register */ |
36 | #define WTSRT_SHIFT 0 | 36 | #define WTSRT_SHIFT 0 |
37 | #define SMPLT_SHIFT 2 | 37 | #define SMPLT_SHIFT 2 |
38 | #define WTSR_EN_SHIFT 6 | 38 | #define WTSR_EN_SHIFT 6 |
39 | #define SMPL_EN_SHIFT 7 | 39 | #define SMPL_EN_SHIFT 7 |
40 | #define WTSRT_MASK (3 << WTSRT_SHIFT) | 40 | #define WTSRT_MASK (3 << WTSRT_SHIFT) |
41 | #define SMPLT_MASK (3 << SMPLT_SHIFT) | 41 | #define SMPLT_MASK (3 << SMPLT_SHIFT) |
42 | #define WTSR_EN_MASK (1 << WTSR_EN_SHIFT) | 42 | #define WTSR_EN_MASK (1 << WTSR_EN_SHIFT) |
43 | #define SMPL_EN_MASK (1 << SMPL_EN_SHIFT) | 43 | #define SMPL_EN_MASK (1 << SMPL_EN_SHIFT) |
44 | /* RTC Hour register */ | 44 | /* RTC Hour register */ |
@@ -466,7 +466,7 @@ static void max77686_rtc_enable_smpl(struct max77686_rtc_info *info, bool enable | |||
466 | 466 | ||
467 | val = 0; | 467 | val = 0; |
468 | regmap_read(info->max77686->rtc_regmap, MAX77686_WTSR_SMPL_CNTL, &val); | 468 | regmap_read(info->max77686->rtc_regmap, MAX77686_WTSR_SMPL_CNTL, &val); |
469 | pr_info("%s: WTSR_SMPL(0x%02x)\n", __func__, val); | 469 | dev_info(info->dev, "%s: WTSR_SMPL(0x%02x)\n", __func__, val); |
470 | } | 470 | } |
471 | #endif /* MAX77686_RTC_WTSR_SMPL */ | 471 | #endif /* MAX77686_RTC_WTSR_SMPL */ |
472 | 472 | ||
@@ -505,7 +505,8 @@ static int max77686_rtc_probe(struct platform_device *pdev) | |||
505 | 505 | ||
506 | dev_info(&pdev->dev, "%s\n", __func__); | 506 | dev_info(&pdev->dev, "%s\n", __func__); |
507 | 507 | ||
508 | info = kzalloc(sizeof(struct max77686_rtc_info), GFP_KERNEL); | 508 | info = devm_kzalloc(&pdev->dev, sizeof(struct max77686_rtc_info), |
509 | GFP_KERNEL); | ||
509 | if (!info) | 510 | if (!info) |
510 | return -ENOMEM; | 511 | return -ENOMEM; |
511 | 512 | ||
@@ -513,13 +514,12 @@ static int max77686_rtc_probe(struct platform_device *pdev) | |||
513 | info->dev = &pdev->dev; | 514 | info->dev = &pdev->dev; |
514 | info->max77686 = max77686; | 515 | info->max77686 = max77686; |
515 | info->rtc = max77686->rtc; | 516 | info->rtc = max77686->rtc; |
516 | info->max77686->rtc_regmap = regmap_init_i2c(info->max77686->rtc, | 517 | info->max77686->rtc_regmap = devm_regmap_init_i2c(info->max77686->rtc, |
517 | &max77686_rtc_regmap_config); | 518 | &max77686_rtc_regmap_config); |
518 | if (IS_ERR(info->max77686->rtc_regmap)) { | 519 | if (IS_ERR(info->max77686->rtc_regmap)) { |
519 | ret = PTR_ERR(info->max77686->rtc_regmap); | 520 | ret = PTR_ERR(info->max77686->rtc_regmap); |
520 | dev_err(info->max77686->dev, "Failed to allocate register map: %d\n", | 521 | dev_err(info->max77686->dev, "Failed to allocate register map: %d\n", |
521 | ret); | 522 | ret); |
522 | kfree(info); | ||
523 | return ret; | 523 | return ret; |
524 | } | 524 | } |
525 | platform_set_drvdata(pdev, info); | 525 | platform_set_drvdata(pdev, info); |
@@ -538,8 +538,8 @@ static int max77686_rtc_probe(struct platform_device *pdev) | |||
538 | 538 | ||
539 | device_init_wakeup(&pdev->dev, 1); | 539 | device_init_wakeup(&pdev->dev, 1); |
540 | 540 | ||
541 | info->rtc_dev = rtc_device_register("max77686-rtc", &pdev->dev, | 541 | info->rtc_dev = devm_rtc_device_register(&pdev->dev, "max77686-rtc", |
542 | &max77686_rtc_ops, THIS_MODULE); | 542 | &max77686_rtc_ops, THIS_MODULE); |
543 | 543 | ||
544 | if (IS_ERR(info->rtc_dev)) { | 544 | if (IS_ERR(info->rtc_dev)) { |
545 | dev_info(&pdev->dev, "%s: fail\n", __func__); | 545 | dev_info(&pdev->dev, "%s: fail\n", __func__); |
@@ -551,36 +551,24 @@ static int max77686_rtc_probe(struct platform_device *pdev) | |||
551 | goto err_rtc; | 551 | goto err_rtc; |
552 | } | 552 | } |
553 | virq = irq_create_mapping(max77686->irq_domain, MAX77686_RTCIRQ_RTCA1); | 553 | virq = irq_create_mapping(max77686->irq_domain, MAX77686_RTCIRQ_RTCA1); |
554 | if (!virq) | 554 | if (!virq) { |
555 | ret = -ENXIO; | ||
555 | goto err_rtc; | 556 | goto err_rtc; |
557 | } | ||
556 | info->virq = virq; | 558 | info->virq = virq; |
557 | 559 | ||
558 | ret = request_threaded_irq(virq, NULL, max77686_rtc_alarm_irq, 0, | 560 | ret = devm_request_threaded_irq(&pdev->dev, virq, NULL, |
559 | "rtc-alarm0", info); | 561 | max77686_rtc_alarm_irq, 0, "rtc-alarm0", info); |
560 | if (ret < 0) { | 562 | if (ret < 0) |
561 | dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n", | 563 | dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n", |
562 | info->virq, ret); | 564 | info->virq, ret); |
563 | goto err_rtc; | ||
564 | } | ||
565 | 565 | ||
566 | goto out; | ||
567 | err_rtc: | 566 | err_rtc: |
568 | kfree(info); | ||
569 | return ret; | ||
570 | out: | ||
571 | return ret; | 567 | return ret; |
572 | } | 568 | } |
573 | 569 | ||
574 | static int max77686_rtc_remove(struct platform_device *pdev) | 570 | static int max77686_rtc_remove(struct platform_device *pdev) |
575 | { | 571 | { |
576 | struct max77686_rtc_info *info = platform_get_drvdata(pdev); | ||
577 | |||
578 | if (info) { | ||
579 | free_irq(info->virq, info); | ||
580 | rtc_device_unregister(info->rtc_dev); | ||
581 | kfree(info); | ||
582 | } | ||
583 | |||
584 | return 0; | 572 | return 0; |
585 | } | 573 | } |
586 | 574 | ||
@@ -594,11 +582,14 @@ static void max77686_rtc_shutdown(struct platform_device *pdev) | |||
594 | for (i = 0; i < 3; i++) { | 582 | for (i = 0; i < 3; i++) { |
595 | max77686_rtc_enable_wtsr(info, false); | 583 | max77686_rtc_enable_wtsr(info, false); |
596 | regmap_read(info->max77686->rtc_regmap, MAX77686_WTSR_SMPL_CNTL, &val); | 584 | regmap_read(info->max77686->rtc_regmap, MAX77686_WTSR_SMPL_CNTL, &val); |
597 | pr_info("%s: WTSR_SMPL reg(0x%02x)\n", __func__, val); | 585 | dev_info(info->dev, "%s: WTSR_SMPL reg(0x%02x)\n", __func__, |
598 | if (val & WTSR_EN_MASK) | 586 | val); |
599 | pr_emerg("%s: fail to disable WTSR\n", __func__); | 587 | if (val & WTSR_EN_MASK) { |
600 | else { | 588 | dev_emerg(info->dev, "%s: fail to disable WTSR\n", |
601 | pr_info("%s: success to disable WTSR\n", __func__); | 589 | __func__); |
590 | } else { | ||
591 | dev_info(info->dev, "%s: success to disable WTSR\n", | ||
592 | __func__); | ||
602 | break; | 593 | break; |
603 | } | 594 | } |
604 | } | 595 | } |
@@ -624,18 +615,8 @@ static struct platform_driver max77686_rtc_driver = { | |||
624 | .id_table = rtc_id, | 615 | .id_table = rtc_id, |
625 | }; | 616 | }; |
626 | 617 | ||
627 | static int __init max77686_rtc_init(void) | 618 | module_platform_driver(max77686_rtc_driver); |
628 | { | ||
629 | return platform_driver_register(&max77686_rtc_driver); | ||
630 | } | ||
631 | module_init(max77686_rtc_init); | ||
632 | |||
633 | static void __exit max77686_rtc_exit(void) | ||
634 | { | ||
635 | platform_driver_unregister(&max77686_rtc_driver); | ||
636 | } | ||
637 | module_exit(max77686_rtc_exit); | ||
638 | 619 | ||
639 | MODULE_DESCRIPTION("Maxim MAX77686 RTC driver"); | 620 | MODULE_DESCRIPTION("Maxim MAX77686 RTC driver"); |
640 | MODULE_AUTHOR("<woong.byun@samsung.com>"); | 621 | MODULE_AUTHOR("Chiwoong Byun <woong.byun@samsung.com>"); |
641 | MODULE_LICENSE("GPL"); | 622 | MODULE_LICENSE("GPL"); |