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

Merge tag 'rtc-6.16' of git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux

Pull RTC updates from Alexandre Belloni:
"There are two new drivers this cycle. There is also support for a
negative offset for RTCs that have been shipped with a date set using
an epoch that is before 1970. This unfortunately happens with some
products that ship with a vendor kernel and an out of tree driver.

Core:
- support negative offsets for RTCs that have shipped with an epoch
earlier than 1970

New drivers:
- NXP S32G2/S32G3
- Sophgo CV1800

Drivers:
- loongson: fix missing alarm notifications for ACPI
- m41t80: kickstart ocillator upon failure
- mt6359: mt6357 support
- pcf8563: fix wrong alarm register
- sh: cleanups"

* tag 'rtc-6.16' of git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux: (39 commits)
rtc: mt6359: Add mt6357 support
rtc: test: Test date conversion for dates starting in 1900
rtc: test: Also test time and wday outcome of rtc_time64_to_tm()
rtc: test: Emit the seconds-since-1970 value instead of days-since-1970
rtc: Fix offset calculation for .start_secs < 0
rtc: Make rtc_time64_to_tm() support dates before 1970
rtc: pcf8563: fix wrong alarm register
rtc: rzn1: support input frequencies other than 32768Hz
rtc: rzn1: Disable controller before initialization
dt-bindings: rtc: rzn1: add optional second clock
rtc: m41t80: reduce verbosity
rtc: m41t80: kickstart ocillator upon failure
rtc: s32g: add NXP S32G2/S32G3 SoC support
dt-bindings: rtc: add schema for NXP S32G2/S32G3 SoCs
dt-bindings: at91rm9260-rtt: add microchip,sama7d65-rtt
dt-bindings: rtc: at91rm9200: add microchip,sama7d65-rtc
rtc: loongson: Add missing alarm notifications for ACPI RTC events
rtc: sophgo: add rtc support for Sophgo CV1800 SoC
rtc: stm32: drop unused module alias
rtc: s3c: drop unused module alias
...

+946 -329
+3 -1
Documentation/devicetree/bindings/rtc/atmel,at91rm9200-rtc.yaml
··· 23 23 - microchip,sam9x60-rtc 24 24 - microchip,sama7g5-rtc 25 25 - items: 26 - - const: microchip,sam9x7-rtc 26 + - enum: 27 + - microchip,sam9x7-rtc 28 + - microchip,sama7d65-rtc 27 29 - const: microchip,sam9x60-rtc 28 30 29 31 reg:
+1
Documentation/devicetree/bindings/rtc/atmel,at91sam9260-rtt.yaml
··· 22 22 - enum: 23 23 - microchip,sam9x60-rtt 24 24 - microchip,sam9x7-rtt 25 + - microchip,sama7d65-rtt 25 26 - const: atmel,at91sam9260-rtt 26 27 - items: 27 28 - const: microchip,sama7g5-rtt
+72
Documentation/devicetree/bindings/rtc/nxp,s32g-rtc.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/rtc/nxp,s32g-rtc.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: NXP S32G2/S32G3 Real Time Clock (RTC) 8 + 9 + maintainers: 10 + - Bogdan Hamciuc <bogdan.hamciuc@nxp.com> 11 + - Ciprian Marian Costea <ciprianmarian.costea@nxp.com> 12 + 13 + description: 14 + RTC hardware module present on S32G2/S32G3 SoCs is used as a wakeup source. 15 + It is not kept alive during system reset and it is not battery-powered. 16 + 17 + allOf: 18 + - $ref: rtc.yaml# 19 + 20 + properties: 21 + compatible: 22 + oneOf: 23 + - enum: 24 + - nxp,s32g2-rtc 25 + - items: 26 + - const: nxp,s32g3-rtc 27 + - const: nxp,s32g2-rtc 28 + 29 + reg: 30 + maxItems: 1 31 + 32 + interrupts: 33 + maxItems: 1 34 + 35 + clocks: 36 + items: 37 + - description: ipg clock drives the access to the RTC iomapped registers 38 + - description: Clock source for the RTC module. Can be selected between 39 + 4 different clock sources using an integrated hardware mux. 40 + On S32G2/S32G3 SoCs, 'source0' is the SIRC clock (~32KHz) and it is 41 + available during standby and runtime. 'source1' is reserved and cannot 42 + be used. 'source2' is the FIRC clock and it is only available during 43 + runtime providing a better resolution (~48MHz). 'source3' is an external 44 + RTC clock source which can be additionally added in hardware. 45 + 46 + clock-names: 47 + items: 48 + - const: ipg 49 + - enum: [ source0, source1, source2, source3 ] 50 + 51 + required: 52 + - compatible 53 + - reg 54 + - interrupts 55 + - clocks 56 + - clock-names 57 + 58 + additionalProperties: false 59 + 60 + examples: 61 + - | 62 + #include <dt-bindings/interrupt-controller/arm-gic.h> 63 + #include <dt-bindings/interrupt-controller/irq.h> 64 + 65 + rtc@40060000 { 66 + compatible = "nxp,s32g3-rtc", 67 + "nxp,s32g2-rtc"; 68 + reg = <0x40060000 0x1000>; 69 + interrupts = <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>; 70 + clocks = <&clks 54>, <&clks 55>; 71 + clock-names = "ipg", "source0"; 72 + };
+6
Documentation/devicetree/bindings/rtc/qcom-pm8xxx-rtc.yaml
··· 55 55 description: 56 56 RTC alarm is not owned by the OS 57 57 58 + qcom,uefi-rtc-info: 59 + type: boolean 60 + description: 61 + RTC offset is stored as a four-byte GPS time offset in a 12-byte UEFI 62 + variable 882f8c2b-9646-435f-8de5-f208ff80c1bd-RTCInfo 63 + 58 64 wakeup-source: true 59 65 60 66 required:
+6 -2
Documentation/devicetree/bindings/rtc/renesas,rzn1-rtc.yaml
··· 33 33 - const: pps 34 34 35 35 clocks: 36 - maxItems: 1 36 + minItems: 1 37 + maxItems: 2 37 38 38 39 clock-names: 39 - const: hclk 40 + minItems: 1 41 + items: 42 + - const: hclk 43 + - const: xtal 40 44 41 45 power-domains: 42 46 maxItems: 1
+24 -1
drivers/rtc/Kconfig
··· 1388 1388 This driver can also be built as a module. If so, the module 1389 1389 will be called rtc-asm9260. 1390 1390 1391 + config RTC_DRV_CV1800 1392 + tristate "Sophgo CV1800 RTC" 1393 + depends on SOPHGO_CV1800_RTCSYS || COMPILE_TEST 1394 + select MFD_SYSCON 1395 + select REGMAP 1396 + help 1397 + If you say yes here you get support the RTC driver for Sophgo CV1800 1398 + series SoC. 1399 + 1400 + This driver can also be built as a module. If so, the module will be 1401 + called rtc-cv1800. 1402 + 1391 1403 config RTC_DRV_DIGICOLOR 1392 1404 tristate "Conexant Digicolor RTC" 1393 1405 depends on ARCH_DIGICOLOR || COMPILE_TEST ··· 2100 2088 tristate "Amlogic RTC" 2101 2089 depends on ARCH_MESON || COMPILE_TEST 2102 2090 select REGMAP_MMIO 2103 - default y 2091 + default ARCH_MESON 2104 2092 help 2105 2093 If you say yes here you get support for the RTC block on the 2106 2094 Amlogic A113L2(A4) and A113X2(A5) SoCs. 2107 2095 2108 2096 This driver can also be built as a module. If so, the module 2109 2097 will be called "rtc-amlogic-a4". 2098 + 2099 + config RTC_DRV_S32G 2100 + tristate "RTC driver for S32G2/S32G3 SoCs" 2101 + depends on ARCH_S32 || COMPILE_TEST 2102 + depends on COMMON_CLK 2103 + help 2104 + Say yes to enable RTC driver for platforms based on the 2105 + S32G2/S32G3 SoC family. 2106 + 2107 + This RTC module can be used as a wakeup source. 2108 + Please note that it is not battery-powered. 2110 2109 2111 2110 endif # RTC_CLASS
+2
drivers/rtc/Makefile
··· 44 44 obj-$(CONFIG_RTC_DRV_CMOS) += rtc-cmos.o 45 45 obj-$(CONFIG_RTC_DRV_CPCAP) += rtc-cpcap.o 46 46 obj-$(CONFIG_RTC_DRV_CROS_EC) += rtc-cros-ec.o 47 + obj-$(CONFIG_RTC_DRV_CV1800) += rtc-cv1800.o 47 48 obj-$(CONFIG_RTC_DRV_DA9052) += rtc-da9052.o 48 49 obj-$(CONFIG_RTC_DRV_DA9055) += rtc-da9055.o 49 50 obj-$(CONFIG_RTC_DRV_DA9063) += rtc-da9063.o ··· 161 160 obj-$(CONFIG_RTC_DRV_RX8581) += rtc-rx8581.o 162 161 obj-$(CONFIG_RTC_DRV_RZN1) += rtc-rzn1.o 163 162 obj-$(CONFIG_RTC_DRV_RENESAS_RTCA3) += rtc-renesas-rtca3.o 163 + obj-$(CONFIG_RTC_DRV_S32G) += rtc-s32g.o 164 164 obj-$(CONFIG_RTC_DRV_S35390A) += rtc-s35390a.o 165 165 obj-$(CONFIG_RTC_DRV_S3C) += rtc-s3c.o 166 166 obj-$(CONFIG_RTC_DRV_S5M) += rtc-s5m.o
+1 -1
drivers/rtc/class.c
··· 326 326 * 327 327 * Otherwise the offset seconds should be 0. 328 328 */ 329 - if (rtc->start_secs > rtc->range_max || 329 + if ((rtc->start_secs >= 0 && rtc->start_secs > rtc->range_max) || 330 330 rtc->start_secs + range_secs - 1 < rtc->range_min) 331 331 rtc->offset_secs = rtc->start_secs - rtc->range_min; 332 332 else if (rtc->start_secs > rtc->range_min)
+1 -1
drivers/rtc/interface.c
··· 205 205 206 206 mutex_unlock(&rtc->ops_lock); 207 207 208 - trace_rtc_read_alarm(rtc_tm_to_time64(&alarm->time), err); 208 + trace_rtc_read_alarm(err?0:rtc_tm_to_time64(&alarm->time), err); 209 209 return err; 210 210 } 211 211
+19 -5
drivers/rtc/lib.c
··· 46 46 * rtc_time64_to_tm - converts time64_t to rtc_time. 47 47 * 48 48 * @time: The number of seconds since 01-01-1970 00:00:00. 49 - * (Must be positive.) 49 + * Works for values since at least 1900 50 50 * @tm: Pointer to the struct rtc_time. 51 51 */ 52 52 void rtc_time64_to_tm(time64_t time, struct rtc_time *tm) 53 53 { 54 - unsigned int secs; 55 - int days; 54 + int days, secs; 56 55 57 56 u64 u64tmp; 58 57 u32 u32tmp, udays, century, day_of_century, year_of_century, year, 59 58 day_of_year, month, day; 60 59 bool is_Jan_or_Feb, is_leap_year; 61 60 62 - /* time must be positive */ 61 + /* 62 + * Get days and seconds while preserving the sign to 63 + * handle negative time values (dates before 1970-01-01) 64 + */ 63 65 days = div_s64_rem(time, 86400, &secs); 66 + 67 + /* 68 + * We need 0 <= secs < 86400 which isn't given for negative 69 + * values of time. Fixup accordingly. 70 + */ 71 + if (secs < 0) { 72 + days -= 1; 73 + secs += 86400; 74 + } 64 75 65 76 /* day of the week, 1970-01-01 was a Thursday */ 66 77 tm->tm_wday = (days + 4) % 7; 78 + /* Ensure tm_wday is always positive */ 79 + if (tm->tm_wday < 0) 80 + tm->tm_wday += 7; 67 81 68 82 /* 69 83 * The following algorithm is, basically, Proposition 6.3 of Neri ··· 107 93 * thus, is slightly different from [1]. 108 94 */ 109 95 110 - udays = ((u32) days) + 719468; 96 + udays = days + 719468; 111 97 112 98 u32tmp = 4 * udays + 3; 113 99 century = u32tmp / 146097;
+16 -11
drivers/rtc/lib_test.c
··· 6 6 /* 7 7 * Advance a date by one day. 8 8 */ 9 - static void advance_date(int *year, int *month, int *mday, int *yday) 9 + static void advance_date(int *year, int *month, int *mday, int *yday, int *wday) 10 10 { 11 + *wday = (*wday + 1) % 7; 12 + 11 13 if (*mday != rtc_month_days(*month - 1, *year)) { 12 14 ++*mday; 13 15 ++*yday; ··· 41 39 */ 42 40 time64_t total_secs = ((time64_t)years) / 400 * 146097 * 86400; 43 41 44 - int year = 1970; 42 + int year = 1900; 45 43 int month = 1; 46 44 int mday = 1; 47 45 int yday = 1; 46 + int wday = 1; /* Jan 1st 1900 was a Monday */ 48 47 49 48 struct rtc_time result; 50 49 time64_t secs; 51 - s64 days; 50 + const time64_t sec_offset = RTC_TIMESTAMP_BEGIN_1900 + ((1 * 60) + 2) * 60 + 3; 52 51 53 52 for (secs = 0; secs <= total_secs; secs += 86400) { 54 53 55 - rtc_time64_to_tm(secs, &result); 54 + rtc_time64_to_tm(secs + sec_offset, &result); 56 55 57 - days = div_s64(secs, 86400); 58 - 59 - #define FAIL_MSG "%d/%02d/%02d (%2d) : %lld", \ 60 - year, month, mday, yday, days 56 + #define FAIL_MSG "%d/%02d/%02d (%2d, %d) : %lld", \ 57 + year, month, mday, yday, wday, secs + sec_offset 61 58 62 59 KUNIT_ASSERT_EQ_MSG(test, year - 1900, result.tm_year, FAIL_MSG); 63 60 KUNIT_ASSERT_EQ_MSG(test, month - 1, result.tm_mon, FAIL_MSG); 64 61 KUNIT_ASSERT_EQ_MSG(test, mday, result.tm_mday, FAIL_MSG); 65 62 KUNIT_ASSERT_EQ_MSG(test, yday, result.tm_yday, FAIL_MSG); 63 + KUNIT_ASSERT_EQ_MSG(test, 1, result.tm_hour, FAIL_MSG); 64 + KUNIT_ASSERT_EQ_MSG(test, 2, result.tm_min, FAIL_MSG); 65 + KUNIT_ASSERT_EQ_MSG(test, 3, result.tm_sec, FAIL_MSG); 66 + KUNIT_ASSERT_EQ_MSG(test, wday, result.tm_wday, FAIL_MSG); 66 67 67 - advance_date(&year, &month, &mday, &yday); 68 + advance_date(&year, &month, &mday, &yday, &wday); 68 69 } 69 70 } 70 71 71 72 /* 72 - * Checks every day in a 160000 years interval starting on 1970-01-01 73 + * Checks every day in a 160000 years interval starting on 1900-01-01 73 74 * against the expected result. 74 75 */ 75 76 static void rtc_time64_to_tm_test_date_range_160000(struct kunit *test) ··· 81 76 } 82 77 83 78 /* 84 - * Checks every day in a 1000 years interval starting on 1970-01-01 79 + * Checks every day in a 1000 years interval starting on 1900-01-01 85 80 * against the expected result. 86 81 */ 87 82 static void rtc_time64_to_tm_test_date_range_1000(struct kunit *test)
-1
drivers/rtc/rtc-at91rm9200.c
··· 654 654 MODULE_AUTHOR("Rick Bronson"); 655 655 MODULE_DESCRIPTION("RTC driver for Atmel AT91RM9200"); 656 656 MODULE_LICENSE("GPL"); 657 - MODULE_ALIAS("platform:at91_rtc");
-1
drivers/rtc/rtc-cpcap.c
··· 320 320 321 321 module_platform_driver(cpcap_rtc_driver); 322 322 323 - MODULE_ALIAS("platform:cpcap-rtc"); 324 323 MODULE_DESCRIPTION("CPCAP RTC driver"); 325 324 MODULE_AUTHOR("Sebastian Reichel <sre@kernel.org>"); 326 325 MODULE_LICENSE("GPL");
+218
drivers/rtc/rtc-cv1800.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * rtc-cv1800.c: RTC driver for Sophgo cv1800 RTC 4 + * 5 + * Author: Jingbao Qiu <qiujingbao.dlmu@gmail.com> 6 + */ 7 + 8 + #include <linux/clk.h> 9 + #include <linux/irq.h> 10 + #include <linux/kernel.h> 11 + #include <linux/mfd/syscon.h> 12 + #include <linux/module.h> 13 + #include <linux/of.h> 14 + #include <linux/platform_device.h> 15 + #include <linux/regmap.h> 16 + #include <linux/rtc.h> 17 + 18 + #define SEC_PULSE_GEN 0x1004 19 + #define ALARM_TIME 0x1008 20 + #define ALARM_ENABLE 0x100C 21 + #define SET_SEC_CNTR_VAL 0x1010 22 + #define SET_SEC_CNTR_TRIG 0x1014 23 + #define SEC_CNTR_VAL 0x1018 24 + 25 + /* 26 + * When in VDDBKUP domain, this MACRO register 27 + * does not power down 28 + */ 29 + #define MACRO_RO_T 0x14A8 30 + #define MACRO_RG_SET_T 0x1498 31 + 32 + #define ALARM_ENABLE_MASK BIT(0) 33 + #define SEL_SEC_PULSE BIT(31) 34 + 35 + struct cv1800_rtc_priv { 36 + struct rtc_device *rtc_dev; 37 + struct regmap *rtc_map; 38 + struct clk *clk; 39 + int irq; 40 + }; 41 + 42 + static bool cv1800_rtc_enabled(struct device *dev) 43 + { 44 + struct cv1800_rtc_priv *info = dev_get_drvdata(dev); 45 + u32 reg; 46 + 47 + regmap_read(info->rtc_map, SEC_PULSE_GEN, &reg); 48 + 49 + return (reg & SEL_SEC_PULSE) == 0; 50 + } 51 + 52 + static void cv1800_rtc_enable(struct device *dev) 53 + { 54 + struct cv1800_rtc_priv *info = dev_get_drvdata(dev); 55 + 56 + /* Sec pulse generated internally */ 57 + regmap_update_bits(info->rtc_map, SEC_PULSE_GEN, SEL_SEC_PULSE, 0); 58 + } 59 + 60 + static int cv1800_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) 61 + { 62 + struct cv1800_rtc_priv *info = dev_get_drvdata(dev); 63 + 64 + regmap_write(info->rtc_map, ALARM_ENABLE, enabled); 65 + 66 + return 0; 67 + } 68 + 69 + static int cv1800_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) 70 + { 71 + struct cv1800_rtc_priv *info = dev_get_drvdata(dev); 72 + unsigned long alarm_time; 73 + 74 + alarm_time = rtc_tm_to_time64(&alrm->time); 75 + 76 + cv1800_rtc_alarm_irq_enable(dev, 0); 77 + 78 + regmap_write(info->rtc_map, ALARM_TIME, alarm_time); 79 + 80 + cv1800_rtc_alarm_irq_enable(dev, alrm->enabled); 81 + 82 + return 0; 83 + } 84 + 85 + static int cv1800_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm) 86 + { 87 + struct cv1800_rtc_priv *info = dev_get_drvdata(dev); 88 + u32 enabled; 89 + u32 time; 90 + 91 + if (!cv1800_rtc_enabled(dev)) { 92 + alarm->enabled = 0; 93 + return 0; 94 + } 95 + 96 + regmap_read(info->rtc_map, ALARM_ENABLE, &enabled); 97 + 98 + alarm->enabled = enabled & ALARM_ENABLE_MASK; 99 + 100 + regmap_read(info->rtc_map, ALARM_TIME, &time); 101 + 102 + rtc_time64_to_tm(time, &alarm->time); 103 + 104 + return 0; 105 + } 106 + 107 + static int cv1800_rtc_read_time(struct device *dev, struct rtc_time *tm) 108 + { 109 + struct cv1800_rtc_priv *info = dev_get_drvdata(dev); 110 + u32 sec; 111 + 112 + if (!cv1800_rtc_enabled(dev)) 113 + return -EINVAL; 114 + 115 + regmap_read(info->rtc_map, SEC_CNTR_VAL, &sec); 116 + 117 + rtc_time64_to_tm(sec, tm); 118 + 119 + return 0; 120 + } 121 + 122 + static int cv1800_rtc_set_time(struct device *dev, struct rtc_time *tm) 123 + { 124 + struct cv1800_rtc_priv *info = dev_get_drvdata(dev); 125 + unsigned long sec; 126 + 127 + sec = rtc_tm_to_time64(tm); 128 + 129 + regmap_write(info->rtc_map, SET_SEC_CNTR_VAL, sec); 130 + regmap_write(info->rtc_map, SET_SEC_CNTR_TRIG, 1); 131 + 132 + regmap_write(info->rtc_map, MACRO_RG_SET_T, sec); 133 + 134 + cv1800_rtc_enable(dev); 135 + 136 + return 0; 137 + } 138 + 139 + static irqreturn_t cv1800_rtc_irq_handler(int irq, void *dev_id) 140 + { 141 + struct cv1800_rtc_priv *info = dev_id; 142 + 143 + rtc_update_irq(info->rtc_dev, 1, RTC_IRQF | RTC_AF); 144 + 145 + regmap_write(info->rtc_map, ALARM_ENABLE, 0); 146 + 147 + return IRQ_HANDLED; 148 + } 149 + 150 + static const struct rtc_class_ops cv1800_rtc_ops = { 151 + .read_time = cv1800_rtc_read_time, 152 + .set_time = cv1800_rtc_set_time, 153 + .read_alarm = cv1800_rtc_read_alarm, 154 + .set_alarm = cv1800_rtc_set_alarm, 155 + .alarm_irq_enable = cv1800_rtc_alarm_irq_enable, 156 + }; 157 + 158 + static int cv1800_rtc_probe(struct platform_device *pdev) 159 + { 160 + struct cv1800_rtc_priv *rtc; 161 + int ret; 162 + 163 + rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); 164 + if (!rtc) 165 + return -ENOMEM; 166 + 167 + rtc->rtc_map = device_node_to_regmap(pdev->dev.parent->of_node); 168 + if (IS_ERR(rtc->rtc_map)) 169 + return dev_err_probe(&pdev->dev, PTR_ERR(rtc->rtc_map), 170 + "cannot get parent regmap\n"); 171 + 172 + rtc->irq = platform_get_irq(pdev, 0); 173 + if (rtc->irq < 0) 174 + return rtc->irq; 175 + 176 + rtc->clk = devm_clk_get_enabled(pdev->dev.parent, "rtc"); 177 + if (IS_ERR(rtc->clk)) 178 + return dev_err_probe(&pdev->dev, PTR_ERR(rtc->clk), 179 + "rtc clk not found\n"); 180 + 181 + platform_set_drvdata(pdev, rtc); 182 + 183 + device_init_wakeup(&pdev->dev, 1); 184 + 185 + rtc->rtc_dev = devm_rtc_allocate_device(&pdev->dev); 186 + if (IS_ERR(rtc->rtc_dev)) 187 + return PTR_ERR(rtc->rtc_dev); 188 + 189 + rtc->rtc_dev->ops = &cv1800_rtc_ops; 190 + rtc->rtc_dev->range_max = U32_MAX; 191 + 192 + ret = devm_request_irq(&pdev->dev, rtc->irq, cv1800_rtc_irq_handler, 193 + IRQF_TRIGGER_HIGH, "rtc alarm", rtc); 194 + if (ret) 195 + return dev_err_probe(&pdev->dev, ret, 196 + "cannot register interrupt handler\n"); 197 + 198 + return devm_rtc_register_device(rtc->rtc_dev); 199 + } 200 + 201 + static const struct platform_device_id cv1800_rtc_id[] = { 202 + { .name = "cv1800b-rtc" }, 203 + { /* sentinel */ }, 204 + }; 205 + MODULE_DEVICE_TABLE(platform, cv1800_rtc_id); 206 + 207 + static struct platform_driver cv1800_rtc_driver = { 208 + .driver = { 209 + .name = "sophgo-cv1800-rtc", 210 + }, 211 + .probe = cv1800_rtc_probe, 212 + .id_table = cv1800_rtc_id, 213 + }; 214 + 215 + module_platform_driver(cv1800_rtc_driver); 216 + MODULE_AUTHOR("Jingbao Qiu"); 217 + MODULE_DESCRIPTION("Sophgo cv1800 RTC Driver"); 218 + MODULE_LICENSE("GPL");
+6 -25
drivers/rtc/rtc-da9063.c
··· 194 194 config->rtc_count_year_mask; 195 195 } 196 196 197 - static int da9063_rtc_stop_alarm(struct device *dev) 197 + static int da9063_rtc_alarm_irq_enable(struct device *dev, 198 + unsigned int enabled) 198 199 { 199 200 struct da9063_compatible_rtc *rtc = dev_get_drvdata(dev); 200 201 const struct da9063_compatible_rtc_regmap *config = rtc->config; 202 + u8 set_bit = enabled ? config->rtc_alarm_on_mask : 0; 201 203 202 204 return regmap_update_bits(rtc->regmap, 203 205 config->rtc_alarm_year_reg, 204 206 config->rtc_alarm_on_mask, 205 - 0); 206 - } 207 - 208 - static int da9063_rtc_start_alarm(struct device *dev) 209 - { 210 - struct da9063_compatible_rtc *rtc = dev_get_drvdata(dev); 211 - const struct da9063_compatible_rtc_regmap *config = rtc->config; 212 - 213 - return regmap_update_bits(rtc->regmap, 214 - config->rtc_alarm_year_reg, 215 - config->rtc_alarm_on_mask, 216 - config->rtc_alarm_on_mask); 207 + set_bit); 217 208 } 218 209 219 210 static int da9063_rtc_read_time(struct device *dev, struct rtc_time *tm) ··· 303 312 304 313 da9063_tm_to_data(&alrm->time, data, rtc); 305 314 306 - ret = da9063_rtc_stop_alarm(dev); 315 + ret = da9063_rtc_alarm_irq_enable(dev, 0); 307 316 if (ret < 0) { 308 317 dev_err(dev, "Failed to stop alarm: %d\n", ret); 309 318 return ret; ··· 321 330 da9063_data_to_tm(data, &rtc->alarm_time, rtc); 322 331 323 332 if (alrm->enabled) { 324 - ret = da9063_rtc_start_alarm(dev); 333 + ret = da9063_rtc_alarm_irq_enable(dev, 1); 325 334 if (ret < 0) { 326 335 dev_err(dev, "Failed to start alarm: %d\n", ret); 327 336 return ret; ··· 329 338 } 330 339 331 340 return ret; 332 - } 333 - 334 - static int da9063_rtc_alarm_irq_enable(struct device *dev, 335 - unsigned int enabled) 336 - { 337 - if (enabled) 338 - return da9063_rtc_start_alarm(dev); 339 - else 340 - return da9063_rtc_stop_alarm(dev); 341 341 } 342 342 343 343 static irqreturn_t da9063_alarm_event(int irq, void *data) ··· 495 513 MODULE_AUTHOR("S Twiss <stwiss.opensource@diasemi.com>"); 496 514 MODULE_DESCRIPTION("Real time clock device driver for Dialog DA9063"); 497 515 MODULE_LICENSE("GPL"); 498 - MODULE_ALIAS("platform:" DA9063_DRVNAME_RTC);
-1
drivers/rtc/rtc-jz4740.c
··· 437 437 MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>"); 438 438 MODULE_LICENSE("GPL"); 439 439 MODULE_DESCRIPTION("RTC driver for the JZ4740 SoC\n"); 440 - MODULE_ALIAS("platform:jz4740-rtc");
+8
drivers/rtc/rtc-loongson.c
··· 129 129 { 130 130 struct loongson_rtc_priv *priv = (struct loongson_rtc_priv *)id; 131 131 132 + rtc_update_irq(priv->rtcdev, 1, RTC_AF | RTC_IRQF); 133 + 134 + /* 135 + * The TOY_MATCH0_REG should be cleared 0 here, 136 + * otherwise the interrupt cannot be cleared. 137 + */ 138 + regmap_write(priv->regmap, TOY_MATCH0_REG, 0); 139 + 132 140 spin_lock(&priv->lock); 133 141 /* Disable RTC alarm wakeup and interrupt */ 134 142 writel(readl(priv->pm_base + PM1_EN_REG) & ~RTC_EN,
+53 -25
drivers/rtc/rtc-m41t80.c
··· 22 22 #include <linux/slab.h> 23 23 #include <linux/mutex.h> 24 24 #include <linux/string.h> 25 + #include <linux/delay.h> 25 26 #ifdef CONFIG_RTC_DRV_M41T80_WDT 26 27 #include <linux/fs.h> 27 28 #include <linux/ioctl.h> ··· 205 204 return flags; 206 205 207 206 if (flags & M41T80_FLAGS_OF) { 208 - dev_err(&client->dev, "Oscillator failure, data is invalid.\n"); 207 + dev_err(&client->dev, "Oscillator failure, time may not be accurate, write time to RTC to fix it.\n"); 209 208 return -EINVAL; 210 209 } 211 210 212 211 err = i2c_smbus_read_i2c_block_data(client, M41T80_REG_SSEC, 213 212 sizeof(buf), buf); 214 213 if (err < 0) { 215 - dev_err(&client->dev, "Unable to read date\n"); 214 + dev_dbg(&client->dev, "Unable to read date\n"); 216 215 return err; 217 216 } 218 217 ··· 228 227 return 0; 229 228 } 230 229 231 - static int m41t80_rtc_set_time(struct device *dev, struct rtc_time *tm) 230 + static int m41t80_rtc_set_time(struct device *dev, struct rtc_time *in_tm) 232 231 { 233 232 struct i2c_client *client = to_i2c_client(dev); 234 233 struct m41t80_data *clientdata = i2c_get_clientdata(client); 234 + struct rtc_time tm = *in_tm; 235 235 unsigned char buf[8]; 236 236 int err, flags; 237 + time64_t time = 0; 237 238 239 + flags = i2c_smbus_read_byte_data(client, M41T80_REG_FLAGS); 240 + if (flags < 0) 241 + return flags; 242 + if (flags & M41T80_FLAGS_OF) { 243 + /* add 4sec of oscillator stablize time otherwise we are behind 4sec */ 244 + time = rtc_tm_to_time64(&tm); 245 + rtc_time64_to_tm(time + 4, &tm); 246 + } 238 247 buf[M41T80_REG_SSEC] = 0; 239 - buf[M41T80_REG_SEC] = bin2bcd(tm->tm_sec); 240 - buf[M41T80_REG_MIN] = bin2bcd(tm->tm_min); 241 - buf[M41T80_REG_HOUR] = bin2bcd(tm->tm_hour); 242 - buf[M41T80_REG_DAY] = bin2bcd(tm->tm_mday); 243 - buf[M41T80_REG_MON] = bin2bcd(tm->tm_mon + 1); 244 - buf[M41T80_REG_YEAR] = bin2bcd(tm->tm_year - 100); 245 - buf[M41T80_REG_WDAY] = tm->tm_wday; 248 + buf[M41T80_REG_SEC] = bin2bcd(tm.tm_sec); 249 + buf[M41T80_REG_MIN] = bin2bcd(tm.tm_min); 250 + buf[M41T80_REG_HOUR] = bin2bcd(tm.tm_hour); 251 + buf[M41T80_REG_DAY] = bin2bcd(tm.tm_mday); 252 + buf[M41T80_REG_MON] = bin2bcd(tm.tm_mon + 1); 253 + buf[M41T80_REG_YEAR] = bin2bcd(tm.tm_year - 100); 254 + buf[M41T80_REG_WDAY] = tm.tm_wday; 246 255 247 256 /* If the square wave output is controlled in the weekday register */ 248 257 if (clientdata->features & M41T80_FEATURE_SQ_ALT) { ··· 268 257 err = i2c_smbus_write_i2c_block_data(client, M41T80_REG_SSEC, 269 258 sizeof(buf), buf); 270 259 if (err < 0) { 271 - dev_err(&client->dev, "Unable to write to date registers\n"); 260 + dev_dbg(&client->dev, "Unable to write to date registers\n"); 272 261 return err; 273 262 } 274 - 275 - /* Clear the OF bit of Flags Register */ 276 - flags = i2c_smbus_read_byte_data(client, M41T80_REG_FLAGS); 277 - if (flags < 0) 278 - return flags; 279 - 280 - err = i2c_smbus_write_byte_data(client, M41T80_REG_FLAGS, 281 - flags & ~M41T80_FLAGS_OF); 282 - if (err < 0) { 283 - dev_err(&client->dev, "Unable to write flags register\n"); 284 - return err; 263 + if (flags & M41T80_FLAGS_OF) { 264 + /* OF cannot be immediately reset: oscillator has to be restarted. */ 265 + dev_warn(&client->dev, "OF bit is still set, kickstarting clock.\n"); 266 + err = i2c_smbus_write_byte_data(client, M41T80_REG_SEC, M41T80_SEC_ST); 267 + if (err < 0) { 268 + dev_dbg(&client->dev, "Can't set ST bit\n"); 269 + return err; 270 + } 271 + err = i2c_smbus_write_byte_data(client, M41T80_REG_SEC, flags & ~M41T80_SEC_ST); 272 + if (err < 0) { 273 + dev_dbg(&client->dev, "Can't clear ST bit\n"); 274 + return err; 275 + } 276 + /* oscillator must run for 4sec before we attempt to reset OF bit */ 277 + msleep(4000); 278 + /* Clear the OF bit of Flags Register */ 279 + err = i2c_smbus_write_byte_data(client, M41T80_REG_FLAGS, flags & ~M41T80_FLAGS_OF); 280 + if (err < 0) { 281 + dev_dbg(&client->dev, "Unable to write flags register\n"); 282 + return err; 283 + } 284 + flags = i2c_smbus_read_byte_data(client, M41T80_REG_FLAGS); 285 + if (flags < 0) { 286 + return flags; 287 + } else if (flags & M41T80_FLAGS_OF) { 288 + dev_dbg(&client->dev, "Can't clear the OF bit check battery\n"); 289 + return err; 290 + } 285 291 } 286 292 287 293 return err; ··· 336 308 337 309 retval = i2c_smbus_write_byte_data(client, M41T80_REG_ALARM_MON, flags); 338 310 if (retval < 0) { 339 - dev_err(dev, "Unable to enable alarm IRQ %d\n", retval); 311 + dev_dbg(dev, "Unable to enable alarm IRQ %d\n", retval); 340 312 return retval; 341 313 } 342 314 return 0; ··· 361 333 err = i2c_smbus_write_byte_data(client, M41T80_REG_ALARM_MON, 362 334 ret & ~(M41T80_ALMON_AFE)); 363 335 if (err < 0) { 364 - dev_err(dev, "Unable to clear AFE bit\n"); 336 + dev_dbg(dev, "Unable to clear AFE bit\n"); 365 337 return err; 366 338 } 367 339 ··· 375 347 err = i2c_smbus_write_byte_data(client, M41T80_REG_FLAGS, 376 348 ret & ~(M41T80_FLAGS_AF)); 377 349 if (err < 0) { 378 - dev_err(dev, "Unable to clear AF bit\n"); 350 + dev_dbg(dev, "Unable to clear AF bit\n"); 379 351 return err; 380 352 } 381 353
+1
drivers/rtc/rtc-mt6397.c
··· 332 332 333 333 static const struct of_device_id mt6397_rtc_of_match[] = { 334 334 { .compatible = "mediatek,mt6323-rtc", .data = &mt6397_rtc_data }, 335 + { .compatible = "mediatek,mt6357-rtc", .data = &mt6358_rtc_data }, 335 336 { .compatible = "mediatek,mt6358-rtc", .data = &mt6358_rtc_data }, 336 337 { .compatible = "mediatek,mt6397-rtc", .data = &mt6397_rtc_data }, 337 338 { }
+1 -1
drivers/rtc/rtc-pcf8563.c
··· 285 285 buf[2] = bin2bcd(tm->time.tm_mday); 286 286 buf[3] = tm->time.tm_wday & 0x07; 287 287 288 - err = regmap_bulk_write(pcf8563->regmap, PCF8563_REG_SC, buf, 288 + err = regmap_bulk_write(pcf8563->regmap, PCF8563_REG_AMN, buf, 289 289 sizeof(buf)); 290 290 if (err) 291 291 return err;
+12 -6
drivers/rtc/rtc-pm8xxx.c
··· 576 576 } 577 577 578 578 /* Use UEFI storage as fallback if available */ 579 - if (efivar_is_available()) { 580 - rc = pm8xxx_rtc_read_uefi_offset(rtc_dd); 581 - if (rc == 0) 582 - rtc_dd->use_uefi = true; 579 + rtc_dd->use_uefi = of_property_read_bool(rtc_dd->dev->of_node, 580 + "qcom,uefi-rtc-info"); 581 + if (!rtc_dd->use_uefi) 582 + return 0; 583 + 584 + if (!efivar_is_available()) { 585 + if (IS_ENABLED(CONFIG_EFI)) 586 + return -EPROBE_DEFER; 587 + 588 + dev_warn(rtc_dd->dev, "efivars not available\n"); 589 + rtc_dd->use_uefi = false; 583 590 } 584 591 585 - return 0; 592 + return pm8xxx_rtc_read_uefi_offset(rtc_dd); 586 593 } 587 594 588 595 static int pm8xxx_rtc_probe(struct platform_device *pdev) ··· 683 676 684 677 module_platform_driver(pm8xxx_rtc_driver); 685 678 686 - MODULE_ALIAS("platform:rtc-pm8xxx"); 687 679 MODULE_DESCRIPTION("PMIC8xxx RTC driver"); 688 680 MODULE_LICENSE("GPL v2"); 689 681 MODULE_AUTHOR("Anirudh Ghayal <aghayal@codeaurora.org>");
+60 -11
drivers/rtc/rtc-rzn1.c
··· 12 12 */ 13 13 14 14 #include <linux/bcd.h> 15 + #include <linux/clk.h> 15 16 #include <linux/init.h> 16 17 #include <linux/iopoll.h> 17 18 #include <linux/module.h> ··· 23 22 #include <linux/spinlock.h> 24 23 25 24 #define RZN1_RTC_CTL0 0x00 26 - #define RZN1_RTC_CTL0_SLSB_SUBU 0 27 25 #define RZN1_RTC_CTL0_SLSB_SCMP BIT(4) 28 26 #define RZN1_RTC_CTL0_AMPM BIT(5) 27 + #define RZN1_RTC_CTL0_CEST BIT(6) 29 28 #define RZN1_RTC_CTL0_CE BIT(7) 30 29 31 30 #define RZN1_RTC_CTL1 0x04 ··· 49 48 #define RZN1_RTC_SUBU 0x38 50 49 #define RZN1_RTC_SUBU_DEV BIT(7) 51 50 #define RZN1_RTC_SUBU_DECR BIT(6) 51 + 52 + #define RZN1_RTC_SCMP 0x3c 52 53 53 54 #define RZN1_RTC_ALM 0x40 54 55 #define RZN1_RTC_ALH 0x44 ··· 359 356 return 0; 360 357 } 361 358 362 - static const struct rtc_class_ops rzn1_rtc_ops = { 359 + static const struct rtc_class_ops rzn1_rtc_ops_subu = { 363 360 .read_time = rzn1_rtc_read_time, 364 361 .set_time = rzn1_rtc_set_time, 365 362 .read_alarm = rzn1_rtc_read_alarm, ··· 369 366 .set_offset = rzn1_rtc_set_offset, 370 367 }; 371 368 369 + static const struct rtc_class_ops rzn1_rtc_ops_scmp = { 370 + .read_time = rzn1_rtc_read_time, 371 + .set_time = rzn1_rtc_set_time, 372 + .read_alarm = rzn1_rtc_read_alarm, 373 + .set_alarm = rzn1_rtc_set_alarm, 374 + .alarm_irq_enable = rzn1_rtc_alarm_irq_enable, 375 + }; 376 + 372 377 static int rzn1_rtc_probe(struct platform_device *pdev) 373 378 { 374 379 struct rzn1_rtc *rtc; 375 - int irq; 376 - int ret; 380 + u32 val, scmp_val = 0; 381 + struct clk *xtal; 382 + unsigned long rate; 383 + int irq, ret; 377 384 378 385 rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); 379 386 if (!rtc) ··· 406 393 rtc->rtcdev->range_min = RTC_TIMESTAMP_BEGIN_2000; 407 394 rtc->rtcdev->range_max = RTC_TIMESTAMP_END_2099; 408 395 rtc->rtcdev->alarm_offset_max = 7 * 86400; 409 - rtc->rtcdev->ops = &rzn1_rtc_ops; 410 396 411 397 ret = devm_pm_runtime_enable(&pdev->dev); 412 398 if (ret < 0) ··· 414 402 if (ret < 0) 415 403 return ret; 416 404 417 - /* 418 - * Ensure the clock counter is enabled. 419 - * Set 24-hour mode and possible oscillator offset compensation in SUBU mode. 420 - */ 421 - writel(RZN1_RTC_CTL0_CE | RZN1_RTC_CTL0_AMPM | RZN1_RTC_CTL0_SLSB_SUBU, 422 - rtc->base + RZN1_RTC_CTL0); 405 + /* Only switch to scmp if we have an xtal clock with a valid rate and != 32768 */ 406 + xtal = devm_clk_get_optional(&pdev->dev, "xtal"); 407 + if (IS_ERR(xtal)) { 408 + ret = PTR_ERR(xtal); 409 + goto dis_runtime_pm; 410 + } else if (xtal) { 411 + rate = clk_get_rate(xtal); 412 + 413 + if (rate < 32000 || rate > BIT(22)) { 414 + ret = -EOPNOTSUPP; 415 + goto dis_runtime_pm; 416 + } 417 + 418 + if (rate != 32768) 419 + scmp_val = RZN1_RTC_CTL0_SLSB_SCMP; 420 + } 421 + 422 + /* Disable controller during SUBU/SCMP setup */ 423 + val = readl(rtc->base + RZN1_RTC_CTL0) & ~RZN1_RTC_CTL0_CE; 424 + writel(val, rtc->base + RZN1_RTC_CTL0); 425 + /* Wait 2-4 32k clock cycles for the disabled controller */ 426 + ret = readl_poll_timeout(rtc->base + RZN1_RTC_CTL0, val, 427 + !(val & RZN1_RTC_CTL0_CEST), 62, 123); 428 + if (ret) 429 + goto dis_runtime_pm; 430 + 431 + /* Set desired modes leaving the controller disabled */ 432 + writel(RZN1_RTC_CTL0_AMPM | scmp_val, rtc->base + RZN1_RTC_CTL0); 433 + 434 + if (scmp_val) { 435 + writel(rate - 1, rtc->base + RZN1_RTC_SCMP); 436 + rtc->rtcdev->ops = &rzn1_rtc_ops_scmp; 437 + } else { 438 + rtc->rtcdev->ops = &rzn1_rtc_ops_subu; 439 + } 440 + 441 + /* Enable controller finally */ 442 + writel(RZN1_RTC_CTL0_CE | RZN1_RTC_CTL0_AMPM | scmp_val, rtc->base + RZN1_RTC_CTL0); 423 443 424 444 /* Disable all interrupts */ 425 445 writel(0, rtc->base + RZN1_RTC_CTL1); ··· 488 444 489 445 static void rzn1_rtc_remove(struct platform_device *pdev) 490 446 { 447 + struct rzn1_rtc *rtc = platform_get_drvdata(pdev); 448 + 449 + /* Disable all interrupts */ 450 + writel(0, rtc->base + RZN1_RTC_CTL1); 451 + 491 452 pm_runtime_put(&pdev->dev); 492 453 } 493 454
+385
drivers/rtc/rtc-s32g.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-or-later 2 + /* 3 + * Copyright 2025 NXP 4 + */ 5 + 6 + #include <linux/bitfield.h> 7 + #include <linux/clk.h> 8 + #include <linux/iopoll.h> 9 + #include <linux/of_irq.h> 10 + #include <linux/platform_device.h> 11 + #include <linux/rtc.h> 12 + 13 + #define RTCC_OFFSET 0x4ul 14 + #define RTCS_OFFSET 0x8ul 15 + #define APIVAL_OFFSET 0x10ul 16 + 17 + /* RTCC fields */ 18 + #define RTCC_CNTEN BIT(31) 19 + #define RTCC_APIEN BIT(15) 20 + #define RTCC_APIIE BIT(14) 21 + #define RTCC_CLKSEL_MASK GENMASK(13, 12) 22 + #define RTCC_DIV512EN BIT(11) 23 + #define RTCC_DIV32EN BIT(10) 24 + 25 + /* RTCS fields */ 26 + #define RTCS_INV_API BIT(17) 27 + #define RTCS_APIF BIT(13) 28 + 29 + #define APIVAL_MAX_VAL GENMASK(31, 0) 30 + #define RTC_SYNCH_TIMEOUT (100 * USEC_PER_MSEC) 31 + 32 + /* 33 + * S32G2 and S32G3 SoCs have RTC clock source1 reserved and 34 + * should not be used. 35 + */ 36 + #define RTC_CLK_SRC1_RESERVED BIT(1) 37 + 38 + /* 39 + * S32G RTC module has a 512 value and a 32 value hardware frequency 40 + * divisors (DIV512 and DIV32) which could be used to achieve higher 41 + * counter ranges by lowering the RTC frequency. 42 + */ 43 + enum { 44 + DIV1 = 1, 45 + DIV32 = 32, 46 + DIV512 = 512, 47 + DIV512_32 = 16384 48 + }; 49 + 50 + static const char *const rtc_clk_src[] = { 51 + "source0", 52 + "source1", 53 + "source2", 54 + "source3" 55 + }; 56 + 57 + struct rtc_priv { 58 + struct rtc_device *rdev; 59 + void __iomem *rtc_base; 60 + struct clk *ipg; 61 + struct clk *clk_src; 62 + const struct rtc_soc_data *rtc_data; 63 + u64 rtc_hz; 64 + time64_t sleep_sec; 65 + int irq; 66 + u32 clk_src_idx; 67 + }; 68 + 69 + struct rtc_soc_data { 70 + u32 clk_div; 71 + u32 reserved_clk_mask; 72 + }; 73 + 74 + static const struct rtc_soc_data rtc_s32g2_data = { 75 + .clk_div = DIV512_32, 76 + .reserved_clk_mask = RTC_CLK_SRC1_RESERVED, 77 + }; 78 + 79 + static irqreturn_t s32g_rtc_handler(int irq, void *dev) 80 + { 81 + struct rtc_priv *priv = platform_get_drvdata(dev); 82 + u32 status; 83 + 84 + status = readl(priv->rtc_base + RTCS_OFFSET); 85 + 86 + if (status & RTCS_APIF) { 87 + writel(0x0, priv->rtc_base + APIVAL_OFFSET); 88 + writel(status | RTCS_APIF, priv->rtc_base + RTCS_OFFSET); 89 + } 90 + 91 + rtc_update_irq(priv->rdev, 1, RTC_IRQF | RTC_AF); 92 + 93 + return IRQ_HANDLED; 94 + } 95 + 96 + /* 97 + * The function is not really getting time from the RTC since the S32G RTC 98 + * has several limitations. Thus, to setup alarm use system time. 99 + */ 100 + static int s32g_rtc_read_time(struct device *dev, 101 + struct rtc_time *tm) 102 + { 103 + struct rtc_priv *priv = dev_get_drvdata(dev); 104 + time64_t sec; 105 + 106 + if (check_add_overflow(ktime_get_real_seconds(), 107 + priv->sleep_sec, &sec)) 108 + return -ERANGE; 109 + 110 + rtc_time64_to_tm(sec, tm); 111 + 112 + return 0; 113 + } 114 + 115 + static int s32g_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) 116 + { 117 + struct rtc_priv *priv = dev_get_drvdata(dev); 118 + u32 rtcc, rtcs; 119 + 120 + rtcc = readl(priv->rtc_base + RTCC_OFFSET); 121 + rtcs = readl(priv->rtc_base + RTCS_OFFSET); 122 + 123 + alrm->enabled = rtcc & RTCC_APIIE; 124 + if (alrm->enabled) 125 + alrm->pending = !(rtcs & RTCS_APIF); 126 + 127 + return 0; 128 + } 129 + 130 + static int s32g_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) 131 + { 132 + struct rtc_priv *priv = dev_get_drvdata(dev); 133 + u32 rtcc; 134 + 135 + /* RTC API functionality is used both for triggering interrupts 136 + * and as a wakeup event. Hence it should always be enabled. 137 + */ 138 + rtcc = readl(priv->rtc_base + RTCC_OFFSET); 139 + rtcc |= RTCC_APIEN | RTCC_APIIE; 140 + writel(rtcc, priv->rtc_base + RTCC_OFFSET); 141 + 142 + return 0; 143 + } 144 + 145 + static int s32g_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) 146 + { 147 + struct rtc_priv *priv = dev_get_drvdata(dev); 148 + unsigned long long cycles; 149 + long long t_offset; 150 + time64_t alrm_time; 151 + u32 rtcs; 152 + int ret; 153 + 154 + alrm_time = rtc_tm_to_time64(&alrm->time); 155 + t_offset = alrm_time - ktime_get_real_seconds() - priv->sleep_sec; 156 + if (t_offset < 0) 157 + return -ERANGE; 158 + 159 + cycles = t_offset * priv->rtc_hz; 160 + if (cycles > APIVAL_MAX_VAL) 161 + return -ERANGE; 162 + 163 + /* APIVAL could have been reset from the IRQ handler. 164 + * Hence, we wait in case there is a synchronization process. 165 + */ 166 + ret = read_poll_timeout(readl, rtcs, !(rtcs & RTCS_INV_API), 167 + 0, RTC_SYNCH_TIMEOUT, false, priv->rtc_base + RTCS_OFFSET); 168 + if (ret) 169 + return ret; 170 + 171 + writel(cycles, priv->rtc_base + APIVAL_OFFSET); 172 + 173 + return read_poll_timeout(readl, rtcs, !(rtcs & RTCS_INV_API), 174 + 0, RTC_SYNCH_TIMEOUT, false, priv->rtc_base + RTCS_OFFSET); 175 + } 176 + 177 + /* 178 + * Disable the 32-bit free running counter. 179 + * This allows Clock Source and Divisors selection 180 + * to be performed without causing synchronization issues. 181 + */ 182 + static void s32g_rtc_disable(struct rtc_priv *priv) 183 + { 184 + u32 rtcc = readl(priv->rtc_base + RTCC_OFFSET); 185 + 186 + rtcc &= ~RTCC_CNTEN; 187 + writel(rtcc, priv->rtc_base + RTCC_OFFSET); 188 + } 189 + 190 + static void s32g_rtc_enable(struct rtc_priv *priv) 191 + { 192 + u32 rtcc = readl(priv->rtc_base + RTCC_OFFSET); 193 + 194 + rtcc |= RTCC_CNTEN; 195 + writel(rtcc, priv->rtc_base + RTCC_OFFSET); 196 + } 197 + 198 + static int rtc_clk_src_setup(struct rtc_priv *priv) 199 + { 200 + u32 rtcc; 201 + 202 + rtcc = FIELD_PREP(RTCC_CLKSEL_MASK, priv->clk_src_idx); 203 + 204 + switch (priv->rtc_data->clk_div) { 205 + case DIV512_32: 206 + rtcc |= RTCC_DIV512EN; 207 + rtcc |= RTCC_DIV32EN; 208 + break; 209 + case DIV512: 210 + rtcc |= RTCC_DIV512EN; 211 + break; 212 + case DIV32: 213 + rtcc |= RTCC_DIV32EN; 214 + break; 215 + case DIV1: 216 + break; 217 + default: 218 + return -EINVAL; 219 + } 220 + 221 + rtcc |= RTCC_APIEN | RTCC_APIIE; 222 + /* 223 + * Make sure the CNTEN is 0 before we configure 224 + * the clock source and dividers. 225 + */ 226 + s32g_rtc_disable(priv); 227 + writel(rtcc, priv->rtc_base + RTCC_OFFSET); 228 + s32g_rtc_enable(priv); 229 + 230 + return 0; 231 + } 232 + 233 + static const struct rtc_class_ops rtc_ops = { 234 + .read_time = s32g_rtc_read_time, 235 + .read_alarm = s32g_rtc_read_alarm, 236 + .set_alarm = s32g_rtc_set_alarm, 237 + .alarm_irq_enable = s32g_rtc_alarm_irq_enable, 238 + }; 239 + 240 + static int rtc_clk_dts_setup(struct rtc_priv *priv, 241 + struct device *dev) 242 + { 243 + u32 i; 244 + 245 + priv->ipg = devm_clk_get_enabled(dev, "ipg"); 246 + if (IS_ERR(priv->ipg)) 247 + return dev_err_probe(dev, PTR_ERR(priv->ipg), 248 + "Failed to get 'ipg' clock\n"); 249 + 250 + for (i = 0; i < ARRAY_SIZE(rtc_clk_src); i++) { 251 + if (priv->rtc_data->reserved_clk_mask & BIT(i)) 252 + return -EOPNOTSUPP; 253 + 254 + priv->clk_src = devm_clk_get_enabled(dev, rtc_clk_src[i]); 255 + if (!IS_ERR(priv->clk_src)) { 256 + priv->clk_src_idx = i; 257 + break; 258 + } 259 + } 260 + 261 + if (IS_ERR(priv->clk_src)) 262 + return dev_err_probe(dev, PTR_ERR(priv->clk_src), 263 + "Failed to get rtc module clock source\n"); 264 + 265 + return 0; 266 + } 267 + 268 + static int s32g_rtc_probe(struct platform_device *pdev) 269 + { 270 + struct device *dev = &pdev->dev; 271 + struct rtc_priv *priv; 272 + unsigned long rtc_hz; 273 + int ret; 274 + 275 + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); 276 + if (!priv) 277 + return -ENOMEM; 278 + 279 + priv->rtc_data = of_device_get_match_data(dev); 280 + if (!priv->rtc_data) 281 + return -ENODEV; 282 + 283 + priv->rtc_base = devm_platform_ioremap_resource(pdev, 0); 284 + if (IS_ERR(priv->rtc_base)) 285 + return PTR_ERR(priv->rtc_base); 286 + 287 + device_init_wakeup(dev, true); 288 + 289 + ret = rtc_clk_dts_setup(priv, dev); 290 + if (ret) 291 + return ret; 292 + 293 + priv->rdev = devm_rtc_allocate_device(dev); 294 + if (IS_ERR(priv->rdev)) 295 + return PTR_ERR(priv->rdev); 296 + 297 + ret = rtc_clk_src_setup(priv); 298 + if (ret) 299 + return ret; 300 + 301 + priv->irq = platform_get_irq(pdev, 0); 302 + if (priv->irq < 0) { 303 + ret = priv->irq; 304 + goto disable_rtc; 305 + } 306 + 307 + rtc_hz = clk_get_rate(priv->clk_src); 308 + if (!rtc_hz) { 309 + dev_err(dev, "Failed to get RTC frequency\n"); 310 + ret = -EINVAL; 311 + goto disable_rtc; 312 + } 313 + 314 + priv->rtc_hz = DIV_ROUND_UP(rtc_hz, priv->rtc_data->clk_div); 315 + 316 + platform_set_drvdata(pdev, priv); 317 + priv->rdev->ops = &rtc_ops; 318 + 319 + ret = devm_request_irq(dev, priv->irq, 320 + s32g_rtc_handler, 0, dev_name(dev), pdev); 321 + if (ret) { 322 + dev_err(dev, "Request interrupt %d failed, error: %d\n", 323 + priv->irq, ret); 324 + goto disable_rtc; 325 + } 326 + 327 + ret = devm_rtc_register_device(priv->rdev); 328 + if (ret) 329 + goto disable_rtc; 330 + 331 + return 0; 332 + 333 + disable_rtc: 334 + s32g_rtc_disable(priv); 335 + return ret; 336 + } 337 + 338 + static int s32g_rtc_suspend(struct device *dev) 339 + { 340 + struct rtc_priv *priv = dev_get_drvdata(dev); 341 + u32 apival = readl(priv->rtc_base + APIVAL_OFFSET); 342 + 343 + if (check_add_overflow(priv->sleep_sec, div64_u64(apival, priv->rtc_hz), 344 + &priv->sleep_sec)) { 345 + dev_warn(dev, "Overflow on sleep cycles occurred. Resetting to 0.\n"); 346 + priv->sleep_sec = 0; 347 + } 348 + 349 + return 0; 350 + } 351 + 352 + static int s32g_rtc_resume(struct device *dev) 353 + { 354 + struct rtc_priv *priv = dev_get_drvdata(dev); 355 + 356 + /* The transition from resume to run is a reset event. 357 + * This leads to the RTC registers being reset after resume from 358 + * suspend. It is uncommon, but this behaviour has been observed 359 + * on S32G RTC after issuing a Suspend to RAM operation. 360 + * Thus, reconfigure RTC registers on the resume path. 361 + */ 362 + return rtc_clk_src_setup(priv); 363 + } 364 + 365 + static const struct of_device_id rtc_dt_ids[] = { 366 + { .compatible = "nxp,s32g2-rtc", .data = &rtc_s32g2_data }, 367 + { /* sentinel */ }, 368 + }; 369 + 370 + static DEFINE_SIMPLE_DEV_PM_OPS(s32g_rtc_pm_ops, 371 + s32g_rtc_suspend, s32g_rtc_resume); 372 + 373 + static struct platform_driver s32g_rtc_driver = { 374 + .driver = { 375 + .name = "s32g-rtc", 376 + .pm = pm_sleep_ptr(&s32g_rtc_pm_ops), 377 + .of_match_table = rtc_dt_ids, 378 + }, 379 + .probe = s32g_rtc_probe, 380 + }; 381 + module_platform_driver(s32g_rtc_driver); 382 + 383 + MODULE_AUTHOR("NXP"); 384 + MODULE_DESCRIPTION("NXP RTC driver for S32G2/S32G3"); 385 + MODULE_LICENSE("GPL");
-1
drivers/rtc/rtc-s3c.c
··· 609 609 MODULE_DESCRIPTION("Samsung S3C RTC Driver"); 610 610 MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>"); 611 611 MODULE_LICENSE("GPL"); 612 - MODULE_ALIAS("platform:s3c2410-rtc");
+51 -234
drivers/rtc/rtc-sh.c
··· 5 5 * Copyright (C) 2006 - 2009 Paul Mundt 6 6 * Copyright (C) 2006 Jamie Lenehan 7 7 * Copyright (C) 2008 Angelo Castello 8 + * Copyright (C) 2025 Wolfram Sang, Renesas Electronics Corporation 8 9 * 9 10 * Based on the old arch/sh/kernel/cpu/rtc.c by: 10 11 * ··· 32 31 /* Default values for RZ/A RTC */ 33 32 #define rtc_reg_size sizeof(u16) 34 33 #define RTC_BIT_INVERTED 0 /* no chip bugs */ 35 - #define RTC_CAP_4_DIGIT_YEAR (1 << 0) 34 + #define RTC_CAP_4_DIGIT_YEAR BIT(0) 36 35 #define RTC_DEF_CAPABILITIES RTC_CAP_4_DIGIT_YEAR 37 36 #endif 38 37 ··· 71 70 */ 72 71 73 72 /* ALARM Bits - or with BCD encoded value */ 74 - #define AR_ENB 0x80 /* Enable for alarm cmp */ 75 - 76 - /* Period Bits */ 77 - #define PF_HP 0x100 /* Enable Half Period to support 8,32,128Hz */ 78 - #define PF_COUNT 0x200 /* Half periodic counter */ 79 - #define PF_OXS 0x400 /* Periodic One x Second */ 80 - #define PF_KOU 0x800 /* Kernel or User periodic request 1=kernel */ 81 - #define PF_MASK 0xf00 73 + #define AR_ENB BIT(7) /* Enable for alarm cmp */ 82 74 83 75 /* RCR1 Bits */ 84 - #define RCR1_CF 0x80 /* Carry Flag */ 85 - #define RCR1_CIE 0x10 /* Carry Interrupt Enable */ 86 - #define RCR1_AIE 0x08 /* Alarm Interrupt Enable */ 87 - #define RCR1_AF 0x01 /* Alarm Flag */ 76 + #define RCR1_CF BIT(7) /* Carry Flag */ 77 + #define RCR1_CIE BIT(4) /* Carry Interrupt Enable */ 78 + #define RCR1_AIE BIT(3) /* Alarm Interrupt Enable */ 79 + #define RCR1_AF BIT(0) /* Alarm Flag */ 88 80 89 81 /* RCR2 Bits */ 90 - #define RCR2_PEF 0x80 /* PEriodic interrupt Flag */ 91 - #define RCR2_PESMASK 0x70 /* Periodic interrupt Set */ 92 - #define RCR2_RTCEN 0x08 /* ENable RTC */ 93 - #define RCR2_ADJ 0x04 /* ADJustment (30-second) */ 94 - #define RCR2_RESET 0x02 /* Reset bit */ 95 - #define RCR2_START 0x01 /* Start bit */ 82 + #define RCR2_RTCEN BIT(3) /* ENable RTC */ 83 + #define RCR2_ADJ BIT(2) /* ADJustment (30-second) */ 84 + #define RCR2_RESET BIT(1) /* Reset bit */ 85 + #define RCR2_START BIT(0) /* Start bit */ 96 86 97 87 struct sh_rtc { 98 88 void __iomem *regbase; 99 - unsigned long regsize; 100 - struct resource *res; 101 89 int alarm_irq; 102 - int periodic_irq; 103 - int carry_irq; 104 90 struct clk *clk; 105 91 struct rtc_device *rtc_dev; 106 - spinlock_t lock; 92 + spinlock_t lock; /* protecting register access */ 107 93 unsigned long capabilities; /* See asm/rtc.h for cap bits */ 108 - unsigned short periodic_freq; 109 94 }; 110 95 111 - static int __sh_rtc_interrupt(struct sh_rtc *rtc) 96 + static irqreturn_t sh_rtc_alarm(int irq, void *dev_id) 112 97 { 98 + struct sh_rtc *rtc = dev_id; 113 99 unsigned int tmp, pending; 114 100 115 - tmp = readb(rtc->regbase + RCR1); 116 - pending = tmp & RCR1_CF; 117 - tmp &= ~RCR1_CF; 118 - writeb(tmp, rtc->regbase + RCR1); 119 - 120 - /* Users have requested One x Second IRQ */ 121 - if (pending && rtc->periodic_freq & PF_OXS) 122 - rtc_update_irq(rtc->rtc_dev, 1, RTC_UF | RTC_IRQF); 123 - 124 - return pending; 125 - } 126 - 127 - static int __sh_rtc_alarm(struct sh_rtc *rtc) 128 - { 129 - unsigned int tmp, pending; 101 + spin_lock(&rtc->lock); 130 102 131 103 tmp = readb(rtc->regbase + RCR1); 132 104 pending = tmp & RCR1_AF; ··· 109 135 if (pending) 110 136 rtc_update_irq(rtc->rtc_dev, 1, RTC_AF | RTC_IRQF); 111 137 112 - return pending; 113 - } 114 - 115 - static int __sh_rtc_periodic(struct sh_rtc *rtc) 116 - { 117 - unsigned int tmp, pending; 118 - 119 - tmp = readb(rtc->regbase + RCR2); 120 - pending = tmp & RCR2_PEF; 121 - tmp &= ~RCR2_PEF; 122 - writeb(tmp, rtc->regbase + RCR2); 123 - 124 - if (!pending) 125 - return 0; 126 - 127 - /* Half period enabled than one skipped and the next notified */ 128 - if ((rtc->periodic_freq & PF_HP) && (rtc->periodic_freq & PF_COUNT)) 129 - rtc->periodic_freq &= ~PF_COUNT; 130 - else { 131 - if (rtc->periodic_freq & PF_HP) 132 - rtc->periodic_freq |= PF_COUNT; 133 - rtc_update_irq(rtc->rtc_dev, 1, RTC_PF | RTC_IRQF); 134 - } 135 - 136 - return pending; 137 - } 138 - 139 - static irqreturn_t sh_rtc_interrupt(int irq, void *dev_id) 140 - { 141 - struct sh_rtc *rtc = dev_id; 142 - int ret; 143 - 144 - spin_lock(&rtc->lock); 145 - ret = __sh_rtc_interrupt(rtc); 146 138 spin_unlock(&rtc->lock); 147 139 148 - return IRQ_RETVAL(ret); 140 + return IRQ_RETVAL(pending); 149 141 } 150 142 151 - static irqreturn_t sh_rtc_alarm(int irq, void *dev_id) 152 - { 153 - struct sh_rtc *rtc = dev_id; 154 - int ret; 155 - 156 - spin_lock(&rtc->lock); 157 - ret = __sh_rtc_alarm(rtc); 158 - spin_unlock(&rtc->lock); 159 - 160 - return IRQ_RETVAL(ret); 161 - } 162 - 163 - static irqreturn_t sh_rtc_periodic(int irq, void *dev_id) 164 - { 165 - struct sh_rtc *rtc = dev_id; 166 - int ret; 167 - 168 - spin_lock(&rtc->lock); 169 - ret = __sh_rtc_periodic(rtc); 170 - spin_unlock(&rtc->lock); 171 - 172 - return IRQ_RETVAL(ret); 173 - } 174 - 175 - static irqreturn_t sh_rtc_shared(int irq, void *dev_id) 176 - { 177 - struct sh_rtc *rtc = dev_id; 178 - int ret; 179 - 180 - spin_lock(&rtc->lock); 181 - ret = __sh_rtc_interrupt(rtc); 182 - ret |= __sh_rtc_alarm(rtc); 183 - ret |= __sh_rtc_periodic(rtc); 184 - spin_unlock(&rtc->lock); 185 - 186 - return IRQ_RETVAL(ret); 187 - } 188 - 189 - static inline void sh_rtc_setaie(struct device *dev, unsigned int enable) 143 + static int sh_rtc_alarm_irq_enable(struct device *dev, unsigned int enable) 190 144 { 191 145 struct sh_rtc *rtc = dev_get_drvdata(dev); 192 146 unsigned int tmp; ··· 131 229 writeb(tmp, rtc->regbase + RCR1); 132 230 133 231 spin_unlock_irq(&rtc->lock); 134 - } 135 232 136 - static int sh_rtc_proc(struct device *dev, struct seq_file *seq) 137 - { 138 - struct sh_rtc *rtc = dev_get_drvdata(dev); 139 - unsigned int tmp; 140 - 141 - tmp = readb(rtc->regbase + RCR1); 142 - seq_printf(seq, "carry_IRQ\t: %s\n", (tmp & RCR1_CIE) ? "yes" : "no"); 143 - 144 - tmp = readb(rtc->regbase + RCR2); 145 - seq_printf(seq, "periodic_IRQ\t: %s\n", 146 - (tmp & RCR2_PESMASK) ? "yes" : "no"); 147 - 148 - return 0; 149 - } 150 - 151 - static inline void sh_rtc_setcie(struct device *dev, unsigned int enable) 152 - { 153 - struct sh_rtc *rtc = dev_get_drvdata(dev); 154 - unsigned int tmp; 155 - 156 - spin_lock_irq(&rtc->lock); 157 - 158 - tmp = readb(rtc->regbase + RCR1); 159 - 160 - if (!enable) 161 - tmp &= ~RCR1_CIE; 162 - else 163 - tmp |= RCR1_CIE; 164 - 165 - writeb(tmp, rtc->regbase + RCR1); 166 - 167 - spin_unlock_irq(&rtc->lock); 168 - } 169 - 170 - static int sh_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) 171 - { 172 - sh_rtc_setaie(dev, enabled); 173 233 return 0; 174 234 } 175 235 ··· 184 320 tm->tm_sec--; 185 321 #endif 186 322 187 - /* only keep the carry interrupt enabled if UIE is on */ 188 - if (!(rtc->periodic_freq & PF_OXS)) 189 - sh_rtc_setcie(dev, 0); 190 - 191 - dev_dbg(dev, "%s: tm is secs=%d, mins=%d, hours=%d, " 192 - "mday=%d, mon=%d, year=%d, wday=%d\n", 193 - __func__, 194 - tm->tm_sec, tm->tm_min, tm->tm_hour, 323 + dev_dbg(dev, "%s: tm is secs=%d, mins=%d, hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n", 324 + __func__, tm->tm_sec, tm->tm_min, tm->tm_hour, 195 325 tm->tm_mday, tm->tm_mon + 1, tm->tm_year, tm->tm_wday); 196 326 197 327 return 0; ··· 319 461 .set_time = sh_rtc_set_time, 320 462 .read_alarm = sh_rtc_read_alarm, 321 463 .set_alarm = sh_rtc_set_alarm, 322 - .proc = sh_rtc_proc, 323 464 .alarm_irq_enable = sh_rtc_alarm_irq_enable, 324 465 }; 325 466 326 467 static int __init sh_rtc_probe(struct platform_device *pdev) 327 468 { 328 469 struct sh_rtc *rtc; 329 - struct resource *res; 470 + struct resource *res, *req_res; 330 471 char clk_name[14]; 331 472 int clk_id, ret; 473 + unsigned int tmp; 474 + resource_size_t regsize; 332 475 333 476 rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); 334 477 if (unlikely(!rtc)) ··· 337 478 338 479 spin_lock_init(&rtc->lock); 339 480 340 - /* get periodic/carry/alarm irqs */ 341 481 ret = platform_get_irq(pdev, 0); 342 482 if (unlikely(ret <= 0)) { 343 483 dev_err(&pdev->dev, "No IRQ resource\n"); 344 484 return -ENOENT; 345 485 } 346 486 347 - rtc->periodic_irq = ret; 348 - rtc->carry_irq = platform_get_irq(pdev, 1); 349 - rtc->alarm_irq = platform_get_irq(pdev, 2); 487 + if (!pdev->dev.of_node) 488 + rtc->alarm_irq = platform_get_irq(pdev, 2); 489 + else 490 + rtc->alarm_irq = ret; 350 491 351 492 res = platform_get_resource(pdev, IORESOURCE_IO, 0); 352 493 if (!res) 353 494 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 354 - if (unlikely(res == NULL)) { 495 + if (!res) { 355 496 dev_err(&pdev->dev, "No IO resource\n"); 356 497 return -ENOENT; 357 498 } 358 499 359 - rtc->regsize = resource_size(res); 360 - 361 - rtc->res = devm_request_mem_region(&pdev->dev, res->start, 362 - rtc->regsize, pdev->name); 363 - if (unlikely(!rtc->res)) 500 + regsize = resource_size(res); 501 + req_res = devm_request_mem_region(&pdev->dev, res->start, regsize, pdev->name); 502 + if (!req_res) 364 503 return -EBUSY; 365 504 366 - rtc->regbase = devm_ioremap(&pdev->dev, rtc->res->start, rtc->regsize); 367 - if (unlikely(!rtc->regbase)) 505 + rtc->regbase = devm_ioremap(&pdev->dev, req_res->start, regsize); 506 + if (!rtc->regbase) 368 507 return -EINVAL; 369 508 370 509 if (!pdev->dev.of_node) { ··· 372 515 clk_id = 0; 373 516 374 517 snprintf(clk_name, sizeof(clk_name), "rtc%d", clk_id); 375 - } else 518 + } else { 376 519 snprintf(clk_name, sizeof(clk_name), "fck"); 520 + } 377 521 378 522 rtc->clk = devm_clk_get(&pdev->dev, clk_name); 379 523 if (IS_ERR(rtc->clk)) { ··· 408 550 } 409 551 #endif 410 552 411 - if (rtc->carry_irq <= 0) { 412 - /* register shared periodic/carry/alarm irq */ 413 - ret = devm_request_irq(&pdev->dev, rtc->periodic_irq, 414 - sh_rtc_shared, 0, "sh-rtc", rtc); 415 - if (unlikely(ret)) { 416 - dev_err(&pdev->dev, 417 - "request IRQ failed with %d, IRQ %d\n", ret, 418 - rtc->periodic_irq); 419 - goto err_unmap; 420 - } 421 - } else { 422 - /* register periodic/carry/alarm irqs */ 423 - ret = devm_request_irq(&pdev->dev, rtc->periodic_irq, 424 - sh_rtc_periodic, 0, "sh-rtc period", rtc); 425 - if (unlikely(ret)) { 426 - dev_err(&pdev->dev, 427 - "request period IRQ failed with %d, IRQ %d\n", 428 - ret, rtc->periodic_irq); 429 - goto err_unmap; 430 - } 431 - 432 - ret = devm_request_irq(&pdev->dev, rtc->carry_irq, 433 - sh_rtc_interrupt, 0, "sh-rtc carry", rtc); 434 - if (unlikely(ret)) { 435 - dev_err(&pdev->dev, 436 - "request carry IRQ failed with %d, IRQ %d\n", 437 - ret, rtc->carry_irq); 438 - goto err_unmap; 439 - } 440 - 441 - ret = devm_request_irq(&pdev->dev, rtc->alarm_irq, 442 - sh_rtc_alarm, 0, "sh-rtc alarm", rtc); 443 - if (unlikely(ret)) { 444 - dev_err(&pdev->dev, 445 - "request alarm IRQ failed with %d, IRQ %d\n", 446 - ret, rtc->alarm_irq); 447 - goto err_unmap; 448 - } 553 + ret = devm_request_irq(&pdev->dev, rtc->alarm_irq, sh_rtc_alarm, 0, "sh-rtc", rtc); 554 + if (ret) { 555 + dev_err(&pdev->dev, "request alarm IRQ failed with %d, IRQ %d\n", 556 + ret, rtc->alarm_irq); 557 + goto err_unmap; 449 558 } 450 559 451 560 platform_set_drvdata(pdev, rtc); 452 561 453 562 /* everything disabled by default */ 454 - sh_rtc_setaie(&pdev->dev, 0); 455 - sh_rtc_setcie(&pdev->dev, 0); 563 + tmp = readb(rtc->regbase + RCR1); 564 + tmp &= ~(RCR1_CIE | RCR1_AIE); 565 + writeb(tmp, rtc->regbase + RCR1); 456 566 457 567 rtc->rtc_dev->ops = &sh_rtc_ops; 458 568 rtc->rtc_dev->max_user_freq = 256; ··· 450 624 { 451 625 struct sh_rtc *rtc = platform_get_drvdata(pdev); 452 626 453 - sh_rtc_setaie(&pdev->dev, 0); 454 - sh_rtc_setcie(&pdev->dev, 0); 627 + sh_rtc_alarm_irq_enable(&pdev->dev, 0); 455 628 456 629 clk_disable(rtc->clk); 457 630 } 458 631 459 - static void sh_rtc_set_irq_wake(struct device *dev, int enabled) 632 + static int __maybe_unused sh_rtc_suspend(struct device *dev) 460 633 { 461 634 struct sh_rtc *rtc = dev_get_drvdata(dev); 462 635 463 - irq_set_irq_wake(rtc->periodic_irq, enabled); 464 - 465 - if (rtc->carry_irq > 0) { 466 - irq_set_irq_wake(rtc->carry_irq, enabled); 467 - irq_set_irq_wake(rtc->alarm_irq, enabled); 468 - } 469 - } 470 - 471 - static int __maybe_unused sh_rtc_suspend(struct device *dev) 472 - { 473 636 if (device_may_wakeup(dev)) 474 - sh_rtc_set_irq_wake(dev, 1); 637 + irq_set_irq_wake(rtc->alarm_irq, 1); 475 638 476 639 return 0; 477 640 } 478 641 479 642 static int __maybe_unused sh_rtc_resume(struct device *dev) 480 643 { 644 + struct sh_rtc *rtc = dev_get_drvdata(dev); 645 + 481 646 if (device_may_wakeup(dev)) 482 - sh_rtc_set_irq_wake(dev, 0); 647 + irq_set_irq_wake(rtc->alarm_irq, 0); 483 648 484 649 return 0; 485 650 } ··· 501 684 module_platform_driver_probe(sh_rtc_platform_driver, sh_rtc_probe); 502 685 503 686 MODULE_DESCRIPTION("SuperH on-chip RTC driver"); 504 - MODULE_AUTHOR("Paul Mundt <lethal@linux-sh.org>, " 505 - "Jamie Lenehan <lenehan@twibble.org>, " 506 - "Angelo Castello <angelo.castello@st.com>"); 687 + MODULE_AUTHOR("Paul Mundt <lethal@linux-sh.org>"); 688 + MODULE_AUTHOR("Jamie Lenehan <lenehan@twibble.org>"); 689 + MODULE_AUTHOR("Angelo Castello <angelo.castello@st.com>"); 507 690 MODULE_LICENSE("GPL v2"); 508 691 MODULE_ALIAS("platform:" DRV_NAME);
-1
drivers/rtc/rtc-stm32.c
··· 1283 1283 1284 1284 module_platform_driver(stm32_rtc_driver); 1285 1285 1286 - MODULE_ALIAS("platform:" DRIVER_NAME); 1287 1286 MODULE_AUTHOR("Amelie Delaunay <amelie.delaunay@st.com>"); 1288 1287 MODULE_DESCRIPTION("STMicroelectronics STM32 Real Time Clock driver"); 1289 1288 MODULE_LICENSE("GPL v2");