From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1161050AbcHaQpm (ORCPT ); Wed, 31 Aug 2016 12:45:42 -0400 Received: from metis.ext.4.pengutronix.de ([92.198.50.35]:34050 "EHLO metis.ext.4.pengutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S935621AbcHaQpl (ORCPT ); Wed, 31 Aug 2016 12:45:41 -0400 Message-ID: <1472661937.9330.8.camel@pengutronix.de> Subject: Re: [PATCH 5/5] misc: sram: add Atmel securam support From: Philipp Zabel To: Alexandre Belloni Cc: Nicolas Ferre , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Boris Brezillon , Arnd Bergmann , Greg Kroah-Hartman , Vladimir Zapolskiy Date: Wed, 31 Aug 2016 18:45:37 +0200 In-Reply-To: <20160831161108.8780-6-alexandre.belloni@free-electrons.com> References: <20160831161108.8780-1-alexandre.belloni@free-electrons.com> <20160831161108.8780-6-alexandre.belloni@free-electrons.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.12.9-1+b1 Mime-Version: 1.0 Content-Transfer-Encoding: 7bit X-SA-Exim-Connect-IP: 2001:67c:670:100:96de:80ff:fec2:9969 X-SA-Exim-Mail-From: p.zabel@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Alexandre, Am Mittwoch, den 31.08.2016, 18:11 +0200 schrieb Alexandre Belloni: > The Atmel secure SRAM is connected to a security module and may be erased > automatically under certain conditions. For that reason, it is necessary to > wait for the security module to flag that SRAM accesses are allowed before > accessing it. > > Signed-off-by: Alexandre Belloni > --- > Cc: Arnd Bergmann > Cc: Greg Kroah-Hartman > Cc: Philipp Zabel > Cc: Vladimir Zapolskiy > drivers/misc/sram.c | 52 +++++++++++++++++++++++++++++++++++++++++++++------- > 1 file changed, 45 insertions(+), 7 deletions(-) > > diff --git a/drivers/misc/sram.c b/drivers/misc/sram.c > index f84b53d6ce50..8d411c64d07f 100644 > --- a/drivers/misc/sram.c > +++ b/drivers/misc/sram.c > @@ -19,12 +19,16 @@ > */ > > #include > +#include > #include > #include > #include > #include > #include > +#include > #include > +#include > +#include > > #define SRAM_GRANULARITY 32 > > @@ -334,12 +338,43 @@ static int sram_reserve_regions(struct sram_dev *sram, struct resource *res) > return ret; > } > > +static int atmel_securam_wait(void) > +{ > + struct regmap *regmap; > + unsigned long timeout = jiffies + HZ; Can this really take up to a second? > + u32 val; > + > + regmap = syscon_regmap_lookup_by_compatible("atmel,sama5d2-secumod"); > + if (IS_ERR(regmap)) > + return -ENODEV; > + > + regmap_read(regmap, AT91_SECUMOD_RAMRDY, &val); > + while (!(val & AT91_SECUMOD_RAMRDY_READY) && > + time_before(jiffies, timeout)) { > + mdelay(10); > + regmap_read(regmap, AT91_SECUMOD_RAMRDY, &val); > + } > + if (!time_before(jiffies, timeout)) > + return -ETIMEDOUT; > + > + return 0; Could you use regmap_read_poll_timeout here? > +} > + > +#ifdef CONFIG_OF > +static const struct of_device_id sram_dt_ids[] = { > + { .compatible = "mmio-sram" }, > + { .compatible = "atmel,sama5d2-securam", .data = atmel_securam_wait }, > + {} > +}; > +#endif > + > static int sram_probe(struct platform_device *pdev) > { > struct sram_dev *sram; > struct resource *res; > size_t size; > int ret; > + const struct of_device_id *match; > > sram = devm_kzalloc(&pdev->dev, sizeof(*sram), GFP_KERNEL); > if (!sram) > @@ -384,6 +419,16 @@ static int sram_probe(struct platform_device *pdev) > > platform_set_drvdata(pdev, sram); > > + match = of_match_node(sram_dt_ids, pdev->dev.of_node); > + if (match->data) { And of_device_get_match_data here? > + int (*init_func)(void); > + > + init_func = match->data; > + ret = init_func(); > + if (ret) > + return ret; > + } > + > dev_dbg(sram->dev, "SRAM pool: %zu KiB @ 0x%p\n", > gen_pool_size(sram->pool) / 1024, sram->virt_base); > > @@ -405,13 +450,6 @@ static int sram_remove(struct platform_device *pdev) > return 0; > } > > -#ifdef CONFIG_OF > -static const struct of_device_id sram_dt_ids[] = { > - { .compatible = "mmio-sram" }, > - {} > -}; > -#endif > - > static struct platform_driver sram_driver = { > .driver = { > .name = "sram", regards Philipp