Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

rtc: stm32: add STM32H7 RTC support

This patch adds support for STM32H7 RTC. On STM32H7, the RTC bus interface
clock (APB clock) needs to be enabled.

Signed-off-by: Amelie Delaunay <amelie.delaunay@st.com>
Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>

authored by

Amelie Delaunay and committed by
Alexandre Belloni
9a6757ea d2be279b

+65 -17
+65 -17
drivers/rtc/rtc-stm32.c
··· 94 94 /* STM32_PWR_CR bit field */ 95 95 #define PWR_CR_DBP BIT(8) 96 96 97 + struct stm32_rtc_data { 98 + bool has_pclk; 99 + }; 100 + 97 101 struct stm32_rtc { 98 102 struct rtc_device *rtc_dev; 99 103 void __iomem *base; 100 104 struct regmap *dbp; 101 - struct clk *ck_rtc; 105 + struct stm32_rtc_data *data; 106 + struct clk *pclk; 107 + struct clk *rtc_ck; 102 108 int irq_alarm; 103 109 }; 104 110 ··· 128 122 writel_relaxed(isr, rtc->base + STM32_RTC_ISR); 129 123 130 124 /* 131 - * It takes around 2 ck_rtc clock cycles to enter in 125 + * It takes around 2 rtc_ck clock cycles to enter in 132 126 * initialization phase mode (and have INITF flag set). As 133 - * slowest ck_rtc frequency may be 32kHz and highest should be 127 + * slowest rtc_ck frequency may be 32kHz and highest should be 134 128 * 1MHz, we poll every 10 us with a timeout of 100ms. 135 129 */ 136 130 return readl_relaxed_poll_timeout_atomic( ··· 159 153 160 154 /* 161 155 * Wait for RSF to be set to ensure the calendar registers are 162 - * synchronised, it takes around 2 ck_rtc clock cycles 156 + * synchronised, it takes around 2 rtc_ck clock cycles 163 157 */ 164 158 return readl_relaxed_poll_timeout_atomic(rtc->base + STM32_RTC_ISR, 165 159 isr, ··· 462 456 463 457 /* 464 458 * Poll Alarm write flag to be sure that Alarm update is allowed: it 465 - * takes around 2 ck_rtc clock cycles 459 + * takes around 2 rtc_ck clock cycles 466 460 */ 467 461 ret = readl_relaxed_poll_timeout_atomic(rtc->base + STM32_RTC_ISR, 468 462 isr, ··· 496 490 .alarm_irq_enable = stm32_rtc_alarm_irq_enable, 497 491 }; 498 492 493 + static const struct stm32_rtc_data stm32_rtc_data = { 494 + .has_pclk = false, 495 + }; 496 + 497 + static const struct stm32_rtc_data stm32h7_rtc_data = { 498 + .has_pclk = true, 499 + }; 500 + 499 501 static const struct of_device_id stm32_rtc_of_match[] = { 500 - { .compatible = "st,stm32-rtc" }, 502 + { .compatible = "st,stm32-rtc", .data = &stm32_rtc_data }, 503 + { .compatible = "st,stm32h7-rtc", .data = &stm32h7_rtc_data }, 501 504 {} 502 505 }; 503 506 MODULE_DEVICE_TABLE(of, stm32_rtc_of_match); ··· 518 503 unsigned int rate; 519 504 int ret = 0; 520 505 521 - rate = clk_get_rate(rtc->ck_rtc); 506 + rate = clk_get_rate(rtc->rtc_ck); 522 507 523 508 /* Find prediv_a and prediv_s to obtain the 1Hz calendar clock */ 524 509 pred_a_max = STM32_RTC_PRER_PRED_A >> STM32_RTC_PRER_PRED_A_SHIFT; ··· 539 524 pred_a = pred_a_max; 540 525 pred_s = (rate / (pred_a + 1)) - 1; 541 526 542 - dev_warn(&pdev->dev, "ck_rtc is %s\n", 527 + dev_warn(&pdev->dev, "rtc_ck is %s\n", 543 528 (rate < ((pred_a + 1) * (pred_s + 1))) ? 544 529 "fast" : "slow"); 545 530 } ··· 576 561 { 577 562 struct stm32_rtc *rtc; 578 563 struct resource *res; 564 + const struct of_device_id *match; 579 565 int ret; 580 566 581 567 rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); ··· 595 579 return PTR_ERR(rtc->dbp); 596 580 } 597 581 598 - rtc->ck_rtc = devm_clk_get(&pdev->dev, NULL); 599 - if (IS_ERR(rtc->ck_rtc)) { 600 - dev_err(&pdev->dev, "no ck_rtc clock"); 601 - return PTR_ERR(rtc->ck_rtc); 582 + match = of_match_device(stm32_rtc_of_match, &pdev->dev); 583 + rtc->data = (struct stm32_rtc_data *)match->data; 584 + 585 + if (!rtc->data->has_pclk) { 586 + rtc->pclk = NULL; 587 + rtc->rtc_ck = devm_clk_get(&pdev->dev, NULL); 588 + } else { 589 + rtc->pclk = devm_clk_get(&pdev->dev, "pclk"); 590 + if (IS_ERR(rtc->pclk)) { 591 + dev_err(&pdev->dev, "no pclk clock"); 592 + return PTR_ERR(rtc->pclk); 593 + } 594 + rtc->rtc_ck = devm_clk_get(&pdev->dev, "rtc_ck"); 595 + } 596 + if (IS_ERR(rtc->rtc_ck)) { 597 + dev_err(&pdev->dev, "no rtc_ck clock"); 598 + return PTR_ERR(rtc->rtc_ck); 602 599 } 603 600 604 - ret = clk_prepare_enable(rtc->ck_rtc); 601 + if (rtc->data->has_pclk) { 602 + ret = clk_prepare_enable(rtc->pclk); 603 + if (ret) 604 + return ret; 605 + } 606 + 607 + ret = clk_prepare_enable(rtc->rtc_ck); 605 608 if (ret) 606 - return ret; 609 + goto err; 607 610 608 611 regmap_update_bits(rtc->dbp, PWR_CR, PWR_CR_DBP, PWR_CR_DBP); 609 612 ··· 630 595 * After a system reset, RTC_ISR.INITS flag can be read to check if 631 596 * the calendar has been initalized or not. INITS flag is reset by a 632 597 * power-on reset (no vbat, no power-supply). It is not reset if 633 - * ck_rtc parent clock has changed (so RTC prescalers need to be 598 + * rtc_ck parent clock has changed (so RTC prescalers need to be 634 599 * changed). That's why we cannot rely on this flag to know if RTC 635 600 * init has to be done. 636 601 */ ··· 681 646 682 647 return 0; 683 648 err: 684 - clk_disable_unprepare(rtc->ck_rtc); 649 + if (rtc->data->has_pclk) 650 + clk_disable_unprepare(rtc->pclk); 651 + clk_disable_unprepare(rtc->rtc_ck); 685 652 686 653 regmap_update_bits(rtc->dbp, PWR_CR, PWR_CR_DBP, 0); 687 654 ··· 704 667 writel_relaxed(cr, rtc->base + STM32_RTC_CR); 705 668 stm32_rtc_wpr_lock(rtc); 706 669 707 - clk_disable_unprepare(rtc->ck_rtc); 670 + clk_disable_unprepare(rtc->rtc_ck); 671 + if (rtc->data->has_pclk) 672 + clk_disable_unprepare(rtc->pclk); 708 673 709 674 /* Enable backup domain write protection */ 710 675 regmap_update_bits(rtc->dbp, PWR_CR, PWR_CR_DBP, 0); ··· 721 682 { 722 683 struct stm32_rtc *rtc = dev_get_drvdata(dev); 723 684 685 + if (rtc->data->has_pclk) 686 + clk_disable_unprepare(rtc->pclk); 687 + 724 688 if (device_may_wakeup(dev)) 725 689 return enable_irq_wake(rtc->irq_alarm); 726 690 ··· 734 692 { 735 693 struct stm32_rtc *rtc = dev_get_drvdata(dev); 736 694 int ret = 0; 695 + 696 + if (rtc->data->has_pclk) { 697 + ret = clk_prepare_enable(rtc->pclk); 698 + if (ret) 699 + return ret; 700 + } 737 701 738 702 ret = stm32_rtc_wait_sync(rtc); 739 703 if (ret < 0)