hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/rtc/rtc-ds3232.c
....@@ -1,14 +1,10 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * RTC client/driver for the Maxim/Dallas DS3232/DS3234 Real-Time Clock
34 *
45 * Copyright (C) 2009-2011 Freescale Semiconductor.
56 * Author: Jack Lan <jack.lan@freescale.com>
67 * Copyright (C) 2008 MIMOMax Wireless Ltd.
7
- *
8
- * This program is free software; you can redistribute it and/or modify it
9
- * under the terms of the GNU General Public License as published by the
10
- * Free Software Foundation; either version 2 of the License, or (at your
11
- * option) any later version.
128 */
139
1410 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
....@@ -48,6 +44,10 @@
4844 # define DS3232_REG_SR_A1F 0x01
4945
5046 #define DS3232_REG_TEMPERATURE 0x11
47
+#define DS3232_REG_SRAM_START 0x14
48
+#define DS3232_REG_SRAM_END 0xFF
49
+
50
+#define DS3232_REG_SRAM_SIZE 236
5151
5252 struct ds3232 {
5353 struct device *dev;
....@@ -461,11 +461,39 @@
461461 .alarm_irq_enable = ds3232_alarm_irq_enable,
462462 };
463463
464
+static int ds3232_nvmem_read(void *priv, unsigned int offset, void *val,
465
+ size_t bytes)
466
+{
467
+ struct regmap *ds3232_regmap = (struct regmap *)priv;
468
+
469
+ return regmap_bulk_read(ds3232_regmap, DS3232_REG_SRAM_START + offset,
470
+ val, bytes);
471
+}
472
+
473
+static int ds3232_nvmem_write(void *priv, unsigned int offset, void *val,
474
+ size_t bytes)
475
+{
476
+ struct regmap *ds3232_regmap = (struct regmap *)priv;
477
+
478
+ return regmap_bulk_write(ds3232_regmap, DS3232_REG_SRAM_START + offset,
479
+ val, bytes);
480
+}
481
+
464482 static int ds3232_probe(struct device *dev, struct regmap *regmap, int irq,
465483 const char *name)
466484 {
467485 struct ds3232 *ds3232;
468486 int ret;
487
+ struct nvmem_config nvmem_cfg = {
488
+ .name = "ds3232_sram",
489
+ .stride = 1,
490
+ .size = DS3232_REG_SRAM_SIZE,
491
+ .word_size = 1,
492
+ .reg_read = ds3232_nvmem_read,
493
+ .reg_write = ds3232_nvmem_write,
494
+ .priv = regmap,
495
+ .type = NVMEM_TYPE_BATTERY_BACKED
496
+ };
469497
470498 ds3232 = devm_kzalloc(dev, sizeof(*ds3232), GFP_KERNEL);
471499 if (!ds3232)
....@@ -489,6 +517,10 @@
489517 THIS_MODULE);
490518 if (IS_ERR(ds3232->rtc))
491519 return PTR_ERR(ds3232->rtc);
520
+
521
+ ret = rtc_nvmem_register(ds3232->rtc, &nvmem_cfg);
522
+ if(ret)
523
+ return ret;
492524
493525 if (ds3232->irq > 0) {
494526 ret = devm_request_threaded_irq(dev, ds3232->irq, NULL,
....@@ -542,7 +574,7 @@
542574 static const struct regmap_config config = {
543575 .reg_bits = 8,
544576 .val_bits = 8,
545
- .max_register = 0x13,
577
+ .max_register = DS3232_REG_SRAM_END,
546578 };
547579
548580 regmap = devm_regmap_init_i2c(client, &config);
....@@ -609,7 +641,7 @@
609641 static const struct regmap_config config = {
610642 .reg_bits = 8,
611643 .val_bits = 8,
612
- .max_register = 0x13,
644
+ .max_register = DS3232_REG_SRAM_END,
613645 .write_flag_mask = 0x80,
614646 };
615647 struct regmap *regmap;