Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp670493yba; Fri, 5 Apr 2019 14:46:00 -0700 (PDT) X-Google-Smtp-Source: APXvYqzGz6WyDDDvQ7NF/8LMrfuyiJsf/GxB+5LzAyUDI73GwOSI2SKaF01BQzHfe+OmREwA6UVg X-Received: by 2002:a62:2c91:: with SMTP id s139mr15044452pfs.196.1554500760275; Fri, 05 Apr 2019 14:46:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1554500760; cv=none; d=google.com; s=arc-20160816; b=K/0sdY+VqP35PWY7V4qlHjR+vko+Eu+QR/Ci+1h/IyOLwG9zoQctRHOm6/S+XSHTKv C5NXFynRz9cg1EvWnIjCk/c3TDc+9XQr+QdzmJA55SlLgKaNrb6q3d647NgQdN/oMv7a wNRtdaspYy96VxNeFwuWj7JSRt77zDZZDed2Wu3lf0+bkaVZJk8IDDyPSAcvucIpzwhu OHGJqLbNGu1hNZlSbqf704YusarsaKIN6V/9OHLsCJ+SSXdZ+BYAOXHDz2joDmEVw2Ee 3c5tQobxogHu1dRkhnbBwysqQ2KikjC9tsmGI6ppFKpHOYW6A2XSUGnx5qp5mNI3DrnB VEIg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date; bh=Pxh1erWyRyqVTnA8dUUju2hLn5tZALjADIaq0mBP9CA=; b=oeq1E6NeY+bnLQ9bZR+oPr+sHhQhhmx3OaE+oOz+XuYNqV+XvyNr+rrobf3evclnOe CqKJfEbtt6O+4D7TCYkOi28xhTlF3DVlxYJcl+MpKsTuY46zgYtKZKULSWfh6Fz3TK0K jraG2wEv/H/h8tC8m3lOGKS42dUMzqbi0qL4FNRhwmD1QhwPGJZoK1YXnmXZvA/22EEZ zXC/Di/E5w4V4eN8C67NkYbqcbqhx/rCKe2FvTNTJ4+hKchv/rPiY18BcK6O7yDdqLRh +J1u2NVZ6Qcvo6b2/C1zH5dN5JzoBrdotlFWllbW/EaWH38Q5g2nCiaZpTGTh/Q4epTD J3CA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u70si9477657pgu.119.2019.04.05.14.45.45; Fri, 05 Apr 2019 14:46:00 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726602AbfDEVpC (ORCPT + 99 others); Fri, 5 Apr 2019 17:45:02 -0400 Received: from relay4-d.mail.gandi.net ([217.70.183.196]:34379 "EHLO relay4-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726535AbfDEVo6 (ORCPT ); Fri, 5 Apr 2019 17:44:58 -0400 X-Originating-IP: 86.202.231.219 Received: from localhost (lfbn-lyo-1-149-219.w86-202.abo.wanadoo.fr [86.202.231.219]) (Authenticated sender: alexandre.belloni@bootlin.com) by relay4-d.mail.gandi.net (Postfix) with ESMTPSA id F1A07E0003; Fri, 5 Apr 2019 21:44:54 +0000 (UTC) Date: Fri, 5 Apr 2019 23:44:54 +0200 From: Alexandre Belloni To: Han Nandor Cc: "a.zummo@towertech.it" , "linux-rtc@vger.kernel.org" , "linux-kernel@vger.kernel.org" Subject: Re: [PATCH 1/1] rtc: ds3232: get SRAM access using NVMEM Framework Message-ID: <20190405214454.GJ22216@piout.net> References: <20190405111348.28935-1-nandor.han@vaisala.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20190405111348.28935-1-nandor.han@vaisala.com> User-Agent: Mutt/1.11.3 (2019-02-01) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, On 05/04/2019 11:14:35+0000, Han Nandor wrote: > DS3232 RTC has 236 bytes of persistent memory. > > Add RTC SRAM read and write access using > the NVMEM Framework. > > Signed-off-by: Nandor Han > --- > > Description > ----------- > Provides DS3232 RTC SRAM access using NVMEM framework. > > Testing > ------- > The test was done on a custom board which contains a > DS3232 RTC device. > Kernel Version: 4.14.60 (Just for clarity, the patch is against master) > > 1. Verify that SRAM is accessible using NVMEM interface: PASS > ` > # hexdump /sys/bus/nvmem/devices/ds3232_sram0/nvmem > 0000000 0000 0000 0000 0000 0000 0000 0000 0000 > * > 00000e0 > ` > 2. Modify the content. > ` > # echo testing > /sys/bus/nvmem/devices/ds3232_sram0/nvmem > # > ` > 3. Power cycle the board and verify that contents are preserved: PASS > ` > # hexdump -n 10 -C /sys/bus/nvmem/devices/ds3232_sram0/nvmem > 00000000 74 65 73 74 69 6e 67 0a 00 00 |testing...| > 0000000a > ` > Thanks for that nice description! > drivers/rtc/rtc-ds3232.c | 41 ++++++++++++++++++++++++++++++++++++++-- > 1 file changed, 39 insertions(+), 2 deletions(-) > > diff --git a/drivers/rtc/rtc-ds3232.c b/drivers/rtc/rtc-ds3232.c > index 7184e5145f12..fe615aedaa9a 100644 > --- a/drivers/rtc/rtc-ds3232.c > +++ b/drivers/rtc/rtc-ds3232.c > @@ -24,6 +24,8 @@ > #include > #include > > +#include "rtc-core.h" > + The drivers should not have to include that header, see fd5cd21d995e67f87b3eb4adf938be85fe83ef4b (from 4.16). > #define DS3232_REG_SECONDS 0x00 > #define DS3232_REG_MINUTES 0x01 > #define DS3232_REG_HOURS 0x02 > @@ -48,12 +50,17 @@ > # define DS3232_REG_SR_A1F 0x01 > > #define DS3232_REG_TEMPERATURE 0x11 > +#define DS3232_REG_SRAM_START 0x14 > +#define DS3232_REG_SRAM_END 0xFF > + > +#define DS3232_REG_SRAM_SIZE 236 > > struct ds3232 { > struct device *dev; > struct regmap *regmap; > int irq; > struct rtc_device *rtc; > + struct nvmem_config nvmem_cfg; > You don't actually need to keep that structure for the whole life of the device as it is copied as soon as it is registered. I usually prefer to have it on the stack. > bool suspended; > }; > @@ -461,6 +468,24 @@ static const struct rtc_class_ops ds3232_rtc_ops = { > .alarm_irq_enable = ds3232_alarm_irq_enable, > }; > > +static int ds3232_nvmem_read(void *priv, unsigned int offset, void *val, > + size_t bytes) > +{ > + struct ds3232 *ds3232 = (struct ds3232 *)priv; > + > + return regmap_bulk_read(ds3232->regmap, DS3232_REG_SRAM_START + offset, > + val, bytes); > +} > + > +static int ds3232_nvmem_write(void *priv, unsigned int offset, void *val, > + size_t bytes) > +{ > + struct ds3232 *ds3232 = (struct ds3232 *)priv; > + > + return regmap_bulk_write(ds3232->regmap, DS3232_REG_SRAM_START + offset, > + val, bytes); > +} > + > static int ds3232_probe(struct device *dev, struct regmap *regmap, int irq, > const char *name) > { > @@ -476,6 +501,14 @@ static int ds3232_probe(struct device *dev, struct regmap *regmap, int irq, > ds3232->dev = dev; > dev_set_drvdata(dev, ds3232); > > + ds3232->nvmem_cfg.name = "ds3232_sram"; > + ds3232->nvmem_cfg.stride = 1; > + ds3232->nvmem_cfg.size = DS3232_REG_SRAM_SIZE; > + ds3232->nvmem_cfg.word_size = 1; > + ds3232->nvmem_cfg.reg_read = ds3232_nvmem_read; > + ds3232->nvmem_cfg.reg_write = ds3232_nvmem_write; > + ds3232->nvmem_cfg.priv = ds3232; Please also set the type (battery backed). > + > ret = ds3232_check_rtc_status(dev); > if (ret) > return ret; > @@ -490,6 +523,10 @@ static int ds3232_probe(struct device *dev, struct regmap *regmap, int irq, > if (IS_ERR(ds3232->rtc)) > return PTR_ERR(ds3232->rtc); > > + ds3232->rtc->dev.of_node = dev->of_node; Please don't mess with rtc->dev. > + ds3232->rtc->nvmem_config = &ds3232->nvmem_cfg; > + rtc_nvmem_register(ds3232->rtc); This part will not compile on v5.1-rc1. > + > if (ds3232->irq > 0) { > ret = devm_request_threaded_irq(dev, ds3232->irq, NULL, > ds3232_irq, > @@ -542,7 +579,7 @@ static int ds3232_i2c_probe(struct i2c_client *client, > static const struct regmap_config config = { > .reg_bits = 8, > .val_bits = 8, > - .max_register = 0x13, > + .max_register = DS3232_REG_SRAM_END, > }; > > regmap = devm_regmap_init_i2c(client, &config); > @@ -609,7 +646,7 @@ static int ds3234_probe(struct spi_device *spi) > static const struct regmap_config config = { > .reg_bits = 8, > .val_bits = 8, > - .max_register = 0x13, > + .max_register = DS3232_REG_SRAM_END, > .write_flag_mask = 0x80, > }; > struct regmap *regmap; > -- > 2.17.2 > -- Alexandre Belloni, Bootlin Embedded Linux and Kernel engineering https://bootlin.com