48
48
# define DS3232_REG_SR_A1F 0x01
49
49
50
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
56
struct ds3232 {
53
57
struct device * dev ;
@@ -461,11 +465,39 @@ static const struct rtc_class_ops ds3232_rtc_ops = {
461
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
486
static int ds3232_probe (struct device * dev , struct regmap * regmap , int irq ,
465
487
const char * name )
466
488
{
467
489
struct ds3232 * ds3232 ;
468
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
502
ds3232 = devm_kzalloc (dev , sizeof (* ds3232 ), GFP_KERNEL );
471
503
if (!ds3232 )
@@ -490,6 +522,10 @@ static int ds3232_probe(struct device *dev, struct regmap *regmap, int irq,
490
522
if (IS_ERR (ds3232 -> rtc ))
491
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
529
if (ds3232 -> irq > 0 ) {
494
530
ret = devm_request_threaded_irq (dev , ds3232 -> irq , NULL ,
495
531
ds3232_irq ,
@@ -542,7 +578,7 @@ static int ds3232_i2c_probe(struct i2c_client *client,
542
578
static const struct regmap_config config = {
543
579
.reg_bits = 8 ,
544
580
.val_bits = 8 ,
545
- .max_register = 0x13 ,
581
+ .max_register = DS3232_REG_SRAM_END ,
546
582
};
547
583
548
584
regmap = devm_regmap_init_i2c (client , & config );
@@ -609,7 +645,7 @@ static int ds3234_probe(struct spi_device *spi)
609
645
static const struct regmap_config config = {
610
646
.reg_bits = 8 ,
611
647
.val_bits = 8 ,
612
- .max_register = 0x13 ,
648
+ .max_register = DS3232_REG_SRAM_END ,
613
649
.write_flag_mask = 0x80 ,
614
650
};
615
651
struct regmap * regmap ;
0 commit comments