diff options
Diffstat (limited to 'drivers/rtc/rtc-ds3232.c')
-rw-r--r-- | drivers/rtc/rtc-ds3232.c | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/drivers/rtc/rtc-ds3232.c b/drivers/rtc/rtc-ds3232.c index 7184e5145f12..1e9312f96021 100644 --- a/drivers/rtc/rtc-ds3232.c +++ b/drivers/rtc/rtc-ds3232.c | |||
@@ -48,6 +48,10 @@ | |||
48 | # define DS3232_REG_SR_A1F 0x01 | 48 | # define DS3232_REG_SR_A1F 0x01 |
49 | 49 | ||
50 | #define DS3232_REG_TEMPERATURE 0x11 | 50 | #define DS3232_REG_TEMPERATURE 0x11 |
51 | #define DS3232_REG_SRAM_START 0x14 | ||
52 | #define DS3232_REG_SRAM_END 0xFF | ||
53 | |||
54 | #define DS3232_REG_SRAM_SIZE 236 | ||
51 | 55 | ||
52 | struct ds3232 { | 56 | struct ds3232 { |
53 | struct device *dev; | 57 | struct device *dev; |
@@ -461,11 +465,39 @@ static const struct rtc_class_ops ds3232_rtc_ops = { | |||
461 | .alarm_irq_enable = ds3232_alarm_irq_enable, | 465 | .alarm_irq_enable = ds3232_alarm_irq_enable, |
462 | }; | 466 | }; |
463 | 467 | ||
468 | static int ds3232_nvmem_read(void *priv, unsigned int offset, void *val, | ||
469 | size_t bytes) | ||
470 | { | ||
471 | struct regmap *ds3232_regmap = (struct regmap *)priv; | ||
472 | |||
473 | return regmap_bulk_read(ds3232_regmap, DS3232_REG_SRAM_START + offset, | ||
474 | val, bytes); | ||
475 | } | ||
476 | |||
477 | static int ds3232_nvmem_write(void *priv, unsigned int offset, void *val, | ||
478 | size_t bytes) | ||
479 | { | ||
480 | struct regmap *ds3232_regmap = (struct regmap *)priv; | ||
481 | |||
482 | return regmap_bulk_write(ds3232_regmap, DS3232_REG_SRAM_START + offset, | ||
483 | val, bytes); | ||
484 | } | ||
485 | |||
464 | static int ds3232_probe(struct device *dev, struct regmap *regmap, int irq, | 486 | static int ds3232_probe(struct device *dev, struct regmap *regmap, int irq, |
465 | const char *name) | 487 | const char *name) |
466 | { | 488 | { |
467 | struct ds3232 *ds3232; | 489 | struct ds3232 *ds3232; |
468 | int ret; | 490 | int ret; |
491 | struct nvmem_config nvmem_cfg = { | ||
492 | .name = "ds3232_sram", | ||
493 | .stride = 1, | ||
494 | .size = DS3232_REG_SRAM_SIZE, | ||
495 | .word_size = 1, | ||
496 | .reg_read = ds3232_nvmem_read, | ||
497 | .reg_write = ds3232_nvmem_write, | ||
498 | .priv = regmap, | ||
499 | .type = NVMEM_TYPE_BATTERY_BACKED | ||
500 | }; | ||
469 | 501 | ||
470 | ds3232 = devm_kzalloc(dev, sizeof(*ds3232), GFP_KERNEL); | 502 | ds3232 = devm_kzalloc(dev, sizeof(*ds3232), GFP_KERNEL); |
471 | if (!ds3232) | 503 | if (!ds3232) |
@@ -490,6 +522,10 @@ static int ds3232_probe(struct device *dev, struct regmap *regmap, int irq, | |||
490 | if (IS_ERR(ds3232->rtc)) | 522 | if (IS_ERR(ds3232->rtc)) |
491 | return PTR_ERR(ds3232->rtc); | 523 | return PTR_ERR(ds3232->rtc); |
492 | 524 | ||
525 | ret = rtc_nvmem_register(ds3232->rtc, &nvmem_cfg); | ||
526 | if(ret) | ||
527 | return ret; | ||
528 | |||
493 | if (ds3232->irq > 0) { | 529 | if (ds3232->irq > 0) { |
494 | ret = devm_request_threaded_irq(dev, ds3232->irq, NULL, | 530 | ret = devm_request_threaded_irq(dev, ds3232->irq, NULL, |
495 | ds3232_irq, | 531 | ds3232_irq, |
@@ -542,7 +578,7 @@ static int ds3232_i2c_probe(struct i2c_client *client, | |||
542 | static const struct regmap_config config = { | 578 | static const struct regmap_config config = { |
543 | .reg_bits = 8, | 579 | .reg_bits = 8, |
544 | .val_bits = 8, | 580 | .val_bits = 8, |
545 | .max_register = 0x13, | 581 | .max_register = DS3232_REG_SRAM_END, |
546 | }; | 582 | }; |
547 | 583 | ||
548 | regmap = devm_regmap_init_i2c(client, &config); | 584 | regmap = devm_regmap_init_i2c(client, &config); |
@@ -609,7 +645,7 @@ static int ds3234_probe(struct spi_device *spi) | |||
609 | static const struct regmap_config config = { | 645 | static const struct regmap_config config = { |
610 | .reg_bits = 8, | 646 | .reg_bits = 8, |
611 | .val_bits = 8, | 647 | .val_bits = 8, |
612 | .max_register = 0x13, | 648 | .max_register = DS3232_REG_SRAM_END, |
613 | .write_flag_mask = 0x80, | 649 | .write_flag_mask = 0x80, |
614 | }; | 650 | }; |
615 | struct regmap *regmap; | 651 | struct regmap *regmap; |