4848# define DS3232_REG_SR_A1F 0x01
4949
5050#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
5155
5256struct ds3232 {
5357 struct device * dev ;
@@ -461,11 +465,39 @@ static const struct rtc_class_ops ds3232_rtc_ops = {
461465 .alarm_irq_enable = ds3232_alarm_irq_enable ,
462466};
463467
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+
464486static int ds3232_probe (struct device * dev , struct regmap * regmap , int irq ,
465487 const char * name )
466488{
467489 struct ds3232 * ds3232 ;
468490 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+ };
469501
470502 ds3232 = devm_kzalloc (dev , sizeof (* ds3232 ), GFP_KERNEL );
471503 if (!ds3232 )
@@ -490,6 +522,10 @@ static int ds3232_probe(struct device *dev, struct regmap *regmap, int irq,
490522 if (IS_ERR (ds3232 -> rtc ))
491523 return PTR_ERR (ds3232 -> rtc );
492524
525+ ret = rtc_nvmem_register (ds3232 -> rtc , & nvmem_cfg );
526+ if (ret )
527+ return ret ;
528+
493529 if (ds3232 -> irq > 0 ) {
494530 ret = devm_request_threaded_irq (dev , ds3232 -> irq , NULL ,
495531 ds3232_irq ,
@@ -542,7 +578,7 @@ static int ds3232_i2c_probe(struct i2c_client *client,
542578 static const struct regmap_config config = {
543579 .reg_bits = 8 ,
544580 .val_bits = 8 ,
545- .max_register = 0x13 ,
581+ .max_register = DS3232_REG_SRAM_END ,
546582 };
547583
548584 regmap = devm_regmap_init_i2c (client , & config );
@@ -609,7 +645,7 @@ static int ds3234_probe(struct spi_device *spi)
609645 static const struct regmap_config config = {
610646 .reg_bits = 8 ,
611647 .val_bits = 8 ,
612- .max_register = 0x13 ,
648+ .max_register = DS3232_REG_SRAM_END ,
613649 .write_flag_mask = 0x80 ,
614650 };
615651 struct regmap * regmap ;
0 commit comments