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

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

Pull RTC updates from Alexandre Belloni:
"We see a net reduction of the number of lines of code thanks to the
removal of a now unused driver and a testing tool that is not used
anymore. Apart from this, the max31335 driver gets support for a new
part number and pm8xxx gets UEFI support.

Core:

- setdate is removed as it has better replacements

- skip alarms with a second resolution when we know the RTC doesn't
support those.

Subsystem:

- remove unnecessary private struct members

- use devm_pm_set_wake_irq were relevant

Drivers:

- ds1307: stop disabling alarms on probe for DS1337, DS1339, DS1341
and DS3231

- max31335: add max31331 support

- pcf50633 is removed as support for the related SoC has been removed

- pcf85063: properly handle POR failures"

* tag 'rtc-6.15' of git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux: (50 commits)
rtc: remove 'setdate' test program
selftest: rtc: skip some tests if the alarm only supports minutes
rtc: mt6397: drop unused defines
rtc: pcf85063: replace dev_err+return with return dev_err_probe
rtc: pcf85063: do a SW reset if POR failed
rtc: max31335: Add driver support for max31331
dt-bindings: rtc: max31335: Add max31331 support
rtc: cros-ec: Avoid a couple of -Wflex-array-member-not-at-end warnings
dt-bindings: rtc: pcf2127: Reference spi-peripheral-props.yaml
rtc: rzn1: implement one-second accuracy for alarms
rtc: pcf50633: Remove
rtc: pm8xxx: implement qcom,no-alarm flag for non-HLOS owned alarm
rtc: pm8xxx: mitigate flash wear
rtc: pm8xxx: add support for uefi offset
dt-bindings: rtc: qcom-pm8xxx: document qcom,no-alarm flag
rtc: rv3032: drop WADA
rtc: rv3032: fix EERD location
rtc: pm8xxx: switch to devm_device_init_wakeup
rtc: pm8xxx: fix possible race condition
rtc: mpfs: switch to devm_device_init_wakeup
...

+662 -858
+3 -1
Documentation/devicetree/bindings/rtc/adi,max31335.yaml
··· 18 18 19 19 properties: 20 20 compatible: 21 - const: adi,max31335 21 + enum: 22 + - adi,max31331 23 + - adi,max31335 22 24 23 25 reg: 24 26 maxItems: 1
+2 -1
Documentation/devicetree/bindings/rtc/nxp,pcf2127.yaml
··· 8 8 9 9 allOf: 10 10 - $ref: rtc.yaml# 11 + - $ref: /schemas/spi/spi-peripheral-props.yaml# 11 12 12 13 maintainers: 13 14 - Alexandre Belloni <alexandre.belloni@bootlin.com> ··· 35 34 - compatible 36 35 - reg 37 36 38 - additionalProperties: false 37 + unevaluatedProperties: false 39 38 40 39 examples: 41 40 - |
+5
Documentation/devicetree/bindings/rtc/qcom-pm8xxx-rtc.yaml
··· 50 50 items: 51 51 - const: offset 52 52 53 + qcom,no-alarm: 54 + type: boolean 55 + description: 56 + RTC alarm is not owned by the OS 57 + 53 58 wakeup-source: true 54 59 55 60 required:
-7
drivers/rtc/Kconfig
··· 1321 1321 If you say Y here you will get support for the RTC found on 1322 1322 spear 1323 1323 1324 - config RTC_DRV_PCF50633 1325 - depends on MFD_PCF50633 1326 - tristate "NXP PCF50633 RTC" 1327 - help 1328 - If you say yes here you get support for the RTC subsystem of the 1329 - NXP PCF50633 used in embedded systems. 1330 - 1331 1324 config RTC_DRV_AB8500 1332 1325 tristate "ST-Ericsson AB8500 RTC" 1333 1326 depends on AB8500_CORE
-1
drivers/rtc/Makefile
··· 126 126 obj-$(CONFIG_RTC_DRV_PCAP) += rtc-pcap.o 127 127 obj-$(CONFIG_RTC_DRV_PCF2123) += rtc-pcf2123.o 128 128 obj-$(CONFIG_RTC_DRV_PCF2127) += rtc-pcf2127.o 129 - obj-$(CONFIG_RTC_DRV_PCF50633) += rtc-pcf50633.o 130 129 obj-$(CONFIG_RTC_DRV_PCF85063) += rtc-pcf85063.o 131 130 obj-$(CONFIG_RTC_DRV_PCF8523) += rtc-pcf8523.o 132 131 obj-$(CONFIG_RTC_DRV_PCF85363) += rtc-pcf85363.o
+2 -22
drivers/rtc/rtc-ab-eoz9.c
··· 426 426 } 427 427 } 428 428 429 - static const u32 abeoz9_chip_config[] = { 430 - HWMON_C_REGISTER_TZ, 431 - 0 432 - }; 433 - 434 - static const struct hwmon_channel_info abeoz9_chip = { 435 - .type = hwmon_chip, 436 - .config = abeoz9_chip_config, 437 - }; 438 - 439 - static const u32 abeoz9_temp_config[] = { 440 - HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_MIN, 441 - 0 442 - }; 443 - 444 - static const struct hwmon_channel_info abeoz9_temp = { 445 - .type = hwmon_temp, 446 - .config = abeoz9_temp_config, 447 - }; 448 - 449 429 static const struct hwmon_channel_info * const abeoz9_info[] = { 450 - &abeoz9_chip, 451 - &abeoz9_temp, 430 + HWMON_CHANNEL_INFO(chip, HWMON_C_REGISTER_TZ), 431 + HWMON_CHANNEL_INFO(temp, HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_MIN), 452 432 NULL 453 433 }; 454 434
+2 -9
drivers/rtc/rtc-ab8500.c
··· 361 361 return -ENODEV; 362 362 } 363 363 364 - device_init_wakeup(&pdev->dev, true); 364 + devm_device_init_wakeup(&pdev->dev); 365 365 366 366 rtc = devm_rtc_allocate_device(&pdev->dev); 367 367 if (IS_ERR(rtc)) ··· 375 375 if (err < 0) 376 376 return err; 377 377 378 - dev_pm_set_wake_irq(&pdev->dev, irq); 378 + devm_pm_set_wake_irq(&pdev->dev, irq); 379 379 platform_set_drvdata(pdev, rtc); 380 380 381 381 set_bit(RTC_FEATURE_ALARM_RES_MINUTE, rtc->features); ··· 392 392 return devm_rtc_register_device(rtc); 393 393 } 394 394 395 - static void ab8500_rtc_remove(struct platform_device *pdev) 396 - { 397 - dev_pm_clear_wake_irq(&pdev->dev); 398 - device_init_wakeup(&pdev->dev, false); 399 - } 400 - 401 395 static struct platform_driver ab8500_rtc_driver = { 402 396 .driver = { 403 397 .name = "ab8500-rtc", 404 398 }, 405 399 .probe = ab8500_rtc_probe, 406 - .remove = ab8500_rtc_remove, 407 400 .id_table = ab85xx_rtc_ids, 408 401 }; 409 402
+8 -8
drivers/rtc/rtc-aspeed.c
··· 8 8 #include <linux/io.h> 9 9 10 10 struct aspeed_rtc { 11 - struct rtc_device *rtc_dev; 12 11 void __iomem *base; 13 12 }; 14 13 ··· 84 85 static int aspeed_rtc_probe(struct platform_device *pdev) 85 86 { 86 87 struct aspeed_rtc *rtc; 88 + struct rtc_device *rtc_dev; 87 89 88 90 rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); 89 91 if (!rtc) ··· 94 94 if (IS_ERR(rtc->base)) 95 95 return PTR_ERR(rtc->base); 96 96 97 - rtc->rtc_dev = devm_rtc_allocate_device(&pdev->dev); 98 - if (IS_ERR(rtc->rtc_dev)) 99 - return PTR_ERR(rtc->rtc_dev); 97 + rtc_dev = devm_rtc_allocate_device(&pdev->dev); 98 + if (IS_ERR(rtc_dev)) 99 + return PTR_ERR(rtc_dev); 100 100 101 101 platform_set_drvdata(pdev, rtc); 102 102 103 - rtc->rtc_dev->ops = &aspeed_rtc_ops; 104 - rtc->rtc_dev->range_min = RTC_TIMESTAMP_BEGIN_1900; 105 - rtc->rtc_dev->range_max = 38814989399LL; /* 3199-12-31 23:59:59 */ 103 + rtc_dev->ops = &aspeed_rtc_ops; 104 + rtc_dev->range_min = RTC_TIMESTAMP_BEGIN_1900; 105 + rtc_dev->range_max = 38814989399LL; /* 3199-12-31 23:59:59 */ 106 106 107 - return devm_rtc_register_device(rtc->rtc_dev); 107 + return devm_rtc_register_device(rtc_dev); 108 108 } 109 109 110 110 static const struct of_device_id aspeed_rtc_match[] = {
+12 -18
drivers/rtc/rtc-cros-ec.c
··· 35 35 static int cros_ec_rtc_get(struct cros_ec_device *cros_ec, u32 command, 36 36 u32 *response) 37 37 { 38 + DEFINE_RAW_FLEX(struct cros_ec_command, msg, data, 39 + sizeof(struct ec_response_rtc)); 38 40 int ret; 39 - struct { 40 - struct cros_ec_command msg; 41 - struct ec_response_rtc data; 42 - } __packed msg; 43 41 44 - memset(&msg, 0, sizeof(msg)); 45 - msg.msg.command = command; 46 - msg.msg.insize = sizeof(msg.data); 42 + msg->command = command; 43 + msg->insize = sizeof(struct ec_response_rtc); 47 44 48 - ret = cros_ec_cmd_xfer_status(cros_ec, &msg.msg); 45 + ret = cros_ec_cmd_xfer_status(cros_ec, msg); 49 46 if (ret < 0) 50 47 return ret; 51 48 52 - *response = msg.data.time; 49 + *response = ((struct ec_response_rtc *)msg->data)->time; 53 50 54 51 return 0; 55 52 } ··· 54 57 static int cros_ec_rtc_set(struct cros_ec_device *cros_ec, u32 command, 55 58 u32 param) 56 59 { 60 + DEFINE_RAW_FLEX(struct cros_ec_command, msg, data, 61 + sizeof(struct ec_response_rtc)); 57 62 int ret; 58 - struct { 59 - struct cros_ec_command msg; 60 - struct ec_response_rtc data; 61 - } __packed msg; 62 63 63 - memset(&msg, 0, sizeof(msg)); 64 - msg.msg.command = command; 65 - msg.msg.outsize = sizeof(msg.data); 66 - msg.data.time = param; 64 + msg->command = command; 65 + msg->outsize = sizeof(struct ec_response_rtc); 66 + ((struct ec_response_rtc *)msg->data)->time = param; 67 67 68 - ret = cros_ec_cmd_xfer_status(cros_ec, &msg.msg); 68 + ret = cros_ec_cmd_xfer_status(cros_ec, msg); 69 69 if (ret < 0) 70 70 return ret; 71 71 return 0;
+1 -3
drivers/rtc/rtc-ds1307.c
··· 1807 1807 * For some variants, be sure alarms can trigger when we're 1808 1808 * running on Vbackup (BBSQI/BBSQW) 1809 1809 */ 1810 - if (want_irq || ds1307_can_wakeup_device) { 1810 + if (want_irq || ds1307_can_wakeup_device) 1811 1811 regs[0] |= DS1337_BIT_INTCN | chip->bbsqi_bit; 1812 - regs[0] &= ~(DS1337_BIT_A2IE | DS1337_BIT_A1IE); 1813 - } 1814 1812 1815 1813 regmap_write(ds1307->regmap, DS1337_REG_CONTROL, 1816 1814 regs[0]);
+1 -7
drivers/rtc/rtc-ds1343.c
··· 427 427 "unable to request irq for rtc ds1343\n"); 428 428 } else { 429 429 device_init_wakeup(&spi->dev, true); 430 - dev_pm_set_wake_irq(&spi->dev, spi->irq); 430 + devm_pm_set_wake_irq(&spi->dev, spi->irq); 431 431 } 432 432 } 433 433 434 434 return 0; 435 - } 436 - 437 - static void ds1343_remove(struct spi_device *spi) 438 - { 439 - dev_pm_clear_wake_irq(&spi->dev); 440 435 } 441 436 442 437 #ifdef CONFIG_PM_SLEEP ··· 466 471 .pm = &ds1343_pm, 467 472 }, 468 473 .probe = ds1343_probe, 469 - .remove = ds1343_remove, 470 474 .id_table = ds1343_id, 471 475 }; 472 476
+7 -7
drivers/rtc/rtc-ds2404.c
··· 31 31 struct gpio_desc *rst_gpiod; 32 32 struct gpio_desc *clk_gpiod; 33 33 struct gpio_desc *dq_gpiod; 34 - struct rtc_device *rtc; 35 34 }; 36 35 37 36 static int ds2404_gpio_map(struct ds2404 *chip, struct platform_device *pdev) ··· 181 182 static int rtc_probe(struct platform_device *pdev) 182 183 { 183 184 struct ds2404 *chip; 185 + struct rtc_device *rtc; 184 186 int retval = -EBUSY; 185 187 186 188 chip = devm_kzalloc(&pdev->dev, sizeof(struct ds2404), GFP_KERNEL); ··· 190 190 191 191 chip->dev = &pdev->dev; 192 192 193 - chip->rtc = devm_rtc_allocate_device(&pdev->dev); 194 - if (IS_ERR(chip->rtc)) 195 - return PTR_ERR(chip->rtc); 193 + rtc = devm_rtc_allocate_device(&pdev->dev); 194 + if (IS_ERR(rtc)) 195 + return PTR_ERR(rtc); 196 196 197 197 retval = ds2404_gpio_map(chip, pdev); 198 198 if (retval) ··· 200 200 201 201 platform_set_drvdata(pdev, chip); 202 202 203 - chip->rtc->ops = &ds2404_rtc_ops; 204 - chip->rtc->range_max = U32_MAX; 203 + rtc->ops = &ds2404_rtc_ops; 204 + rtc->range_max = U32_MAX; 205 205 206 - retval = devm_rtc_register_device(chip->rtc); 206 + retval = devm_rtc_register_device(rtc); 207 207 if (retval) 208 208 return retval; 209 209
+2 -22
drivers/rtc/rtc-ds3232.c
··· 339 339 return err; 340 340 } 341 341 342 - static u32 ds3232_hwmon_chip_config[] = { 343 - HWMON_C_REGISTER_TZ, 344 - 0 345 - }; 346 - 347 - static const struct hwmon_channel_info ds3232_hwmon_chip = { 348 - .type = hwmon_chip, 349 - .config = ds3232_hwmon_chip_config, 350 - }; 351 - 352 - static u32 ds3232_hwmon_temp_config[] = { 353 - HWMON_T_INPUT, 354 - 0 355 - }; 356 - 357 - static const struct hwmon_channel_info ds3232_hwmon_temp = { 358 - .type = hwmon_temp, 359 - .config = ds3232_hwmon_temp_config, 360 - }; 361 - 362 342 static const struct hwmon_channel_info * const ds3232_hwmon_info[] = { 363 - &ds3232_hwmon_chip, 364 - &ds3232_hwmon_temp, 343 + HWMON_CHANNEL_INFO(chip, HWMON_C_REGISTER_TZ), 344 + HWMON_CHANNEL_INFO(temp, HWMON_T_INPUT), 365 345 NULL 366 346 }; 367 347
+8 -8
drivers/rtc/rtc-ep93xx.c
··· 28 28 29 29 struct ep93xx_rtc { 30 30 void __iomem *mmio_base; 31 - struct rtc_device *rtc; 32 31 }; 33 32 34 33 static int ep93xx_rtc_get_swcomp(struct device *dev, unsigned short *preload, ··· 122 123 static int ep93xx_rtc_probe(struct platform_device *pdev) 123 124 { 124 125 struct ep93xx_rtc *ep93xx_rtc; 126 + struct rtc_device *rtc; 125 127 int err; 126 128 127 129 ep93xx_rtc = devm_kzalloc(&pdev->dev, sizeof(*ep93xx_rtc), GFP_KERNEL); ··· 135 135 136 136 platform_set_drvdata(pdev, ep93xx_rtc); 137 137 138 - ep93xx_rtc->rtc = devm_rtc_allocate_device(&pdev->dev); 139 - if (IS_ERR(ep93xx_rtc->rtc)) 140 - return PTR_ERR(ep93xx_rtc->rtc); 138 + rtc = devm_rtc_allocate_device(&pdev->dev); 139 + if (IS_ERR(rtc)) 140 + return PTR_ERR(rtc); 141 141 142 - ep93xx_rtc->rtc->ops = &ep93xx_rtc_ops; 143 - ep93xx_rtc->rtc->range_max = U32_MAX; 142 + rtc->ops = &ep93xx_rtc_ops; 143 + rtc->range_max = U32_MAX; 144 144 145 - err = rtc_add_group(ep93xx_rtc->rtc, &ep93xx_rtc_sysfs_files); 145 + err = rtc_add_group(rtc, &ep93xx_rtc_sysfs_files); 146 146 if (err) 147 147 return err; 148 148 149 - return devm_rtc_register_device(ep93xx_rtc->rtc); 149 + return devm_rtc_register_device(rtc); 150 150 } 151 151 152 152 static const struct of_device_id ep93xx_rtc_of_ids[] = {
+1 -1
drivers/rtc/rtc-fsl-ftm-alarm.c
··· 309 309 }; 310 310 MODULE_DEVICE_TABLE(of, ftm_rtc_match); 311 311 312 - static const struct acpi_device_id ftm_imx_acpi_ids[] = { 312 + static const struct acpi_device_id ftm_imx_acpi_ids[] __maybe_unused = { 313 313 {"NXP0014",}, 314 314 { } 315 315 };
+8 -9
drivers/rtc/rtc-ftrtc010.c
··· 28 28 MODULE_ALIAS("platform:" DRV_NAME); 29 29 30 30 struct ftrtc010_rtc { 31 - struct rtc_device *rtc_dev; 32 31 void __iomem *rtc_base; 33 32 int rtc_irq; 34 33 struct clk *pclk; ··· 112 113 struct ftrtc010_rtc *rtc; 113 114 struct device *dev = &pdev->dev; 114 115 struct resource *res; 116 + struct rtc_device *rtc_dev; 115 117 int ret; 116 118 117 119 rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); ··· 160 160 goto err_disable_extclk; 161 161 } 162 162 163 - rtc->rtc_dev = devm_rtc_allocate_device(dev); 164 - if (IS_ERR(rtc->rtc_dev)) { 165 - ret = PTR_ERR(rtc->rtc_dev); 163 + rtc_dev = devm_rtc_allocate_device(dev); 164 + if (IS_ERR(rtc_dev)) { 165 + ret = PTR_ERR(rtc_dev); 166 166 goto err_disable_extclk; 167 167 } 168 168 169 - rtc->rtc_dev->ops = &ftrtc010_rtc_ops; 169 + rtc_dev->ops = &ftrtc010_rtc_ops; 170 170 171 171 sec = readl(rtc->rtc_base + FTRTC010_RTC_SECOND); 172 172 min = readl(rtc->rtc_base + FTRTC010_RTC_MINUTE); 173 173 hour = readl(rtc->rtc_base + FTRTC010_RTC_HOUR); 174 174 days = readl(rtc->rtc_base + FTRTC010_RTC_DAYS); 175 175 176 - rtc->rtc_dev->range_min = (u64)days * 86400 + hour * 3600 + 177 - min * 60 + sec; 178 - rtc->rtc_dev->range_max = U32_MAX + rtc->rtc_dev->range_min; 176 + rtc_dev->range_min = (u64)days * 86400 + hour * 3600 + min * 60 + sec; 177 + rtc_dev->range_max = U32_MAX + rtc_dev->range_min; 179 178 180 179 ret = devm_request_irq(dev, rtc->rtc_irq, ftrtc010_rtc_interrupt, 181 180 IRQF_SHARED, pdev->name, dev); 182 181 if (unlikely(ret)) 183 182 goto err_disable_extclk; 184 183 185 - return devm_rtc_register_device(rtc->rtc_dev); 184 + return devm_rtc_register_device(rtc_dev); 186 185 187 186 err_disable_extclk: 188 187 clk_disable_unprepare(rtc->extclk);
+7 -7
drivers/rtc/rtc-m48t86.c
··· 41 41 struct m48t86_rtc_info { 42 42 void __iomem *index_reg; 43 43 void __iomem *data_reg; 44 - struct rtc_device *rtc; 45 44 }; 46 45 47 46 static unsigned char m48t86_readb(struct device *dev, unsigned long addr) ··· 218 219 static int m48t86_rtc_probe(struct platform_device *pdev) 219 220 { 220 221 struct m48t86_rtc_info *info; 222 + struct rtc_device *rtc; 221 223 unsigned char reg; 222 224 int err; 223 225 struct nvmem_config m48t86_nvmem_cfg = { ··· 250 250 return -ENODEV; 251 251 } 252 252 253 - info->rtc = devm_rtc_allocate_device(&pdev->dev); 254 - if (IS_ERR(info->rtc)) 255 - return PTR_ERR(info->rtc); 253 + rtc = devm_rtc_allocate_device(&pdev->dev); 254 + if (IS_ERR(rtc)) 255 + return PTR_ERR(rtc); 256 256 257 - info->rtc->ops = &m48t86_rtc_ops; 257 + rtc->ops = &m48t86_rtc_ops; 258 258 259 - err = devm_rtc_register_device(info->rtc); 259 + err = devm_rtc_register_device(rtc); 260 260 if (err) 261 261 return err; 262 262 263 - devm_rtc_nvmem_register(info->rtc, &m48t86_nvmem_cfg); 263 + devm_rtc_nvmem_register(rtc, &m48t86_nvmem_cfg); 264 264 265 265 /* read battery status */ 266 266 reg = m48t86_readb(&pdev->dev, M48T86_D);
+122 -43
drivers/rtc/rtc-max31335.c
··· 184 184 #define MAX31335_RAM_SIZE 32 185 185 #define MAX31335_TIME_SIZE 0x07 186 186 187 + /* MAX31331 Register Map */ 188 + #define MAX31331_RTC_CONFIG2 0x04 189 + 187 190 #define clk_hw_to_max31335(_hw) container_of(_hw, struct max31335_data, clkout) 191 + 192 + /* Supported Maxim RTC */ 193 + enum max_rtc_ids { 194 + ID_MAX31331, 195 + ID_MAX31335, 196 + MAX_RTC_ID_NR 197 + }; 198 + 199 + struct chip_desc { 200 + u8 sec_reg; 201 + u8 alarm1_sec_reg; 202 + 203 + u8 int_en_reg; 204 + u8 int_status_reg; 205 + 206 + u8 ram_reg; 207 + u8 ram_size; 208 + 209 + u8 temp_reg; 210 + 211 + u8 trickle_reg; 212 + 213 + u8 clkout_reg; 214 + 215 + enum max_rtc_ids id; 216 + }; 188 217 189 218 struct max31335_data { 190 219 struct regmap *regmap; 191 220 struct rtc_device *rtc; 192 221 struct clk_hw clkout; 222 + struct clk *clkin; 223 + const struct chip_desc *chip; 224 + int irq; 193 225 }; 194 226 195 227 static const int max31335_clkout_freq[] = { 1, 64, 1024, 32768 }; 228 + 229 + static const struct chip_desc chip[MAX_RTC_ID_NR] = { 230 + [ID_MAX31331] = { 231 + .id = ID_MAX31331, 232 + .int_en_reg = 0x01, 233 + .int_status_reg = 0x00, 234 + .sec_reg = 0x08, 235 + .alarm1_sec_reg = 0x0F, 236 + .ram_reg = 0x20, 237 + .ram_size = 32, 238 + .trickle_reg = 0x1B, 239 + .clkout_reg = 0x04, 240 + }, 241 + [ID_MAX31335] = { 242 + .id = ID_MAX31335, 243 + .int_en_reg = 0x01, 244 + .int_status_reg = 0x00, 245 + .sec_reg = 0x0A, 246 + .alarm1_sec_reg = 0x11, 247 + .ram_reg = 0x40, 248 + .ram_size = 32, 249 + .temp_reg = 0x35, 250 + .trickle_reg = 0x1D, 251 + .clkout_reg = 0x06, 252 + }, 253 + }; 196 254 197 255 static const u16 max31335_trickle_resistors[] = {3000, 6000, 11000}; 198 256 199 257 static bool max31335_volatile_reg(struct device *dev, unsigned int reg) 200 258 { 259 + struct max31335_data *max31335 = dev_get_drvdata(dev); 260 + const struct chip_desc *chip = max31335->chip; 261 + 201 262 /* time keeping registers */ 202 - if (reg >= MAX31335_SECONDS && 203 - reg < MAX31335_SECONDS + MAX31335_TIME_SIZE) 263 + if (reg >= chip->sec_reg && reg < chip->sec_reg + MAX31335_TIME_SIZE) 204 264 return true; 205 265 206 266 /* interrupt status register */ 207 - if (reg == MAX31335_STATUS1) 267 + if (reg == chip->int_status_reg) 208 268 return true; 209 269 210 - /* temperature registers */ 211 - if (reg == MAX31335_TEMP_DATA_MSB || reg == MAX31335_TEMP_DATA_LSB) 270 + /* temperature registers if valid */ 271 + if (chip->temp_reg && (reg == chip->temp_reg || reg == chip->temp_reg + 1)) 212 272 return true; 213 273 214 274 return false; ··· 287 227 u8 date[7]; 288 228 int ret; 289 229 290 - ret = regmap_bulk_read(max31335->regmap, MAX31335_SECONDS, date, 230 + ret = regmap_bulk_read(max31335->regmap, max31335->chip->sec_reg, date, 291 231 sizeof(date)); 292 232 if (ret) 293 233 return ret; ··· 322 262 if (tm->tm_year >= 200) 323 263 date[5] |= FIELD_PREP(MAX31335_MONTH_CENTURY, 1); 324 264 325 - return regmap_bulk_write(max31335->regmap, MAX31335_SECONDS, date, 265 + return regmap_bulk_write(max31335->regmap, max31335->chip->sec_reg, date, 326 266 sizeof(date)); 327 267 } 328 268 ··· 333 273 struct rtc_time time; 334 274 u8 regs[6]; 335 275 336 - ret = regmap_bulk_read(max31335->regmap, MAX31335_ALM1_SEC, regs, 276 + ret = regmap_bulk_read(max31335->regmap, max31335->chip->alarm1_sec_reg, regs, 337 277 sizeof(regs)); 338 278 if (ret) 339 279 return ret; ··· 352 292 if (time.tm_year >= 200) 353 293 alrm->time.tm_year += 100; 354 294 355 - ret = regmap_read(max31335->regmap, MAX31335_INT_EN1, &ctrl); 295 + ret = regmap_read(max31335->regmap, max31335->chip->int_en_reg, &ctrl); 356 296 if (ret) 357 297 return ret; 358 298 359 - ret = regmap_read(max31335->regmap, MAX31335_STATUS1, &status); 299 + ret = regmap_read(max31335->regmap, max31335->chip->int_status_reg, &status); 360 300 if (ret) 361 301 return ret; 362 302 ··· 380 320 regs[4] = bin2bcd(alrm->time.tm_mon + 1); 381 321 regs[5] = bin2bcd(alrm->time.tm_year % 100); 382 322 383 - ret = regmap_bulk_write(max31335->regmap, MAX31335_ALM1_SEC, 323 + ret = regmap_bulk_write(max31335->regmap, max31335->chip->alarm1_sec_reg, 384 324 regs, sizeof(regs)); 385 325 if (ret) 386 326 return ret; 387 327 388 328 reg = FIELD_PREP(MAX31335_INT_EN1_A1IE, alrm->enabled); 389 - ret = regmap_update_bits(max31335->regmap, MAX31335_INT_EN1, 329 + ret = regmap_update_bits(max31335->regmap, max31335->chip->int_en_reg, 390 330 MAX31335_INT_EN1_A1IE, reg); 391 331 if (ret) 392 332 return ret; 393 333 394 - ret = regmap_update_bits(max31335->regmap, MAX31335_STATUS1, 334 + ret = regmap_update_bits(max31335->regmap, max31335->chip->int_status_reg, 395 335 MAX31335_STATUS1_A1F, 0); 396 336 397 337 return 0; ··· 401 341 { 402 342 struct max31335_data *max31335 = dev_get_drvdata(dev); 403 343 404 - return regmap_update_bits(max31335->regmap, MAX31335_INT_EN1, 344 + return regmap_update_bits(max31335->regmap, max31335->chip->int_en_reg, 405 345 MAX31335_INT_EN1_A1IE, enabled); 406 346 } 407 347 408 348 static irqreturn_t max31335_handle_irq(int irq, void *dev_id) 409 349 { 410 350 struct max31335_data *max31335 = dev_id; 411 - bool status; 412 - int ret; 351 + struct mutex *lock = &max31335->rtc->ops_lock; 352 + int ret, status; 413 353 414 - ret = regmap_update_bits_check(max31335->regmap, MAX31335_STATUS1, 415 - MAX31335_STATUS1_A1F, 0, &status); 354 + mutex_lock(lock); 355 + 356 + ret = regmap_read(max31335->regmap, max31335->chip->int_status_reg, &status); 416 357 if (ret) 417 - return IRQ_HANDLED; 358 + goto exit; 418 359 419 - if (status) 360 + if (FIELD_GET(MAX31335_STATUS1_A1F, status)) { 361 + ret = regmap_update_bits(max31335->regmap, max31335->chip->int_status_reg, 362 + MAX31335_STATUS1_A1F, 0); 363 + if (ret) 364 + goto exit; 365 + 420 366 rtc_update_irq(max31335->rtc, 1, RTC_AF | RTC_IRQF); 367 + } 368 + 369 + exit: 370 + mutex_unlock(lock); 421 371 422 372 return IRQ_HANDLED; 423 373 } ··· 474 404 475 405 i = i + trickle_cfg; 476 406 477 - return regmap_write(max31335->regmap, MAX31335_TRICKLE_REG, 407 + return regmap_write(max31335->regmap, max31335->chip->trickle_reg, 478 408 FIELD_PREP(MAX31335_TRICKLE_REG_TRICKLE, i) | 479 409 FIELD_PREP(MAX31335_TRICKLE_REG_EN_TRICKLE, 480 410 chargeable)); ··· 488 418 unsigned int reg; 489 419 int ret; 490 420 491 - ret = regmap_read(max31335->regmap, MAX31335_RTC_CONFIG2, &reg); 421 + ret = regmap_read(max31335->regmap, max31335->chip->clkout_reg, &reg); 492 422 if (ret) 493 423 return 0; 494 424 ··· 519 449 ARRAY_SIZE(max31335_clkout_freq)); 520 450 freq_mask = __roundup_pow_of_two(ARRAY_SIZE(max31335_clkout_freq)) - 1; 521 451 522 - return regmap_update_bits(max31335->regmap, MAX31335_RTC_CONFIG2, 523 - freq_mask, index); 452 + return regmap_update_bits(max31335->regmap, max31335->chip->clkout_reg, 453 + freq_mask, index); 524 454 } 525 455 526 456 static int max31335_clkout_enable(struct clk_hw *hw) 527 457 { 528 458 struct max31335_data *max31335 = clk_hw_to_max31335(hw); 529 459 530 - return regmap_set_bits(max31335->regmap, MAX31335_RTC_CONFIG2, 531 - MAX31335_RTC_CONFIG2_ENCLKO); 460 + return regmap_set_bits(max31335->regmap, max31335->chip->clkout_reg, 461 + MAX31335_RTC_CONFIG2_ENCLKO); 532 462 } 533 463 534 464 static void max31335_clkout_disable(struct clk_hw *hw) 535 465 { 536 466 struct max31335_data *max31335 = clk_hw_to_max31335(hw); 537 467 538 - regmap_clear_bits(max31335->regmap, MAX31335_RTC_CONFIG2, 468 + regmap_clear_bits(max31335->regmap, max31335->chip->clkout_reg, 539 469 MAX31335_RTC_CONFIG2_ENCLKO); 540 470 } 541 471 ··· 545 475 unsigned int reg; 546 476 int ret; 547 477 548 - ret = regmap_read(max31335->regmap, MAX31335_RTC_CONFIG2, &reg); 478 + ret = regmap_read(max31335->regmap, max31335->chip->clkout_reg, &reg); 549 479 if (ret) 550 480 return ret; 551 481 ··· 570 500 void *val, size_t bytes) 571 501 { 572 502 struct max31335_data *max31335 = priv; 573 - unsigned int reg = MAX31335_TS0_SEC_1_128 + offset; 503 + unsigned int reg = max31335->chip->ram_reg + offset; 574 504 575 505 return regmap_bulk_read(max31335->regmap, reg, val, bytes); 576 506 } ··· 579 509 void *val, size_t bytes) 580 510 { 581 511 struct max31335_data *max31335 = priv; 582 - unsigned int reg = MAX31335_TS0_SEC_1_128 + offset; 512 + unsigned int reg = max31335->chip->ram_reg + offset; 583 513 584 514 return regmap_bulk_write(max31335->regmap, reg, val, bytes); 585 515 } ··· 603 533 if (type != hwmon_temp || attr != hwmon_temp_input) 604 534 return -EOPNOTSUPP; 605 535 606 - ret = regmap_bulk_read(max31335->regmap, MAX31335_TEMP_DATA_MSB, 536 + ret = regmap_bulk_read(max31335->regmap, max31335->chip->temp_reg, 607 537 reg, 2); 608 538 if (ret) 609 539 return ret; ··· 647 577 int ret; 648 578 649 579 if (!device_property_present(dev, "#clock-cells")) 650 - return regmap_clear_bits(max31335->regmap, MAX31335_RTC_CONFIG2, 651 - MAX31335_RTC_CONFIG2_ENCLKO); 580 + return regmap_clear_bits(max31335->regmap, max31335->chip->clkout_reg, 581 + MAX31335_RTC_CONFIG2_ENCLKO); 652 582 653 583 max31335->clkout.init = &max31335_clk_init; 654 584 ··· 675 605 #if IS_REACHABLE(HWMON) 676 606 struct device *hwmon; 677 607 #endif 608 + const struct chip_desc *match; 678 609 int ret; 679 610 680 611 max31335 = devm_kzalloc(&client->dev, sizeof(*max31335), GFP_KERNEL); ··· 687 616 return PTR_ERR(max31335->regmap); 688 617 689 618 i2c_set_clientdata(client, max31335); 690 - 619 + match = i2c_get_match_data(client); 620 + if (!match) 621 + return -ENODEV; 622 + max31335->chip = match; 691 623 max31335->rtc = devm_rtc_allocate_device(&client->dev); 692 624 if (IS_ERR(max31335->rtc)) 693 625 return PTR_ERR(max31335->rtc); ··· 713 639 dev_warn(&client->dev, 714 640 "unable to request IRQ, alarm max31335 disabled\n"); 715 641 client->irq = 0; 642 + } else { 643 + max31335->irq = client->irq; 716 644 } 717 645 } 718 646 ··· 728 652 "cannot register rtc nvmem\n"); 729 653 730 654 #if IS_REACHABLE(HWMON) 731 - hwmon = devm_hwmon_device_register_with_info(&client->dev, client->name, 732 - max31335, 733 - &max31335_chip_info, 734 - NULL); 735 - if (IS_ERR(hwmon)) 736 - return dev_err_probe(&client->dev, PTR_ERR(hwmon), 737 - "cannot register hwmon device\n"); 655 + if (max31335->chip->temp_reg) { 656 + hwmon = devm_hwmon_device_register_with_info(&client->dev, client->name, max31335, 657 + &max31335_chip_info, NULL); 658 + if (IS_ERR(hwmon)) 659 + return dev_err_probe(&client->dev, PTR_ERR(hwmon), 660 + "cannot register hwmon device\n"); 661 + } 738 662 #endif 739 663 740 664 ret = max31335_trickle_charger_setup(&client->dev, max31335); ··· 745 669 } 746 670 747 671 static const struct i2c_device_id max31335_id[] = { 748 - { "max31335" }, 672 + { "max31331", (kernel_ulong_t)&chip[ID_MAX31331] }, 673 + { "max31335", (kernel_ulong_t)&chip[ID_MAX31335] }, 749 674 { } 750 675 }; 751 676 752 677 MODULE_DEVICE_TABLE(i2c, max31335_id); 753 678 754 679 static const struct of_device_id max31335_of_match[] = { 755 - { .compatible = "adi,max31335" }, 680 + { .compatible = "adi,max31331", .data = &chip[ID_MAX31331] }, 681 + { .compatible = "adi,max31335", .data = &chip[ID_MAX31335] }, 756 682 { } 757 683 }; 758 684 ··· 771 693 module_i2c_driver(max31335_driver); 772 694 773 695 MODULE_AUTHOR("Antoniu Miclaus <antoniu.miclaus@analog.com>"); 696 + MODULE_AUTHOR("Saket Kumar Purwar <Saket.Kumarpurwar@analog.com>"); 774 697 MODULE_DESCRIPTION("MAX31335 RTC driver"); 775 698 MODULE_LICENSE("GPL");
+16 -21
drivers/rtc/rtc-max77686.c
··· 85 85 86 86 struct max77686_rtc_info { 87 87 struct device *dev; 88 - struct i2c_client *rtc; 89 88 struct rtc_device *rtc_dev; 90 89 struct mutex lock; 91 90 ··· 690 691 { 691 692 struct device *parent = info->dev->parent; 692 693 struct i2c_client *parent_i2c = to_i2c_client(parent); 694 + struct i2c_client *client; 693 695 int ret; 694 696 695 697 if (info->drv_data->rtc_irq_from_platform) { ··· 704 704 } 705 705 706 706 info->regmap = dev_get_regmap(parent, NULL); 707 - if (!info->regmap) { 708 - dev_err(info->dev, "Failed to get rtc regmap\n"); 709 - return -ENODEV; 710 - } 707 + if (!info->regmap) 708 + return dev_err_probe(info->dev, -ENODEV, 709 + "Failed to get rtc regmap\n"); 711 710 712 711 if (info->drv_data->rtc_i2c_addr == MAX77686_INVALID_I2C_ADDR) { 713 712 info->rtc_regmap = info->regmap; 714 713 goto add_rtc_irq; 715 714 } 716 715 717 - info->rtc = devm_i2c_new_dummy_device(info->dev, parent_i2c->adapter, 718 - info->drv_data->rtc_i2c_addr); 719 - if (IS_ERR(info->rtc)) { 720 - dev_err(info->dev, "Failed to allocate I2C device for RTC\n"); 721 - return PTR_ERR(info->rtc); 722 - } 716 + client = devm_i2c_new_dummy_device(info->dev, parent_i2c->adapter, 717 + info->drv_data->rtc_i2c_addr); 718 + if (IS_ERR(client)) 719 + return dev_err_probe(info->dev, PTR_ERR(client), 720 + "Failed to allocate I2C device for RTC\n"); 723 721 724 - info->rtc_regmap = devm_regmap_init_i2c(info->rtc, 722 + info->rtc_regmap = devm_regmap_init_i2c(client, 725 723 info->drv_data->regmap_config); 726 - if (IS_ERR(info->rtc_regmap)) { 727 - ret = PTR_ERR(info->rtc_regmap); 728 - dev_err(info->dev, "Failed to allocate RTC regmap: %d\n", ret); 729 - return ret; 730 - } 724 + if (IS_ERR(info->rtc_regmap)) 725 + return dev_err_probe(info->dev, PTR_ERR(info->rtc_regmap), 726 + "Failed to allocate RTC regmap\n"); 731 727 732 728 add_rtc_irq: 733 729 ret = regmap_add_irq_chip(info->rtc_regmap, info->rtc_irq, 734 730 IRQF_ONESHOT | IRQF_SHARED, 735 731 0, info->drv_data->rtc_irq_chip, 736 732 &info->rtc_irq_data); 737 - if (ret < 0) { 738 - dev_err(info->dev, "Failed to add RTC irq chip: %d\n", ret); 739 - return ret; 740 - } 733 + if (ret < 0) 734 + return dev_err_probe(info->dev, ret, 735 + "Failed to add RTC irq chip\n"); 741 736 742 737 return 0; 743 738 }
+6 -6
drivers/rtc/rtc-meson-vrtc.c
··· 13 13 14 14 struct meson_vrtc_data { 15 15 void __iomem *io_alarm; 16 - struct rtc_device *rtc; 17 16 unsigned long alarm_time; 18 17 bool enabled; 19 18 }; ··· 64 65 static int meson_vrtc_probe(struct platform_device *pdev) 65 66 { 66 67 struct meson_vrtc_data *vrtc; 68 + struct rtc_device *rtc; 67 69 68 70 vrtc = devm_kzalloc(&pdev->dev, sizeof(*vrtc), GFP_KERNEL); 69 71 if (!vrtc) ··· 78 78 79 79 platform_set_drvdata(pdev, vrtc); 80 80 81 - vrtc->rtc = devm_rtc_allocate_device(&pdev->dev); 82 - if (IS_ERR(vrtc->rtc)) 83 - return PTR_ERR(vrtc->rtc); 81 + rtc = devm_rtc_allocate_device(&pdev->dev); 82 + if (IS_ERR(rtc)) 83 + return PTR_ERR(rtc); 84 84 85 - vrtc->rtc->ops = &meson_vrtc_ops; 86 - return devm_rtc_register_device(vrtc->rtc); 85 + rtc->ops = &meson_vrtc_ops; 86 + return devm_rtc_register_device(rtc); 87 87 } 88 88 89 89 static int __maybe_unused meson_vrtc_suspend(struct device *dev)
+8 -8
drivers/rtc/rtc-meson.c
··· 59 59 #define MESON_STATIC_DEFAULT (MESON_STATIC_BIAS_CUR | MESON_STATIC_VOLTAGE) 60 60 61 61 struct meson_rtc { 62 - struct rtc_device *rtc; /* rtc device we created */ 63 62 struct device *dev; /* device we bound from */ 64 63 struct reset_control *reset; /* reset source */ 65 64 struct regulator *vdd; /* voltage input */ ··· 291 292 }; 292 293 struct device *dev = &pdev->dev; 293 294 struct meson_rtc *rtc; 295 + struct rtc_device *rtc_dev; 294 296 void __iomem *base; 295 297 int ret; 296 298 u32 tm; ··· 300 300 if (!rtc) 301 301 return -ENOMEM; 302 302 303 - rtc->rtc = devm_rtc_allocate_device(dev); 304 - if (IS_ERR(rtc->rtc)) 305 - return PTR_ERR(rtc->rtc); 303 + rtc_dev = devm_rtc_allocate_device(dev); 304 + if (IS_ERR(rtc_dev)) 305 + return PTR_ERR(rtc_dev); 306 306 307 307 platform_set_drvdata(pdev, rtc); 308 308 309 309 rtc->dev = dev; 310 310 311 - rtc->rtc->ops = &meson_rtc_ops; 312 - rtc->rtc->range_max = U32_MAX; 311 + rtc_dev->ops = &meson_rtc_ops; 312 + rtc_dev->range_max = U32_MAX; 313 313 314 314 base = devm_platform_ioremap_resource(pdev, 0); 315 315 if (IS_ERR(base)) ··· 365 365 } 366 366 367 367 meson_rtc_nvmem_config.priv = rtc; 368 - ret = devm_rtc_nvmem_register(rtc->rtc, &meson_rtc_nvmem_config); 368 + ret = devm_rtc_nvmem_register(rtc_dev, &meson_rtc_nvmem_config); 369 369 if (ret) 370 370 goto out_disable_vdd; 371 371 372 - ret = devm_rtc_register_device(rtc->rtc); 372 + ret = devm_rtc_register_device(rtc_dev); 373 373 if (ret) 374 374 goto out_disable_vdd; 375 375
+2 -8
drivers/rtc/rtc-mpfs.c
··· 266 266 writel(prescaler, rtcdev->base + PRESCALER_REG); 267 267 dev_info(&pdev->dev, "prescaler set to: %lu\n", prescaler); 268 268 269 - device_init_wakeup(&pdev->dev, true); 270 - ret = dev_pm_set_wake_irq(&pdev->dev, wakeup_irq); 269 + devm_device_init_wakeup(&pdev->dev); 270 + ret = devm_pm_set_wake_irq(&pdev->dev, wakeup_irq); 271 271 if (ret) 272 272 dev_err(&pdev->dev, "failed to enable irq wake\n"); 273 273 274 274 return devm_rtc_register_device(rtcdev->rtc); 275 - } 276 - 277 - static void mpfs_rtc_remove(struct platform_device *pdev) 278 - { 279 - dev_pm_clear_wake_irq(&pdev->dev); 280 275 } 281 276 282 277 static const struct of_device_id mpfs_rtc_of_match[] = { ··· 283 288 284 289 static struct platform_driver mpfs_rtc_driver = { 285 290 .probe = mpfs_rtc_probe, 286 - .remove = mpfs_rtc_remove, 287 291 .driver = { 288 292 .name = "mpfs_rtc", 289 293 .of_match_table = mpfs_rtc_of_match,
+9 -20
drivers/rtc/rtc-nxp-bbnsm.c
··· 189 189 /* clear all the pending events */ 190 190 regmap_write(bbnsm->regmap, BBNSM_EVENTS, 0x7A); 191 191 192 - device_init_wakeup(&pdev->dev, true); 193 - dev_pm_set_wake_irq(&pdev->dev, bbnsm->irq); 192 + ret = devm_device_init_wakeup(&pdev->dev); 193 + if (ret) 194 + dev_err(&pdev->dev, "failed to init wakeup, %d\n", ret); 195 + 196 + ret = devm_pm_set_wake_irq(&pdev->dev, bbnsm->irq); 197 + if (ret) 198 + dev_err(&pdev->dev, "failed to set wake irq, %d\n", ret); 194 199 195 200 ret = devm_request_irq(&pdev->dev, bbnsm->irq, bbnsm_rtc_irq_handler, 196 201 IRQF_SHARED, "rtc alarm", &pdev->dev); 197 202 if (ret) { 198 203 dev_err(&pdev->dev, "failed to request irq %d: %d\n", 199 204 bbnsm->irq, ret); 200 - goto err; 205 + return ret; 201 206 } 202 207 203 208 bbnsm->rtc->ops = &bbnsm_rtc_ops; 204 209 bbnsm->rtc->range_max = U32_MAX; 205 210 206 - ret = devm_rtc_register_device(bbnsm->rtc); 207 - if (ret) 208 - goto err; 209 - 210 - return 0; 211 - 212 - err: 213 - dev_pm_clear_wake_irq(&pdev->dev); 214 - device_init_wakeup(&pdev->dev, false); 215 - return ret; 216 - } 217 - 218 - static void bbnsm_rtc_remove(struct platform_device *pdev) 219 - { 220 - dev_pm_clear_wake_irq(&pdev->dev); 221 - device_init_wakeup(&pdev->dev, false); 211 + return devm_rtc_register_device(bbnsm->rtc); 222 212 } 223 213 224 214 static const struct of_device_id bbnsm_dt_ids[] = { ··· 223 233 .of_match_table = bbnsm_dt_ids, 224 234 }, 225 235 .probe = bbnsm_rtc_probe, 226 - .remove = bbnsm_rtc_remove, 227 236 }; 228 237 module_platform_driver(bbnsm_rtc_driver); 229 238
-284
drivers/rtc/rtc-pcf50633.c
··· 1 - // SPDX-License-Identifier: GPL-2.0-or-later 2 - /* NXP PCF50633 RTC Driver 3 - * 4 - * (C) 2006-2008 by Openmoko, Inc. 5 - * Author: Balaji Rao <balajirrao@openmoko.org> 6 - * All rights reserved. 7 - * 8 - * Broken down from monstrous PCF50633 driver mainly by 9 - * Harald Welte, Andy Green and Werner Almesberger 10 - */ 11 - 12 - #include <linux/kernel.h> 13 - #include <linux/module.h> 14 - #include <linux/init.h> 15 - #include <linux/device.h> 16 - #include <linux/slab.h> 17 - #include <linux/platform_device.h> 18 - #include <linux/rtc.h> 19 - #include <linux/bcd.h> 20 - #include <linux/err.h> 21 - 22 - #include <linux/mfd/pcf50633/core.h> 23 - 24 - #define PCF50633_REG_RTCSC 0x59 /* Second */ 25 - #define PCF50633_REG_RTCMN 0x5a /* Minute */ 26 - #define PCF50633_REG_RTCHR 0x5b /* Hour */ 27 - #define PCF50633_REG_RTCWD 0x5c /* Weekday */ 28 - #define PCF50633_REG_RTCDT 0x5d /* Day */ 29 - #define PCF50633_REG_RTCMT 0x5e /* Month */ 30 - #define PCF50633_REG_RTCYR 0x5f /* Year */ 31 - #define PCF50633_REG_RTCSCA 0x60 /* Alarm Second */ 32 - #define PCF50633_REG_RTCMNA 0x61 /* Alarm Minute */ 33 - #define PCF50633_REG_RTCHRA 0x62 /* Alarm Hour */ 34 - #define PCF50633_REG_RTCWDA 0x63 /* Alarm Weekday */ 35 - #define PCF50633_REG_RTCDTA 0x64 /* Alarm Day */ 36 - #define PCF50633_REG_RTCMTA 0x65 /* Alarm Month */ 37 - #define PCF50633_REG_RTCYRA 0x66 /* Alarm Year */ 38 - 39 - enum pcf50633_time_indexes { 40 - PCF50633_TI_SEC, 41 - PCF50633_TI_MIN, 42 - PCF50633_TI_HOUR, 43 - PCF50633_TI_WKDAY, 44 - PCF50633_TI_DAY, 45 - PCF50633_TI_MONTH, 46 - PCF50633_TI_YEAR, 47 - PCF50633_TI_EXTENT /* always last */ 48 - }; 49 - 50 - struct pcf50633_time { 51 - u_int8_t time[PCF50633_TI_EXTENT]; 52 - }; 53 - 54 - struct pcf50633_rtc { 55 - int alarm_enabled; 56 - int alarm_pending; 57 - 58 - struct pcf50633 *pcf; 59 - struct rtc_device *rtc_dev; 60 - }; 61 - 62 - static void pcf2rtc_time(struct rtc_time *rtc, struct pcf50633_time *pcf) 63 - { 64 - rtc->tm_sec = bcd2bin(pcf->time[PCF50633_TI_SEC]); 65 - rtc->tm_min = bcd2bin(pcf->time[PCF50633_TI_MIN]); 66 - rtc->tm_hour = bcd2bin(pcf->time[PCF50633_TI_HOUR]); 67 - rtc->tm_wday = bcd2bin(pcf->time[PCF50633_TI_WKDAY]); 68 - rtc->tm_mday = bcd2bin(pcf->time[PCF50633_TI_DAY]); 69 - rtc->tm_mon = bcd2bin(pcf->time[PCF50633_TI_MONTH]) - 1; 70 - rtc->tm_year = bcd2bin(pcf->time[PCF50633_TI_YEAR]) + 100; 71 - } 72 - 73 - static void rtc2pcf_time(struct pcf50633_time *pcf, struct rtc_time *rtc) 74 - { 75 - pcf->time[PCF50633_TI_SEC] = bin2bcd(rtc->tm_sec); 76 - pcf->time[PCF50633_TI_MIN] = bin2bcd(rtc->tm_min); 77 - pcf->time[PCF50633_TI_HOUR] = bin2bcd(rtc->tm_hour); 78 - pcf->time[PCF50633_TI_WKDAY] = bin2bcd(rtc->tm_wday); 79 - pcf->time[PCF50633_TI_DAY] = bin2bcd(rtc->tm_mday); 80 - pcf->time[PCF50633_TI_MONTH] = bin2bcd(rtc->tm_mon + 1); 81 - pcf->time[PCF50633_TI_YEAR] = bin2bcd(rtc->tm_year % 100); 82 - } 83 - 84 - static int 85 - pcf50633_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) 86 - { 87 - struct pcf50633_rtc *rtc = dev_get_drvdata(dev); 88 - int err; 89 - 90 - if (enabled) 91 - err = pcf50633_irq_unmask(rtc->pcf, PCF50633_IRQ_ALARM); 92 - else 93 - err = pcf50633_irq_mask(rtc->pcf, PCF50633_IRQ_ALARM); 94 - 95 - if (err < 0) 96 - return err; 97 - 98 - rtc->alarm_enabled = enabled; 99 - 100 - return 0; 101 - } 102 - 103 - static int pcf50633_rtc_read_time(struct device *dev, struct rtc_time *tm) 104 - { 105 - struct pcf50633_rtc *rtc; 106 - struct pcf50633_time pcf_tm; 107 - int ret; 108 - 109 - rtc = dev_get_drvdata(dev); 110 - 111 - ret = pcf50633_read_block(rtc->pcf, PCF50633_REG_RTCSC, 112 - PCF50633_TI_EXTENT, 113 - &pcf_tm.time[0]); 114 - if (ret != PCF50633_TI_EXTENT) { 115 - dev_err(dev, "Failed to read time\n"); 116 - return -EIO; 117 - } 118 - 119 - dev_dbg(dev, "PCF_TIME: %02x.%02x.%02x %02x:%02x:%02x\n", 120 - pcf_tm.time[PCF50633_TI_DAY], 121 - pcf_tm.time[PCF50633_TI_MONTH], 122 - pcf_tm.time[PCF50633_TI_YEAR], 123 - pcf_tm.time[PCF50633_TI_HOUR], 124 - pcf_tm.time[PCF50633_TI_MIN], 125 - pcf_tm.time[PCF50633_TI_SEC]); 126 - 127 - pcf2rtc_time(tm, &pcf_tm); 128 - 129 - dev_dbg(dev, "RTC_TIME: %ptRr\n", tm); 130 - 131 - return 0; 132 - } 133 - 134 - static int pcf50633_rtc_set_time(struct device *dev, struct rtc_time *tm) 135 - { 136 - struct pcf50633_rtc *rtc; 137 - struct pcf50633_time pcf_tm; 138 - int alarm_masked, ret = 0; 139 - 140 - rtc = dev_get_drvdata(dev); 141 - 142 - dev_dbg(dev, "RTC_TIME: %ptRr\n", tm); 143 - 144 - rtc2pcf_time(&pcf_tm, tm); 145 - 146 - dev_dbg(dev, "PCF_TIME: %02x.%02x.%02x %02x:%02x:%02x\n", 147 - pcf_tm.time[PCF50633_TI_DAY], 148 - pcf_tm.time[PCF50633_TI_MONTH], 149 - pcf_tm.time[PCF50633_TI_YEAR], 150 - pcf_tm.time[PCF50633_TI_HOUR], 151 - pcf_tm.time[PCF50633_TI_MIN], 152 - pcf_tm.time[PCF50633_TI_SEC]); 153 - 154 - 155 - alarm_masked = pcf50633_irq_mask_get(rtc->pcf, PCF50633_IRQ_ALARM); 156 - 157 - if (!alarm_masked) 158 - pcf50633_irq_mask(rtc->pcf, PCF50633_IRQ_ALARM); 159 - 160 - /* Returns 0 on success */ 161 - ret = pcf50633_write_block(rtc->pcf, PCF50633_REG_RTCSC, 162 - PCF50633_TI_EXTENT, 163 - &pcf_tm.time[0]); 164 - 165 - if (!alarm_masked) 166 - pcf50633_irq_unmask(rtc->pcf, PCF50633_IRQ_ALARM); 167 - 168 - return ret; 169 - } 170 - 171 - static int pcf50633_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) 172 - { 173 - struct pcf50633_rtc *rtc; 174 - struct pcf50633_time pcf_tm; 175 - int ret = 0; 176 - 177 - rtc = dev_get_drvdata(dev); 178 - 179 - alrm->enabled = rtc->alarm_enabled; 180 - alrm->pending = rtc->alarm_pending; 181 - 182 - ret = pcf50633_read_block(rtc->pcf, PCF50633_REG_RTCSCA, 183 - PCF50633_TI_EXTENT, &pcf_tm.time[0]); 184 - if (ret != PCF50633_TI_EXTENT) { 185 - dev_err(dev, "Failed to read time\n"); 186 - return -EIO; 187 - } 188 - 189 - pcf2rtc_time(&alrm->time, &pcf_tm); 190 - 191 - return rtc_valid_tm(&alrm->time); 192 - } 193 - 194 - static int pcf50633_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) 195 - { 196 - struct pcf50633_rtc *rtc; 197 - struct pcf50633_time pcf_tm; 198 - int alarm_masked, ret = 0; 199 - 200 - rtc = dev_get_drvdata(dev); 201 - 202 - rtc2pcf_time(&pcf_tm, &alrm->time); 203 - 204 - /* do like mktime does and ignore tm_wday */ 205 - pcf_tm.time[PCF50633_TI_WKDAY] = 7; 206 - 207 - alarm_masked = pcf50633_irq_mask_get(rtc->pcf, PCF50633_IRQ_ALARM); 208 - 209 - /* disable alarm interrupt */ 210 - if (!alarm_masked) 211 - pcf50633_irq_mask(rtc->pcf, PCF50633_IRQ_ALARM); 212 - 213 - /* Returns 0 on success */ 214 - ret = pcf50633_write_block(rtc->pcf, PCF50633_REG_RTCSCA, 215 - PCF50633_TI_EXTENT, &pcf_tm.time[0]); 216 - if (!alrm->enabled) 217 - rtc->alarm_pending = 0; 218 - 219 - if (!alarm_masked || alrm->enabled) 220 - pcf50633_irq_unmask(rtc->pcf, PCF50633_IRQ_ALARM); 221 - rtc->alarm_enabled = alrm->enabled; 222 - 223 - return ret; 224 - } 225 - 226 - static const struct rtc_class_ops pcf50633_rtc_ops = { 227 - .read_time = pcf50633_rtc_read_time, 228 - .set_time = pcf50633_rtc_set_time, 229 - .read_alarm = pcf50633_rtc_read_alarm, 230 - .set_alarm = pcf50633_rtc_set_alarm, 231 - .alarm_irq_enable = pcf50633_rtc_alarm_irq_enable, 232 - }; 233 - 234 - static void pcf50633_rtc_irq(int irq, void *data) 235 - { 236 - struct pcf50633_rtc *rtc = data; 237 - 238 - rtc_update_irq(rtc->rtc_dev, 1, RTC_AF | RTC_IRQF); 239 - rtc->alarm_pending = 1; 240 - } 241 - 242 - static int pcf50633_rtc_probe(struct platform_device *pdev) 243 - { 244 - struct pcf50633_rtc *rtc; 245 - 246 - rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); 247 - if (!rtc) 248 - return -ENOMEM; 249 - 250 - rtc->pcf = dev_to_pcf50633(pdev->dev.parent); 251 - platform_set_drvdata(pdev, rtc); 252 - rtc->rtc_dev = devm_rtc_device_register(&pdev->dev, "pcf50633-rtc", 253 - &pcf50633_rtc_ops, THIS_MODULE); 254 - 255 - if (IS_ERR(rtc->rtc_dev)) 256 - return PTR_ERR(rtc->rtc_dev); 257 - 258 - pcf50633_register_irq(rtc->pcf, PCF50633_IRQ_ALARM, 259 - pcf50633_rtc_irq, rtc); 260 - return 0; 261 - } 262 - 263 - static void pcf50633_rtc_remove(struct platform_device *pdev) 264 - { 265 - struct pcf50633_rtc *rtc; 266 - 267 - rtc = platform_get_drvdata(pdev); 268 - pcf50633_free_irq(rtc->pcf, PCF50633_IRQ_ALARM); 269 - } 270 - 271 - static struct platform_driver pcf50633_rtc_driver = { 272 - .driver = { 273 - .name = "pcf50633-rtc", 274 - }, 275 - .probe = pcf50633_rtc_probe, 276 - .remove = pcf50633_rtc_remove, 277 - }; 278 - 279 - module_platform_driver(pcf50633_rtc_driver); 280 - 281 - MODULE_DESCRIPTION("PCF50633 RTC driver"); 282 - MODULE_AUTHOR("Balaji Rao <balajirrao@openmoko.org>"); 283 - MODULE_LICENSE("GPL"); 284 -
+20 -5
drivers/rtc/rtc-pcf85063.c
··· 35 35 #define PCF85063_REG_CTRL1_CAP_SEL BIT(0) 36 36 #define PCF85063_REG_CTRL1_STOP BIT(5) 37 37 #define PCF85063_REG_CTRL1_EXT_TEST BIT(7) 38 + #define PCF85063_REG_CTRL1_SWR 0x58 38 39 39 40 #define PCF85063_REG_CTRL2 0x01 40 41 #define PCF85063_CTRL2_AF BIT(6) ··· 590 589 591 590 i2c_set_clientdata(client, pcf85063); 592 591 593 - err = regmap_read(pcf85063->regmap, PCF85063_REG_CTRL1, &tmp); 594 - if (err) { 595 - dev_err(&client->dev, "RTC chip is not present\n"); 596 - return err; 597 - } 592 + err = regmap_read(pcf85063->regmap, PCF85063_REG_SC, &tmp); 593 + if (err) 594 + return dev_err_probe(&client->dev, err, "RTC chip is not present\n"); 598 595 599 596 pcf85063->rtc = devm_rtc_allocate_device(&client->dev); 600 597 if (IS_ERR(pcf85063->rtc)) 601 598 return PTR_ERR(pcf85063->rtc); 599 + 600 + /* 601 + * If a Power loss is detected, SW reset the device. 602 + * From PCF85063A datasheet: 603 + * There is a low probability that some devices will have corruption 604 + * of the registers after the automatic power-on reset... 605 + */ 606 + if (tmp & PCF85063_REG_SC_OS) { 607 + dev_warn(&client->dev, 608 + "POR issue detected, sending a SW reset\n"); 609 + err = regmap_write(pcf85063->regmap, PCF85063_REG_CTRL1, 610 + PCF85063_REG_CTRL1_SWR); 611 + if (err < 0) 612 + dev_warn(&client->dev, 613 + "SW reset failed, trying to continue\n"); 614 + } 602 615 603 616 err = pcf85063_load_capacitance(pcf85063, client->dev.of_node, 604 617 config->force_cap_7000 ? 7000 : 0);
+8 -8
drivers/rtc/rtc-pl030.c
··· 21 21 #define RTC_CR_MIE (1 << 0) 22 22 23 23 struct pl030_rtc { 24 - struct rtc_device *rtc; 25 24 void __iomem *base; 26 25 }; 27 26 ··· 85 86 { 86 87 struct pl030_rtc *rtc; 87 88 int ret; 89 + struct rtc_device *rtc_dev; 88 90 89 91 ret = amba_request_regions(dev, NULL); 90 92 if (ret) ··· 97 97 goto err_rtc; 98 98 } 99 99 100 - rtc->rtc = devm_rtc_allocate_device(&dev->dev); 101 - if (IS_ERR(rtc->rtc)) { 102 - ret = PTR_ERR(rtc->rtc); 100 + rtc_dev = devm_rtc_allocate_device(&dev->dev); 101 + if (IS_ERR(rtc_dev)) { 102 + ret = PTR_ERR(rtc_dev); 103 103 goto err_rtc; 104 104 } 105 105 106 - rtc->rtc->ops = &pl030_ops; 107 - rtc->rtc->range_max = U32_MAX; 106 + rtc_dev->ops = &pl030_ops; 107 + rtc_dev->range_max = U32_MAX; 108 108 rtc->base = ioremap(dev->res.start, resource_size(&dev->res)); 109 109 if (!rtc->base) { 110 110 ret = -ENOMEM; ··· 121 121 if (ret) 122 122 goto err_irq; 123 123 124 - ret = devm_rtc_register_device(rtc->rtc); 124 + ret = devm_rtc_register_device(rtc_dev); 125 125 if (ret) 126 126 goto err_reg; 127 127 ··· 148 148 amba_release_regions(dev); 149 149 } 150 150 151 - static struct amba_id pl030_ids[] = { 151 + static const struct amba_id pl030_ids[] = { 152 152 { 153 153 .id = 0x00041030, 154 154 .mask = 0x000fffff,
+4 -4
drivers/rtc/rtc-pl031.c
··· 74 74 * @st_weekday: if this is an ST Microelectronics silicon version that need 75 75 * the weekday fix 76 76 * @irqflags: special IRQ flags per variant 77 + * @range_min: minimum date/time supported by the RTC 78 + * @range_max: maximum date/time supported by the RTC 77 79 */ 78 80 struct pl031_vendor_data { 79 81 struct rtc_class_ops ops; ··· 286 284 { 287 285 struct pl031_local *ldata = dev_get_drvdata(&adev->dev); 288 286 289 - dev_pm_clear_wake_irq(&adev->dev); 290 - device_init_wakeup(&adev->dev, false); 291 287 if (adev->irq[0]) 292 288 free_irq(adev->irq[0], ldata); 293 289 amba_release_regions(adev); ··· 350 350 } 351 351 } 352 352 353 - device_init_wakeup(&adev->dev, true); 353 + devm_device_init_wakeup(&adev->dev); 354 354 ldata->rtc = devm_rtc_allocate_device(&adev->dev); 355 355 if (IS_ERR(ldata->rtc)) { 356 356 ret = PTR_ERR(ldata->rtc); ··· 373 373 vendor->irqflags, "rtc-pl031", ldata); 374 374 if (ret) 375 375 goto out; 376 - dev_pm_set_wake_irq(&adev->dev, adev->irq[0]); 376 + devm_pm_set_wake_irq(&adev->dev, adev->irq[0]); 377 377 } 378 378 return 0; 379 379
+175 -45
drivers/rtc/rtc-pm8xxx.c
··· 5 5 * Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved. 6 6 * Copyright (c) 2023, Linaro Limited 7 7 */ 8 + #include <linux/efi.h> 8 9 #include <linux/of.h> 9 10 #include <linux/module.h> 10 11 #include <linux/nvmem-consumer.h> ··· 17 16 #include <linux/regmap.h> 18 17 #include <linux/slab.h> 19 18 #include <linux/spinlock.h> 20 - 21 19 #include <linux/unaligned.h> 20 + 21 + #include <asm/byteorder.h> 22 22 23 23 /* RTC_CTRL register bit fields */ 24 24 #define PM8xxx_RTC_ENABLE BIT(7) ··· 48 46 unsigned int alarm_en; 49 47 }; 50 48 49 + struct qcom_uefi_rtc_info { 50 + __le32 offset_gps; 51 + u8 reserved[8]; 52 + } __packed; 53 + 51 54 /** 52 55 * struct pm8xxx_rtc - RTC driver internal structure 53 56 * @rtc: RTC device 54 57 * @regmap: regmap used to access registers 55 58 * @allow_set_time: whether the time can be set 59 + * @use_uefi: use UEFI variable as fallback for offset 56 60 * @alarm_irq: alarm irq number 57 61 * @regs: register description 58 62 * @dev: device structure 63 + * @rtc_info: qcom uefi rtc-info structure 59 64 * @nvmem_cell: nvmem cell for offset 60 65 * @offset: offset from epoch in seconds 66 + * @offset_dirty: offset needs to be stored on shutdown 61 67 */ 62 68 struct pm8xxx_rtc { 63 69 struct rtc_device *rtc; 64 70 struct regmap *regmap; 65 71 bool allow_set_time; 72 + bool use_uefi; 66 73 int alarm_irq; 67 74 const struct pm8xxx_rtc_regs *regs; 68 75 struct device *dev; 76 + struct qcom_uefi_rtc_info rtc_info; 69 77 struct nvmem_cell *nvmem_cell; 70 78 u32 offset; 79 + bool offset_dirty; 71 80 }; 81 + 82 + #ifdef CONFIG_EFI 83 + 84 + MODULE_IMPORT_NS("EFIVAR"); 85 + 86 + #define QCOM_UEFI_NAME L"RTCInfo" 87 + #define QCOM_UEFI_GUID EFI_GUID(0x882f8c2b, 0x9646, 0x435f, \ 88 + 0x8d, 0xe5, 0xf2, 0x08, 0xff, 0x80, 0xc1, 0xbd) 89 + #define QCOM_UEFI_ATTRS (EFI_VARIABLE_NON_VOLATILE | \ 90 + EFI_VARIABLE_BOOTSERVICE_ACCESS | \ 91 + EFI_VARIABLE_RUNTIME_ACCESS) 92 + 93 + static int pm8xxx_rtc_read_uefi_offset(struct pm8xxx_rtc *rtc_dd) 94 + { 95 + struct qcom_uefi_rtc_info *rtc_info = &rtc_dd->rtc_info; 96 + unsigned long size = sizeof(*rtc_info); 97 + struct device *dev = rtc_dd->dev; 98 + efi_status_t status; 99 + u32 offset_gps; 100 + int rc; 101 + 102 + rc = efivar_lock(); 103 + if (rc) 104 + return rc; 105 + 106 + status = efivar_get_variable(QCOM_UEFI_NAME, &QCOM_UEFI_GUID, NULL, 107 + &size, rtc_info); 108 + efivar_unlock(); 109 + 110 + if (status != EFI_SUCCESS) { 111 + dev_dbg(dev, "failed to read UEFI offset: %lu\n", status); 112 + return efi_status_to_err(status); 113 + } 114 + 115 + if (size != sizeof(*rtc_info)) { 116 + dev_dbg(dev, "unexpected UEFI structure size %lu\n", size); 117 + return -EINVAL; 118 + } 119 + 120 + dev_dbg(dev, "uefi_rtc_info = %*ph\n", (int)size, rtc_info); 121 + 122 + /* Convert from GPS to Unix time offset */ 123 + offset_gps = le32_to_cpu(rtc_info->offset_gps); 124 + rtc_dd->offset = offset_gps + (u32)RTC_TIMESTAMP_EPOCH_GPS; 125 + 126 + return 0; 127 + } 128 + 129 + static int pm8xxx_rtc_write_uefi_offset(struct pm8xxx_rtc *rtc_dd, u32 offset) 130 + { 131 + struct qcom_uefi_rtc_info *rtc_info = &rtc_dd->rtc_info; 132 + unsigned long size = sizeof(*rtc_info); 133 + struct device *dev = rtc_dd->dev; 134 + efi_status_t status; 135 + u32 offset_gps; 136 + 137 + /* Convert from Unix to GPS time offset */ 138 + offset_gps = offset - (u32)RTC_TIMESTAMP_EPOCH_GPS; 139 + 140 + rtc_info->offset_gps = cpu_to_le32(offset_gps); 141 + 142 + dev_dbg(dev, "efi_rtc_info = %*ph\n", (int)size, rtc_info); 143 + 144 + status = efivar_set_variable(QCOM_UEFI_NAME, &QCOM_UEFI_GUID, 145 + QCOM_UEFI_ATTRS, size, rtc_info); 146 + if (status != EFI_SUCCESS) { 147 + dev_dbg(dev, "failed to write UEFI offset: %lx\n", status); 148 + return efi_status_to_err(status); 149 + } 150 + 151 + return 0; 152 + } 153 + 154 + #else /* CONFIG_EFI */ 155 + 156 + static int pm8xxx_rtc_read_uefi_offset(struct pm8xxx_rtc *rtc_dd) 157 + { 158 + return -ENODEV; 159 + } 160 + 161 + static int pm8xxx_rtc_write_uefi_offset(struct pm8xxx_rtc *rtc_dd, u32 offset) 162 + { 163 + return -ENODEV; 164 + } 165 + 166 + #endif /* CONFIG_EFI */ 72 167 73 168 static int pm8xxx_rtc_read_nvmem_offset(struct pm8xxx_rtc *rtc_dd) 74 169 { ··· 209 110 return 0; 210 111 } 211 112 212 - static int pm8xxx_rtc_read_offset(struct pm8xxx_rtc *rtc_dd) 213 - { 214 - if (!rtc_dd->nvmem_cell) 215 - return 0; 216 - 217 - return pm8xxx_rtc_read_nvmem_offset(rtc_dd); 218 - } 219 - 220 113 static int pm8xxx_rtc_read_raw(struct pm8xxx_rtc *rtc_dd, u32 *secs) 221 114 { 222 115 const struct pm8xxx_rtc_regs *regs = rtc_dd->regs; ··· 246 155 u32 offset; 247 156 int rc; 248 157 249 - if (!rtc_dd->nvmem_cell) 158 + if (!rtc_dd->nvmem_cell && !rtc_dd->use_uefi) 250 159 return -ENODEV; 251 160 252 161 rc = pm8xxx_rtc_read_raw(rtc_dd, &raw_secs); ··· 258 167 if (offset == rtc_dd->offset) 259 168 return 0; 260 169 261 - rc = pm8xxx_rtc_write_nvmem_offset(rtc_dd, offset); 170 + /* 171 + * Reduce flash wear by deferring updates due to clock drift until 172 + * shutdown. 173 + */ 174 + if (abs_diff(offset, rtc_dd->offset) < 30) { 175 + rtc_dd->offset_dirty = true; 176 + goto out; 177 + } 178 + 179 + if (rtc_dd->nvmem_cell) 180 + rc = pm8xxx_rtc_write_nvmem_offset(rtc_dd, offset); 181 + else 182 + rc = pm8xxx_rtc_write_uefi_offset(rtc_dd, offset); 183 + 262 184 if (rc) 263 185 return rc; 264 186 187 + rtc_dd->offset_dirty = false; 188 + out: 265 189 rtc_dd->offset = offset; 266 190 267 191 return 0; ··· 561 455 }; 562 456 MODULE_DEVICE_TABLE(of, pm8xxx_id_table); 563 457 458 + static int pm8xxx_rtc_probe_offset(struct pm8xxx_rtc *rtc_dd) 459 + { 460 + int rc; 461 + 462 + rtc_dd->nvmem_cell = devm_nvmem_cell_get(rtc_dd->dev, "offset"); 463 + if (IS_ERR(rtc_dd->nvmem_cell)) { 464 + rc = PTR_ERR(rtc_dd->nvmem_cell); 465 + if (rc != -ENOENT) 466 + return rc; 467 + rtc_dd->nvmem_cell = NULL; 468 + } else { 469 + return pm8xxx_rtc_read_nvmem_offset(rtc_dd); 470 + } 471 + 472 + /* Use UEFI storage as fallback if available */ 473 + if (efivar_is_available()) { 474 + rc = pm8xxx_rtc_read_uefi_offset(rtc_dd); 475 + if (rc == 0) 476 + rtc_dd->use_uefi = true; 477 + } 478 + 479 + return 0; 480 + } 481 + 564 482 static int pm8xxx_rtc_probe(struct platform_device *pdev) 565 483 { 566 484 const struct of_device_id *match; ··· 599 469 if (rtc_dd == NULL) 600 470 return -ENOMEM; 601 471 472 + rtc_dd->regs = match->data; 473 + rtc_dd->dev = &pdev->dev; 474 + 602 475 rtc_dd->regmap = dev_get_regmap(pdev->dev.parent, NULL); 603 476 if (!rtc_dd->regmap) 604 477 return -ENXIO; 605 478 606 - rtc_dd->alarm_irq = platform_get_irq(pdev, 0); 607 - if (rtc_dd->alarm_irq < 0) 608 - return -ENXIO; 479 + if (!of_property_read_bool(pdev->dev.of_node, "qcom,no-alarm")) { 480 + rtc_dd->alarm_irq = platform_get_irq(pdev, 0); 481 + if (rtc_dd->alarm_irq < 0) 482 + return -ENXIO; 483 + } 609 484 610 485 rtc_dd->allow_set_time = of_property_read_bool(pdev->dev.of_node, 611 486 "allow-set-time"); 612 - 613 - rtc_dd->nvmem_cell = devm_nvmem_cell_get(&pdev->dev, "offset"); 614 - if (IS_ERR(rtc_dd->nvmem_cell)) { 615 - rc = PTR_ERR(rtc_dd->nvmem_cell); 616 - if (rc != -ENOENT) 617 - return rc; 618 - rtc_dd->nvmem_cell = NULL; 619 - } 620 - 621 - rtc_dd->regs = match->data; 622 - rtc_dd->dev = &pdev->dev; 623 - 624 487 if (!rtc_dd->allow_set_time) { 625 - rc = pm8xxx_rtc_read_offset(rtc_dd); 488 + rc = pm8xxx_rtc_probe_offset(rtc_dd); 626 489 if (rc) 627 490 return rc; 628 491 } ··· 626 503 627 504 platform_set_drvdata(pdev, rtc_dd); 628 505 629 - device_init_wakeup(&pdev->dev, true); 630 - 631 506 rtc_dd->rtc = devm_rtc_allocate_device(&pdev->dev); 632 507 if (IS_ERR(rtc_dd->rtc)) 633 508 return PTR_ERR(rtc_dd->rtc); ··· 633 512 rtc_dd->rtc->ops = &pm8xxx_rtc_ops; 634 513 rtc_dd->rtc->range_max = U32_MAX; 635 514 636 - rc = devm_request_any_context_irq(&pdev->dev, rtc_dd->alarm_irq, 637 - pm8xxx_alarm_trigger, 638 - IRQF_TRIGGER_RISING, 639 - "pm8xxx_rtc_alarm", rtc_dd); 640 - if (rc < 0) 641 - return rc; 515 + if (rtc_dd->alarm_irq) { 516 + rc = devm_request_any_context_irq(&pdev->dev, rtc_dd->alarm_irq, 517 + pm8xxx_alarm_trigger, 518 + IRQF_TRIGGER_RISING, 519 + "pm8xxx_rtc_alarm", rtc_dd); 520 + if (rc < 0) 521 + return rc; 642 522 643 - rc = devm_rtc_register_device(rtc_dd->rtc); 644 - if (rc) 645 - return rc; 523 + rc = devm_pm_set_wake_irq(&pdev->dev, rtc_dd->alarm_irq); 524 + if (rc) 525 + return rc; 646 526 647 - rc = dev_pm_set_wake_irq(&pdev->dev, rtc_dd->alarm_irq); 648 - if (rc) 649 - return rc; 527 + devm_device_init_wakeup(&pdev->dev); 528 + } else { 529 + clear_bit(RTC_FEATURE_ALARM, rtc_dd->rtc->features); 530 + } 650 531 651 - return 0; 532 + return devm_rtc_register_device(rtc_dd->rtc); 652 533 } 653 534 654 - static void pm8xxx_remove(struct platform_device *pdev) 535 + static void pm8xxx_shutdown(struct platform_device *pdev) 655 536 { 656 - dev_pm_clear_wake_irq(&pdev->dev); 537 + struct pm8xxx_rtc *rtc_dd = platform_get_drvdata(pdev); 538 + 539 + if (rtc_dd->offset_dirty) { 540 + if (rtc_dd->nvmem_cell) 541 + pm8xxx_rtc_write_nvmem_offset(rtc_dd, rtc_dd->offset); 542 + else 543 + pm8xxx_rtc_write_uefi_offset(rtc_dd, rtc_dd->offset); 544 + } 657 545 } 658 546 659 547 static struct platform_driver pm8xxx_rtc_driver = { 660 548 .probe = pm8xxx_rtc_probe, 661 - .remove = pm8xxx_remove, 549 + .shutdown = pm8xxx_shutdown, 662 550 .driver = { 663 551 .name = "rtc-pm8xxx", 664 552 .of_match_table = pm8xxx_id_table,
+6 -9
drivers/rtc/rtc-renesas-rtca3.c
··· 586 586 */ 587 587 usleep_range(sleep_us, sleep_us + 10); 588 588 589 - /* Disable all interrupts. */ 590 - mask = RTCA3_RCR1_AIE | RTCA3_RCR1_CIE | RTCA3_RCR1_PIE; 591 - ret = rtca3_alarm_irq_set_helper(priv, mask, 0); 592 - if (ret) 593 - return ret; 594 - 595 589 mask = RTCA3_RCR2_START | RTCA3_RCR2_HR24; 596 590 val = readb(priv->base + RTCA3_RCR2); 597 - /* Nothing to do if already started in 24 hours and calendar count mode. */ 598 - if ((val & mask) == mask) 599 - return 0; 591 + /* Only disable the interrupts if already started in 24 hours and calendar count mode. */ 592 + if ((val & mask) == mask) { 593 + /* Disable all interrupts. */ 594 + mask = RTCA3_RCR1_AIE | RTCA3_RCR1_CIE | RTCA3_RCR1_PIE; 595 + return rtca3_alarm_irq_set_helper(priv, mask, 0); 596 + } 600 597 601 598 /* Reconfigure the RTC in 24 hours and calendar count mode. */ 602 599 mask = RTCA3_RCR2_START | RTCA3_RCR2_CNTMD;
+1 -7
drivers/rtc/rtc-rv3032.c
··· 69 69 #define RV3032_CLKOUT2_FD_MSK GENMASK(6, 5) 70 70 #define RV3032_CLKOUT2_OS BIT(7) 71 71 72 - #define RV3032_CTRL1_EERD BIT(3) 73 - #define RV3032_CTRL1_WADA BIT(5) 72 + #define RV3032_CTRL1_EERD BIT(2) 74 73 75 74 #define RV3032_CTRL2_STOP BIT(0) 76 75 #define RV3032_CTRL2_EIE BIT(2) ··· 945 946 } 946 947 if (!client->irq) 947 948 clear_bit(RTC_FEATURE_ALARM, rv3032->rtc->features); 948 - 949 - ret = regmap_update_bits(rv3032->regmap, RV3032_CTRL1, 950 - RV3032_CTRL1_WADA, RV3032_CTRL1_WADA); 951 - if (ret) 952 - return ret; 953 949 954 950 rv3032_trickle_charger_setup(&client->dev, rv3032); 955 951
+36 -49
drivers/rtc/rtc-rx8581.c
··· 52 52 #define RX8571_USER_RAM 0x10 53 53 #define RX8571_NVRAM_SIZE 0x10 54 54 55 - struct rx8581 { 56 - struct regmap *regmap; 57 - struct rtc_device *rtc; 58 - }; 59 - 60 55 struct rx85x1_config { 61 56 struct regmap_config regmap; 62 57 unsigned int num_nvram; ··· 67 72 unsigned char date[7]; 68 73 unsigned int data; 69 74 int err; 70 - struct rx8581 *rx8581 = i2c_get_clientdata(client); 75 + struct regmap *regmap = i2c_get_clientdata(client); 71 76 72 77 /* First we ensure that the "update flag" is not set, we read the 73 78 * time and date then re-read the "update flag". If the update flag 74 79 * has been set, we know that the time has changed during the read so 75 80 * we repeat the whole process again. 76 81 */ 77 - err = regmap_read(rx8581->regmap, RX8581_REG_FLAG, &data); 82 + err = regmap_read(regmap, RX8581_REG_FLAG, &data); 78 83 if (err < 0) 79 84 return err; 80 85 ··· 87 92 do { 88 93 /* If update flag set, clear it */ 89 94 if (data & RX8581_FLAG_UF) { 90 - err = regmap_write(rx8581->regmap, RX8581_REG_FLAG, 91 - data & ~RX8581_FLAG_UF); 95 + err = regmap_write(regmap, RX8581_REG_FLAG, 96 + data & ~RX8581_FLAG_UF); 92 97 if (err < 0) 93 98 return err; 94 99 } 95 100 96 101 /* Now read time and date */ 97 - err = regmap_bulk_read(rx8581->regmap, RX8581_REG_SC, date, 102 + err = regmap_bulk_read(regmap, RX8581_REG_SC, date, 98 103 sizeof(date)); 99 104 if (err < 0) 100 105 return err; 101 106 102 107 /* Check flag register */ 103 - err = regmap_read(rx8581->regmap, RX8581_REG_FLAG, &data); 108 + err = regmap_read(regmap, RX8581_REG_FLAG, &data); 104 109 if (err < 0) 105 110 return err; 106 111 } while (data & RX8581_FLAG_UF); ··· 132 137 struct i2c_client *client = to_i2c_client(dev); 133 138 int err; 134 139 unsigned char buf[7]; 135 - struct rx8581 *rx8581 = i2c_get_clientdata(client); 140 + struct regmap *regmap = i2c_get_clientdata(client); 136 141 137 142 dev_dbg(dev, "%s: secs=%d, mins=%d, hours=%d, " 138 143 "mday=%d, mon=%d, year=%d, wday=%d\n", ··· 155 160 buf[RX8581_REG_DW] = (0x1 << tm->tm_wday); 156 161 157 162 /* Stop the clock */ 158 - err = regmap_update_bits(rx8581->regmap, RX8581_REG_CTRL, 163 + err = regmap_update_bits(regmap, RX8581_REG_CTRL, 159 164 RX8581_CTRL_STOP, RX8581_CTRL_STOP); 160 165 if (err < 0) 161 166 return err; 162 167 163 168 /* write register's data */ 164 - err = regmap_bulk_write(rx8581->regmap, RX8581_REG_SC, 165 - buf, sizeof(buf)); 169 + err = regmap_bulk_write(regmap, RX8581_REG_SC, buf, sizeof(buf)); 166 170 if (err < 0) 167 171 return err; 168 172 169 173 /* get VLF and clear it */ 170 - err = regmap_update_bits(rx8581->regmap, RX8581_REG_FLAG, 171 - RX8581_FLAG_VLF, 0); 174 + err = regmap_update_bits(regmap, RX8581_REG_FLAG, RX8581_FLAG_VLF, 0); 172 175 if (err < 0) 173 176 return err; 174 177 175 178 /* Restart the clock */ 176 - return regmap_update_bits(rx8581->regmap, RX8581_REG_CTRL, 179 + return regmap_update_bits(regmap, RX8581_REG_CTRL, 177 180 RX8581_CTRL_STOP, 0); 178 181 } 179 182 ··· 183 190 static int rx8571_nvram_read(void *priv, unsigned int offset, void *val, 184 191 size_t bytes) 185 192 { 186 - struct rx8581 *rx8581 = priv; 193 + struct regmap *regmap = priv; 187 194 188 - return regmap_bulk_read(rx8581->regmap, RX8571_USER_RAM + offset, 189 - val, bytes); 195 + return regmap_bulk_read(regmap, RX8571_USER_RAM + offset, val, bytes); 190 196 } 191 197 192 198 static int rx8571_nvram_write(void *priv, unsigned int offset, void *val, 193 199 size_t bytes) 194 200 { 195 - struct rx8581 *rx8581 = priv; 201 + struct regmap *regmap = priv; 196 202 197 - return regmap_bulk_write(rx8581->regmap, RX8571_USER_RAM + offset, 198 - val, bytes); 203 + return regmap_bulk_write(regmap, RX8571_USER_RAM + offset, val, bytes); 199 204 } 200 205 201 206 static int rx85x1_nvram_read(void *priv, unsigned int offset, void *val, 202 207 size_t bytes) 203 208 { 204 - struct rx8581 *rx8581 = priv; 209 + struct regmap *regmap = priv; 205 210 unsigned int tmp_val; 206 211 int ret; 207 212 208 - ret = regmap_read(rx8581->regmap, RX8581_REG_RAM, &tmp_val); 213 + ret = regmap_read(regmap, RX8581_REG_RAM, &tmp_val); 209 214 (*(unsigned char *)val) = (unsigned char) tmp_val; 210 215 211 216 return ret; ··· 212 221 static int rx85x1_nvram_write(void *priv, unsigned int offset, void *val, 213 222 size_t bytes) 214 223 { 215 - struct rx8581 *rx8581 = priv; 224 + struct regmap *regmap = priv; 216 225 unsigned char tmp_val; 217 226 218 227 tmp_val = *((unsigned char *)val); 219 - return regmap_write(rx8581->regmap, RX8581_REG_RAM, 220 - (unsigned int)tmp_val); 228 + return regmap_write(regmap, RX8581_REG_RAM, (unsigned int)tmp_val); 221 229 } 222 230 223 231 static const struct rx85x1_config rx8581_config = { ··· 239 249 240 250 static int rx8581_probe(struct i2c_client *client) 241 251 { 242 - struct rx8581 *rx8581; 252 + struct regmap *regmap; 243 253 const struct rx85x1_config *config = &rx8581_config; 244 254 const void *data = of_device_get_match_data(&client->dev); 255 + struct rtc_device *rtc; 245 256 static struct nvmem_config nvmem_cfg[] = { 246 257 { 247 258 .name = "rx85x1-", ··· 267 276 if (data) 268 277 config = data; 269 278 270 - rx8581 = devm_kzalloc(&client->dev, sizeof(struct rx8581), GFP_KERNEL); 271 - if (!rx8581) 272 - return -ENOMEM; 279 + regmap = devm_regmap_init_i2c(client, &config->regmap); 280 + if (IS_ERR(regmap)) 281 + return PTR_ERR(regmap); 273 282 274 - i2c_set_clientdata(client, rx8581); 283 + i2c_set_clientdata(client, regmap); 275 284 276 - rx8581->regmap = devm_regmap_init_i2c(client, &config->regmap); 277 - if (IS_ERR(rx8581->regmap)) 278 - return PTR_ERR(rx8581->regmap); 285 + rtc = devm_rtc_allocate_device(&client->dev); 286 + if (IS_ERR(rtc)) 287 + return PTR_ERR(rtc); 279 288 280 - rx8581->rtc = devm_rtc_allocate_device(&client->dev); 281 - if (IS_ERR(rx8581->rtc)) 282 - return PTR_ERR(rx8581->rtc); 289 + rtc->ops = &rx8581_rtc_ops; 290 + rtc->range_min = RTC_TIMESTAMP_BEGIN_2000; 291 + rtc->range_max = RTC_TIMESTAMP_END_2099; 292 + rtc->start_secs = 0; 293 + rtc->set_start_time = true; 283 294 284 - rx8581->rtc->ops = &rx8581_rtc_ops; 285 - rx8581->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000; 286 - rx8581->rtc->range_max = RTC_TIMESTAMP_END_2099; 287 - rx8581->rtc->start_secs = 0; 288 - rx8581->rtc->set_start_time = true; 289 - 290 - ret = devm_rtc_register_device(rx8581->rtc); 295 + ret = devm_rtc_register_device(rtc); 291 296 292 297 for (i = 0; i < config->num_nvram; i++) { 293 - nvmem_cfg[i].priv = rx8581; 294 - devm_rtc_nvmem_register(rx8581->rtc, &nvmem_cfg[i]); 298 + nvmem_cfg[i].priv = regmap; 299 + devm_rtc_nvmem_register(rtc, &nvmem_cfg[i]); 295 300 } 296 301 297 302 return ret;
+91 -17
drivers/rtc/rtc-rzn1.c
··· 19 19 #include <linux/platform_device.h> 20 20 #include <linux/pm_runtime.h> 21 21 #include <linux/rtc.h> 22 + #include <linux/spinlock.h> 22 23 23 24 #define RZN1_RTC_CTL0 0x00 24 25 #define RZN1_RTC_CTL0_SLSB_SUBU 0 ··· 28 27 #define RZN1_RTC_CTL0_CE BIT(7) 29 28 30 29 #define RZN1_RTC_CTL1 0x04 30 + #define RZN1_RTC_CTL1_1SE BIT(3) 31 31 #define RZN1_RTC_CTL1_ALME BIT(4) 32 32 33 33 #define RZN1_RTC_CTL2 0x08 ··· 60 58 struct rzn1_rtc { 61 59 struct rtc_device *rtcdev; 62 60 void __iomem *base; 61 + /* 62 + * Protects access to RZN1_RTC_CTL1 reg. rtc_lock with threaded_irqs 63 + * would introduce race conditions when switching interrupts because 64 + * of potential sleeps 65 + */ 66 + spinlock_t ctl1_access_lock; 67 + struct rtc_time tm_alarm; 63 68 }; 64 69 65 70 static void rzn1_rtc_get_time_snapshot(struct rzn1_rtc *rtc, struct rtc_time *tm) ··· 144 135 static irqreturn_t rzn1_rtc_alarm_irq(int irq, void *dev_id) 145 136 { 146 137 struct rzn1_rtc *rtc = dev_id; 138 + u32 ctl1, set_irq_bits = 0; 147 139 148 - rtc_update_irq(rtc->rtcdev, 1, RTC_AF | RTC_IRQF); 140 + if (rtc->tm_alarm.tm_sec == 0) 141 + rtc_update_irq(rtc->rtcdev, 1, RTC_AF | RTC_IRQF); 142 + else 143 + /* Switch to 1s interrupts */ 144 + set_irq_bits = RZN1_RTC_CTL1_1SE; 145 + 146 + guard(spinlock)(&rtc->ctl1_access_lock); 147 + 148 + ctl1 = readl(rtc->base + RZN1_RTC_CTL1); 149 + ctl1 &= ~RZN1_RTC_CTL1_ALME; 150 + ctl1 |= set_irq_bits; 151 + writel(ctl1, rtc->base + RZN1_RTC_CTL1); 152 + 153 + return IRQ_HANDLED; 154 + } 155 + 156 + static irqreturn_t rzn1_rtc_1s_irq(int irq, void *dev_id) 157 + { 158 + struct rzn1_rtc *rtc = dev_id; 159 + u32 ctl1; 160 + 161 + if (readl(rtc->base + RZN1_RTC_SECC) == bin2bcd(rtc->tm_alarm.tm_sec)) { 162 + guard(spinlock)(&rtc->ctl1_access_lock); 163 + 164 + ctl1 = readl(rtc->base + RZN1_RTC_CTL1); 165 + ctl1 &= ~RZN1_RTC_CTL1_1SE; 166 + writel(ctl1, rtc->base + RZN1_RTC_CTL1); 167 + 168 + rtc_update_irq(rtc->rtcdev, 1, RTC_AF | RTC_IRQF); 169 + } 149 170 150 171 return IRQ_HANDLED; 151 172 } ··· 183 144 static int rzn1_rtc_alarm_irq_enable(struct device *dev, unsigned int enable) 184 145 { 185 146 struct rzn1_rtc *rtc = dev_get_drvdata(dev); 186 - u32 ctl1 = readl(rtc->base + RZN1_RTC_CTL1); 147 + struct rtc_time *tm = &rtc->tm_alarm, tm_now; 148 + u32 ctl1; 149 + int ret; 187 150 188 - if (enable) 189 - ctl1 |= RZN1_RTC_CTL1_ALME; 190 - else 191 - ctl1 &= ~RZN1_RTC_CTL1_ALME; 151 + guard(spinlock_irqsave)(&rtc->ctl1_access_lock); 192 152 193 - writel(ctl1, rtc->base + RZN1_RTC_CTL1); 153 + ctl1 = readl(rtc->base + RZN1_RTC_CTL1); 154 + 155 + if (enable) { 156 + /* 157 + * Use alarm interrupt if alarm time is at least a minute away 158 + * or less than a minute but in the next minute. Otherwise use 159 + * 1 second interrupt to wait for the proper second 160 + */ 161 + do { 162 + ctl1 &= ~(RZN1_RTC_CTL1_ALME | RZN1_RTC_CTL1_1SE); 163 + 164 + ret = rzn1_rtc_read_time(dev, &tm_now); 165 + if (ret) 166 + return ret; 167 + 168 + if (rtc_tm_sub(tm, &tm_now) > 59 || tm->tm_min != tm_now.tm_min) 169 + ctl1 |= RZN1_RTC_CTL1_ALME; 170 + else 171 + ctl1 |= RZN1_RTC_CTL1_1SE; 172 + 173 + writel(ctl1, rtc->base + RZN1_RTC_CTL1); 174 + } while (readl(rtc->base + RZN1_RTC_SECC) != bin2bcd(tm_now.tm_sec)); 175 + } else { 176 + ctl1 &= ~(RZN1_RTC_CTL1_ALME | RZN1_RTC_CTL1_1SE); 177 + writel(ctl1, rtc->base + RZN1_RTC_CTL1); 178 + } 194 179 195 180 return 0; 196 181 } ··· 248 185 } 249 186 250 187 ctl1 = readl(rtc->base + RZN1_RTC_CTL1); 251 - alrm->enabled = !!(ctl1 & RZN1_RTC_CTL1_ALME); 188 + alrm->enabled = !!(ctl1 & (RZN1_RTC_CTL1_ALME | RZN1_RTC_CTL1_1SE)); 252 189 253 190 return 0; 254 191 } ··· 278 215 writel(bin2bcd(tm->tm_min), rtc->base + RZN1_RTC_ALM); 279 216 writel(bin2bcd(tm->tm_hour), rtc->base + RZN1_RTC_ALH); 280 217 writel(BIT(wday), rtc->base + RZN1_RTC_ALW); 218 + 219 + rtc->tm_alarm = alrm->time; 281 220 282 221 rzn1_rtc_alarm_irq_enable(dev, alrm->enabled); 283 222 ··· 369 304 static int rzn1_rtc_probe(struct platform_device *pdev) 370 305 { 371 306 struct rzn1_rtc *rtc; 372 - int alarm_irq; 307 + int irq; 373 308 int ret; 374 309 375 310 rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); ··· 382 317 if (IS_ERR(rtc->base)) 383 318 return dev_err_probe(&pdev->dev, PTR_ERR(rtc->base), "Missing reg\n"); 384 319 385 - alarm_irq = platform_get_irq(pdev, 0); 386 - if (alarm_irq < 0) 387 - return alarm_irq; 320 + irq = platform_get_irq_byname(pdev, "alarm"); 321 + if (irq < 0) 322 + return irq; 388 323 389 324 rtc->rtcdev = devm_rtc_allocate_device(&pdev->dev); 390 325 if (IS_ERR(rtc->rtcdev)) ··· 394 329 rtc->rtcdev->range_max = RTC_TIMESTAMP_END_2099; 395 330 rtc->rtcdev->alarm_offset_max = 7 * 86400; 396 331 rtc->rtcdev->ops = &rzn1_rtc_ops; 397 - set_bit(RTC_FEATURE_ALARM_RES_MINUTE, rtc->rtcdev->features); 398 - clear_bit(RTC_FEATURE_UPDATE_INTERRUPT, rtc->rtcdev->features); 399 332 400 333 ret = devm_pm_runtime_enable(&pdev->dev); 401 334 if (ret < 0) ··· 412 349 /* Disable all interrupts */ 413 350 writel(0, rtc->base + RZN1_RTC_CTL1); 414 351 415 - ret = devm_request_irq(&pdev->dev, alarm_irq, rzn1_rtc_alarm_irq, 0, 416 - dev_name(&pdev->dev), rtc); 352 + spin_lock_init(&rtc->ctl1_access_lock); 353 + 354 + ret = devm_request_irq(&pdev->dev, irq, rzn1_rtc_alarm_irq, 0, "RZN1 RTC Alarm", rtc); 417 355 if (ret) { 418 - dev_err(&pdev->dev, "RTC timer interrupt not available\n"); 356 + dev_err(&pdev->dev, "RTC alarm interrupt not available\n"); 419 357 goto dis_runtime_pm; 358 + } 359 + 360 + irq = platform_get_irq_byname_optional(pdev, "pps"); 361 + if (irq >= 0) 362 + ret = devm_request_irq(&pdev->dev, irq, rzn1_rtc_1s_irq, 0, "RZN1 RTC 1s", rtc); 363 + 364 + if (irq < 0 || ret) { 365 + set_bit(RTC_FEATURE_ALARM_RES_MINUTE, rtc->rtcdev->features); 366 + clear_bit(RTC_FEATURE_UPDATE_INTERRUPT, rtc->rtcdev->features); 367 + dev_warn(&pdev->dev, "RTC pps interrupt not available. Alarm has only minute accuracy\n"); 420 368 } 421 369 422 370 ret = devm_rtc_register_device(rtc->rtcdev);
+11 -11
drivers/rtc/rtc-s35390a.c
··· 63 63 64 64 struct s35390a { 65 65 struct i2c_client *client[8]; 66 - struct rtc_device *rtc; 67 66 int twentyfourhour; 68 67 }; 69 68 ··· 421 422 int err, err_read; 422 423 unsigned int i; 423 424 struct s35390a *s35390a; 425 + struct rtc_device *rtc; 424 426 char buf, status1; 425 427 struct device *dev = &client->dev; 426 428 ··· 447 447 } 448 448 } 449 449 450 - s35390a->rtc = devm_rtc_allocate_device(dev); 451 - if (IS_ERR(s35390a->rtc)) 452 - return PTR_ERR(s35390a->rtc); 450 + rtc = devm_rtc_allocate_device(dev); 451 + if (IS_ERR(rtc)) 452 + return PTR_ERR(rtc); 453 453 454 454 err_read = s35390a_read_status(s35390a, &status1); 455 455 if (err_read < 0) { ··· 480 480 481 481 device_set_wakeup_capable(dev, 1); 482 482 483 - s35390a->rtc->ops = &s35390a_rtc_ops; 484 - s35390a->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000; 485 - s35390a->rtc->range_max = RTC_TIMESTAMP_END_2099; 483 + rtc->ops = &s35390a_rtc_ops; 484 + rtc->range_min = RTC_TIMESTAMP_BEGIN_2000; 485 + rtc->range_max = RTC_TIMESTAMP_END_2099; 486 486 487 - set_bit(RTC_FEATURE_ALARM_RES_MINUTE, s35390a->rtc->features); 488 - clear_bit(RTC_FEATURE_UPDATE_INTERRUPT, s35390a->rtc->features ); 487 + set_bit(RTC_FEATURE_ALARM_RES_MINUTE, rtc->features); 488 + clear_bit(RTC_FEATURE_UPDATE_INTERRUPT, rtc->features); 489 489 490 490 if (status1 & S35390A_FLAG_INT2) 491 - rtc_update_irq(s35390a->rtc, 1, RTC_AF); 491 + rtc_update_irq(rtc, 1, RTC_AF); 492 492 493 - return devm_rtc_register_device(s35390a->rtc); 493 + return devm_rtc_register_device(rtc); 494 494 } 495 495 496 496 static struct i2c_driver s35390a_driver = {
+25 -33
drivers/rtc/rtc-s5m.c
··· 146 146 147 147 struct s5m_rtc_info { 148 148 struct device *dev; 149 - struct i2c_client *i2c; 150 149 struct sec_pmic_dev *s5m87xx; 151 150 struct regmap *regmap; 152 151 struct rtc_device *rtc_dev; ··· 626 627 } 627 628 628 629 info->rtc_24hr_mode = 1; 629 - if (ret < 0) { 630 - dev_err(info->dev, "%s: fail to write controlm reg(%d)\n", 631 - __func__, ret); 632 - return ret; 633 - } 630 + if (ret < 0) 631 + return dev_err_probe(info->dev, ret, 632 + "%s: fail to write controlm reg\n", 633 + __func__); 634 634 635 635 return ret; 636 636 } ··· 638 640 { 639 641 struct sec_pmic_dev *s5m87xx = dev_get_drvdata(pdev->dev.parent); 640 642 struct s5m_rtc_info *info; 643 + struct i2c_client *i2c; 641 644 const struct regmap_config *regmap_cfg; 642 645 int ret, alarm_irq; 643 646 ··· 668 669 alarm_irq = S5M8767_IRQ_RTCA1; 669 670 break; 670 671 default: 671 - dev_err(&pdev->dev, 672 - "Device type %lu is not supported by RTC driver\n", 673 - platform_get_device_id(pdev)->driver_data); 674 - return -ENODEV; 672 + return dev_err_probe(&pdev->dev, -ENODEV, 673 + "Device type %lu is not supported by RTC driver\n", 674 + platform_get_device_id(pdev)->driver_data); 675 675 } 676 676 677 - info->i2c = devm_i2c_new_dummy_device(&pdev->dev, s5m87xx->i2c->adapter, 678 - RTC_I2C_ADDR); 679 - if (IS_ERR(info->i2c)) { 680 - dev_err(&pdev->dev, "Failed to allocate I2C for RTC\n"); 681 - return PTR_ERR(info->i2c); 682 - } 677 + i2c = devm_i2c_new_dummy_device(&pdev->dev, s5m87xx->i2c->adapter, 678 + RTC_I2C_ADDR); 679 + if (IS_ERR(i2c)) 680 + return dev_err_probe(&pdev->dev, PTR_ERR(i2c), 681 + "Failed to allocate I2C for RTC\n"); 683 682 684 - info->regmap = devm_regmap_init_i2c(info->i2c, regmap_cfg); 685 - if (IS_ERR(info->regmap)) { 686 - ret = PTR_ERR(info->regmap); 687 - dev_err(&pdev->dev, "Failed to allocate RTC register map: %d\n", 688 - ret); 689 - return ret; 690 - } 683 + info->regmap = devm_regmap_init_i2c(i2c, regmap_cfg); 684 + if (IS_ERR(info->regmap)) 685 + return dev_err_probe(&pdev->dev, PTR_ERR(info->regmap), 686 + "Failed to allocate RTC register map\n"); 691 687 692 688 info->dev = &pdev->dev; 693 689 info->s5m87xx = s5m87xx; ··· 690 696 691 697 if (s5m87xx->irq_data) { 692 698 info->irq = regmap_irq_get_virq(s5m87xx->irq_data, alarm_irq); 693 - if (info->irq <= 0) { 694 - dev_err(&pdev->dev, "Failed to get virtual IRQ %d\n", 695 - alarm_irq); 696 - return -EINVAL; 697 - } 699 + if (info->irq <= 0) 700 + return dev_err_probe(&pdev->dev, -EINVAL, 701 + "Failed to get virtual IRQ %d\n", 702 + alarm_irq); 698 703 } 699 704 700 705 platform_set_drvdata(pdev, info); ··· 717 724 ret = devm_request_threaded_irq(&pdev->dev, info->irq, NULL, 718 725 s5m_rtc_alarm_irq, 0, "rtc-alarm0", 719 726 info); 720 - if (ret < 0) { 721 - dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n", 722 - info->irq, ret); 723 - return ret; 724 - } 727 + if (ret < 0) 728 + return dev_err_probe(&pdev->dev, ret, 729 + "Failed to request alarm IRQ %d\n", 730 + info->irq); 725 731 device_init_wakeup(&pdev->dev, true); 726 732 } 727 733
+8 -8
drivers/rtc/rtc-sd2405al.c
··· 42 42 43 43 struct sd2405al { 44 44 struct device *dev; 45 - struct rtc_device *rtc; 46 45 struct regmap *regmap; 47 46 }; 48 47 ··· 166 167 static int sd2405al_probe(struct i2c_client *client) 167 168 { 168 169 struct sd2405al *sd2405al; 170 + struct rtc_device *rtc; 169 171 int ret; 170 172 171 173 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) ··· 182 182 if (IS_ERR(sd2405al->regmap)) 183 183 return PTR_ERR(sd2405al->regmap); 184 184 185 - sd2405al->rtc = devm_rtc_allocate_device(&client->dev); 186 - if (IS_ERR(sd2405al->rtc)) 187 - return PTR_ERR(sd2405al->rtc); 185 + rtc = devm_rtc_allocate_device(&client->dev); 186 + if (IS_ERR(rtc)) 187 + return PTR_ERR(rtc); 188 188 189 - sd2405al->rtc->ops = &sd2405al_rtc_ops; 190 - sd2405al->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000; 191 - sd2405al->rtc->range_max = RTC_TIMESTAMP_END_2099; 189 + rtc->ops = &sd2405al_rtc_ops; 190 + rtc->range_min = RTC_TIMESTAMP_BEGIN_2000; 191 + rtc->range_max = RTC_TIMESTAMP_END_2099; 192 192 193 193 dev_set_drvdata(&client->dev, sd2405al); 194 194 195 - ret = devm_rtc_register_device(sd2405al->rtc); 195 + ret = devm_rtc_register_device(rtc); 196 196 if (ret < 0) 197 197 return ret; 198 198
+28 -43
drivers/rtc/rtc-sd3078.c
··· 36 36 */ 37 37 #define WRITE_PROTECT_EN 0 38 38 39 - struct sd3078 { 40 - struct rtc_device *rtc; 41 - struct regmap *regmap; 42 - }; 43 - 44 39 /* 45 40 * In order to prevent arbitrary modification of the time register, 46 41 * when modification of the register, ··· 44 49 * 2. set WRITE2 bit 45 50 * 3. set WRITE3 bit 46 51 */ 47 - static void sd3078_enable_reg_write(struct sd3078 *sd3078) 52 + static void sd3078_enable_reg_write(struct regmap *regmap) 48 53 { 49 - regmap_update_bits(sd3078->regmap, SD3078_REG_CTRL2, 50 - KEY_WRITE1, KEY_WRITE1); 51 - regmap_update_bits(sd3078->regmap, SD3078_REG_CTRL1, 52 - KEY_WRITE2, KEY_WRITE2); 53 - regmap_update_bits(sd3078->regmap, SD3078_REG_CTRL1, 54 - KEY_WRITE3, KEY_WRITE3); 54 + regmap_update_bits(regmap, SD3078_REG_CTRL2, KEY_WRITE1, KEY_WRITE1); 55 + regmap_update_bits(regmap, SD3078_REG_CTRL1, KEY_WRITE2, KEY_WRITE2); 56 + regmap_update_bits(regmap, SD3078_REG_CTRL1, KEY_WRITE3, KEY_WRITE3); 55 57 } 56 58 57 59 #if WRITE_PROTECT_EN ··· 61 69 * 2. clear WRITE3 bit 62 70 * 3. clear WRITE1 bit 63 71 */ 64 - static void sd3078_disable_reg_write(struct sd3078 *sd3078) 72 + static void sd3078_disable_reg_write(struct regmap *regmap) 65 73 { 66 - regmap_update_bits(sd3078->regmap, SD3078_REG_CTRL1, 67 - KEY_WRITE2, 0); 68 - regmap_update_bits(sd3078->regmap, SD3078_REG_CTRL1, 69 - KEY_WRITE3, 0); 70 - regmap_update_bits(sd3078->regmap, SD3078_REG_CTRL2, 71 - KEY_WRITE1, 0); 74 + regmap_update_bits(regmap, SD3078_REG_CTRL1, KEY_WRITE2, 0); 75 + regmap_update_bits(regmap, SD3078_REG_CTRL1, KEY_WRITE3, 0); 76 + regmap_update_bits(regmap, SD3078_REG_CTRL2, KEY_WRITE1, 0); 72 77 } 73 78 #endif 74 79 ··· 74 85 unsigned char hour; 75 86 unsigned char rtc_data[NUM_TIME_REGS] = {0}; 76 87 struct i2c_client *client = to_i2c_client(dev); 77 - struct sd3078 *sd3078 = i2c_get_clientdata(client); 88 + struct regmap *regmap = i2c_get_clientdata(client); 78 89 int ret; 79 90 80 - ret = regmap_bulk_read(sd3078->regmap, SD3078_REG_SC, rtc_data, 81 - NUM_TIME_REGS); 91 + ret = regmap_bulk_read(regmap, SD3078_REG_SC, rtc_data, NUM_TIME_REGS); 82 92 if (ret < 0) { 83 93 dev_err(dev, "reading from RTC failed with err:%d\n", ret); 84 94 return ret; ··· 111 123 { 112 124 unsigned char rtc_data[NUM_TIME_REGS]; 113 125 struct i2c_client *client = to_i2c_client(dev); 114 - struct sd3078 *sd3078 = i2c_get_clientdata(client); 126 + struct regmap *regmap = i2c_get_clientdata(client); 115 127 int ret; 116 128 117 129 rtc_data[SD3078_REG_SC] = bin2bcd(tm->tm_sec); ··· 123 135 rtc_data[SD3078_REG_YR] = bin2bcd(tm->tm_year - 100); 124 136 125 137 #if WRITE_PROTECT_EN 126 - sd3078_enable_reg_write(sd3078); 138 + sd3078_enable_reg_write(regmap); 127 139 #endif 128 140 129 - ret = regmap_bulk_write(sd3078->regmap, SD3078_REG_SC, rtc_data, 141 + ret = regmap_bulk_write(regmap, SD3078_REG_SC, rtc_data, 130 142 NUM_TIME_REGS); 131 143 if (ret < 0) { 132 144 dev_err(dev, "writing to RTC failed with err:%d\n", ret); ··· 134 146 } 135 147 136 148 #if WRITE_PROTECT_EN 137 - sd3078_disable_reg_write(sd3078); 149 + sd3078_disable_reg_write(regmap); 138 150 #endif 139 151 140 152 return 0; ··· 154 166 static int sd3078_probe(struct i2c_client *client) 155 167 { 156 168 int ret; 157 - struct sd3078 *sd3078; 169 + struct regmap *regmap; 170 + struct rtc_device *rtc; 158 171 159 172 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) 160 173 return -ENODEV; 161 174 162 - sd3078 = devm_kzalloc(&client->dev, sizeof(*sd3078), GFP_KERNEL); 163 - if (!sd3078) 164 - return -ENOMEM; 165 - 166 - sd3078->regmap = devm_regmap_init_i2c(client, &regmap_config); 167 - if (IS_ERR(sd3078->regmap)) { 175 + regmap = devm_regmap_init_i2c(client, &regmap_config); 176 + if (IS_ERR(regmap)) { 168 177 dev_err(&client->dev, "regmap allocation failed\n"); 169 - return PTR_ERR(sd3078->regmap); 178 + return PTR_ERR(regmap); 170 179 } 171 180 172 - i2c_set_clientdata(client, sd3078); 181 + i2c_set_clientdata(client, regmap); 173 182 174 - sd3078->rtc = devm_rtc_allocate_device(&client->dev); 175 - if (IS_ERR(sd3078->rtc)) 176 - return PTR_ERR(sd3078->rtc); 183 + rtc = devm_rtc_allocate_device(&client->dev); 184 + if (IS_ERR(rtc)) 185 + return PTR_ERR(rtc); 177 186 178 - sd3078->rtc->ops = &sd3078_rtc_ops; 179 - sd3078->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000; 180 - sd3078->rtc->range_max = RTC_TIMESTAMP_END_2099; 187 + rtc->ops = &sd3078_rtc_ops; 188 + rtc->range_min = RTC_TIMESTAMP_BEGIN_2000; 189 + rtc->range_max = RTC_TIMESTAMP_END_2099; 181 190 182 - ret = devm_rtc_register_device(sd3078->rtc); 191 + ret = devm_rtc_register_device(rtc); 183 192 if (ret) 184 193 return ret; 185 194 186 - sd3078_enable_reg_write(sd3078); 195 + sd3078_enable_reg_write(regmap); 187 196 188 197 return 0; 189 198 }
+2 -8
drivers/rtc/rtc-stm32.c
··· 1143 1143 goto err; 1144 1144 } 1145 1145 1146 - ret = device_init_wakeup(&pdev->dev, true); 1146 + ret = devm_device_init_wakeup(&pdev->dev); 1147 1147 if (ret) 1148 1148 goto err; 1149 1149 1150 - ret = dev_pm_set_wake_irq(&pdev->dev, rtc->irq_alarm); 1150 + ret = devm_pm_set_wake_irq(&pdev->dev, rtc->irq_alarm); 1151 1151 if (ret) 1152 1152 goto err; 1153 1153 ··· 1208 1208 if (rtc->data->need_dbp) 1209 1209 regmap_update_bits(rtc->dbp, rtc->dbp_reg, rtc->dbp_mask, 0); 1210 1210 1211 - dev_pm_clear_wake_irq(&pdev->dev); 1212 - device_init_wakeup(&pdev->dev, false); 1213 - 1214 1211 return ret; 1215 1212 } 1216 1213 ··· 1234 1237 /* Enable backup domain write protection if needed */ 1235 1238 if (rtc->data->need_dbp) 1236 1239 regmap_update_bits(rtc->dbp, rtc->dbp_reg, rtc->dbp_mask, 0); 1237 - 1238 - dev_pm_clear_wake_irq(&pdev->dev); 1239 - device_init_wakeup(&pdev->dev, false); 1240 1240 } 1241 1241 1242 1242 static int stm32_rtc_suspend(struct device *dev)
-5
include/linux/mfd/mt6397/rtc.h
··· 60 60 #define RTC_PDN2 0x002e 61 61 #define RTC_PDN2_PWRON_ALARM BIT(4) 62 62 63 - #define RTC_MIN_YEAR 1968 64 - #define RTC_BASE_YEAR 1900 65 - #define RTC_NUM_YEARS 128 66 - #define RTC_MIN_YEAR_OFFSET (RTC_MIN_YEAR - RTC_BASE_YEAR) 67 - 68 63 #define MTK_RTC_POLL_DELAY_US 10 69 64 #define MTK_RTC_POLL_TIMEOUT (jiffies_to_usecs(HZ)) 70 65
+1
include/linux/rtc.h
··· 170 170 /* useful timestamps */ 171 171 #define RTC_TIMESTAMP_BEGIN_0000 -62167219200ULL /* 0000-01-01 00:00:00 */ 172 172 #define RTC_TIMESTAMP_BEGIN_1900 -2208988800LL /* 1900-01-01 00:00:00 */ 173 + #define RTC_TIMESTAMP_EPOCH_GPS 315964800LL /* 1980-01-06 00:00:00 */ 173 174 #define RTC_TIMESTAMP_BEGIN_2000 946684800LL /* 2000-01-01 00:00:00 */ 174 175 #define RTC_TIMESTAMP_END_2063 2966371199LL /* 2063-12-31 23:59:59 */ 175 176 #define RTC_TIMESTAMP_END_2079 3471292799LL /* 2079-12-31 23:59:59 */
-1
tools/testing/selftests/rtc/.gitignore
··· 1 1 # SPDX-License-Identifier: GPL-2.0-only 2 2 rtctest 3 - setdate
-2
tools/testing/selftests/rtc/Makefile
··· 4 4 5 5 TEST_GEN_PROGS = rtctest 6 6 7 - TEST_GEN_PROGS_EXTENDED = setdate 8 - 9 7 TEST_FILES := settings 10 8 11 9 include ../lib.mk
+14 -5
tools/testing/selftests/rtc/rtctest.c
··· 29 29 RTC_ALARM_UNKNOWN, 30 30 RTC_ALARM_ENABLED, 31 31 RTC_ALARM_DISABLED, 32 + RTC_ALARM_RES_MINUTE, 32 33 }; 33 34 34 35 FIXTURE(rtc) { ··· 89 88 } 90 89 } 91 90 92 - static enum rtc_alarm_state get_rtc_alarm_state(int fd) 91 + static enum rtc_alarm_state get_rtc_alarm_state(int fd, int need_seconds) 93 92 { 94 93 struct rtc_param param = { 0 }; 95 94 int rc; ··· 103 102 104 103 if ((param.uvalue & _BITUL(RTC_FEATURE_ALARM)) == 0) 105 104 return RTC_ALARM_DISABLED; 105 + 106 + /* Check if alarm has desired granularity */ 107 + if (need_seconds && (param.uvalue & _BITUL(RTC_FEATURE_ALARM_RES_MINUTE))) 108 + return RTC_ALARM_RES_MINUTE; 106 109 107 110 return RTC_ALARM_ENABLED; 108 111 } ··· 232 227 SKIP(return, "Skipping test since %s does not exist", rtc_file); 233 228 ASSERT_NE(-1, self->fd); 234 229 235 - alarm_state = get_rtc_alarm_state(self->fd); 230 + alarm_state = get_rtc_alarm_state(self->fd, 1); 236 231 if (alarm_state == RTC_ALARM_DISABLED) 237 232 SKIP(return, "Skipping test since alarms are not supported."); 233 + if (alarm_state == RTC_ALARM_RES_MINUTE) 234 + SKIP(return, "Skipping test since alarms has only minute granularity."); 238 235 239 236 rc = ioctl(self->fd, RTC_RD_TIME, &tm); 240 237 ASSERT_NE(-1, rc); ··· 302 295 SKIP(return, "Skipping test since %s does not exist", rtc_file); 303 296 ASSERT_NE(-1, self->fd); 304 297 305 - alarm_state = get_rtc_alarm_state(self->fd); 298 + alarm_state = get_rtc_alarm_state(self->fd, 1); 306 299 if (alarm_state == RTC_ALARM_DISABLED) 307 300 SKIP(return, "Skipping test since alarms are not supported."); 301 + if (alarm_state == RTC_ALARM_RES_MINUTE) 302 + SKIP(return, "Skipping test since alarms has only minute granularity."); 308 303 309 304 rc = ioctl(self->fd, RTC_RD_TIME, &alarm.time); 310 305 ASSERT_NE(-1, rc); ··· 366 357 SKIP(return, "Skipping test since %s does not exist", rtc_file); 367 358 ASSERT_NE(-1, self->fd); 368 359 369 - alarm_state = get_rtc_alarm_state(self->fd); 360 + alarm_state = get_rtc_alarm_state(self->fd, 0); 370 361 if (alarm_state == RTC_ALARM_DISABLED) 371 362 SKIP(return, "Skipping test since alarms are not supported."); 372 363 ··· 434 425 SKIP(return, "Skipping test since %s does not exist", rtc_file); 435 426 ASSERT_NE(-1, self->fd); 436 427 437 - alarm_state = get_rtc_alarm_state(self->fd); 428 + alarm_state = get_rtc_alarm_state(self->fd, 0); 438 429 if (alarm_state == RTC_ALARM_DISABLED) 439 430 SKIP(return, "Skipping test since alarms are not supported."); 440 431
-77
tools/testing/selftests/rtc/setdate.c
··· 1 - // SPDX-License-Identifier: GPL-2.0-or-later 2 - /* Real Time Clock Driver Test 3 - * by: Benjamin Gaignard (benjamin.gaignard@linaro.org) 4 - * 5 - * To build 6 - * gcc rtctest_setdate.c -o rtctest_setdate 7 - */ 8 - 9 - #include <stdio.h> 10 - #include <linux/rtc.h> 11 - #include <sys/ioctl.h> 12 - #include <sys/time.h> 13 - #include <sys/types.h> 14 - #include <fcntl.h> 15 - #include <unistd.h> 16 - #include <stdlib.h> 17 - #include <errno.h> 18 - 19 - static const char default_time[] = "00:00:00"; 20 - 21 - int main(int argc, char **argv) 22 - { 23 - int fd, retval; 24 - struct rtc_time new, current; 25 - const char *rtc, *date; 26 - const char *time = default_time; 27 - 28 - switch (argc) { 29 - case 4: 30 - time = argv[3]; 31 - /* FALLTHROUGH */ 32 - case 3: 33 - date = argv[2]; 34 - rtc = argv[1]; 35 - break; 36 - default: 37 - fprintf(stderr, "usage: rtctest_setdate <rtcdev> <DD-MM-YYYY> [HH:MM:SS]\n"); 38 - return 1; 39 - } 40 - 41 - fd = open(rtc, O_RDONLY); 42 - if (fd == -1) { 43 - perror(rtc); 44 - exit(errno); 45 - } 46 - 47 - sscanf(date, "%d-%d-%d", &new.tm_mday, &new.tm_mon, &new.tm_year); 48 - new.tm_mon -= 1; 49 - new.tm_year -= 1900; 50 - sscanf(time, "%d:%d:%d", &new.tm_hour, &new.tm_min, &new.tm_sec); 51 - 52 - fprintf(stderr, "Test will set RTC date/time to %d-%d-%d, %02d:%02d:%02d.\n", 53 - new.tm_mday, new.tm_mon + 1, new.tm_year + 1900, 54 - new.tm_hour, new.tm_min, new.tm_sec); 55 - 56 - /* Write the new date in RTC */ 57 - retval = ioctl(fd, RTC_SET_TIME, &new); 58 - if (retval == -1) { 59 - perror("RTC_SET_TIME ioctl"); 60 - close(fd); 61 - exit(errno); 62 - } 63 - 64 - /* Read back */ 65 - retval = ioctl(fd, RTC_RD_TIME, &current); 66 - if (retval == -1) { 67 - perror("RTC_RD_TIME ioctl"); 68 - exit(errno); 69 - } 70 - 71 - fprintf(stderr, "\n\nCurrent RTC date/time is %d-%d-%d, %02d:%02d:%02d.\n", 72 - current.tm_mday, current.tm_mon + 1, current.tm_year + 1900, 73 - current.tm_hour, current.tm_min, current.tm_sec); 74 - 75 - close(fd); 76 - return 0; 77 - }