From patchwork Tue Oct 22 14:01:02 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heiko Stuebner X-Patchwork-Id: 3082871 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 003DBBF924 for ; Tue, 22 Oct 2013 14:01:39 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id A581120343 for ; Tue, 22 Oct 2013 14:01:37 +0000 (UTC) Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 9021E2033F for ; Tue, 22 Oct 2013 14:01:31 +0000 (UTC) Received: from merlin.infradead.org ([2001:4978:20e::2]) by casper.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1VYcWU-0007dD-OV; Tue, 22 Oct 2013 14:01:26 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1VYcWS-0003m6-B6; Tue, 22 Oct 2013 14:01:24 +0000 Received: from gloria.sntech.de ([95.129.55.99]) by merlin.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1VYcWO-0003lK-TP for linux-arm-kernel@lists.infradead.org; Tue, 22 Oct 2013 14:01:22 +0000 Received: from ip-77-221-165-98.dsl.twang.net ([77.221.165.98] helo=phil.localnet) by gloria.sntech.de with esmtpsa (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.80) (envelope-from ) id 1VYcW1-0008JA-0B; Tue, 22 Oct 2013 16:00:57 +0200 From: Heiko =?utf-8?q?St=C3=BCbner?= To: Arnd Bergmann Subject: [PATCH v5 1/5] misc: sram: add ability to limit used sram areas Date: Tue, 22 Oct 2013 16:01:02 +0200 User-Agent: KMail/1.13.7 (Linux/3.2.0-2-amd64; KDE/4.8.4; x86_64; ; ) References: <201310221600.13562.heiko@sntech.de> In-Reply-To: <201310221600.13562.heiko@sntech.de> MIME-Version: 1.0 Message-Id: <201310221601.02661.heiko@sntech.de> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20131022_100121_137149_C34AEEC1 X-CRM114-Status: GOOD ( 17.87 ) X-Spam-Score: -2.3 (--) Cc: Russell King , Matt Sealey , Greg Kroah-Hartman , devicetree-discuss@lists.ozlabs.org, linux-kernel@vger.kernel.org, Grant Likely , Ulrich Prinz , Philipp Zabel , Olof Johansson , Fabio Estevam , "linux-arm-kernel@lists.infradead.org" X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-4.6 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Some SoCs need parts of their sram for special purposes. So while being part of the peripheral, it should not be part of the genpool controlling the sram. Therefore add an option available to keep arbitrary portions of the sram from being part of the pool. If available is not present, all sram is used. Suggested-by: Rob Herring move from marking reserved space to available space Suggested-by: Matt Sealey Signed-off-by: Heiko Stuebner Tested-by: Ulrich Prinz --- Documentation/devicetree/bindings/misc/sram.txt | 8 ++++ drivers/misc/sram.c | 51 ++++++++++++++++++++--- 2 files changed, 53 insertions(+), 6 deletions(-) diff --git a/Documentation/devicetree/bindings/misc/sram.txt b/Documentation/devicetree/bindings/misc/sram.txt index 4d0a00e..8be552f 100644 --- a/Documentation/devicetree/bindings/misc/sram.txt +++ b/Documentation/devicetree/bindings/misc/sram.txt @@ -8,9 +8,17 @@ Required properties: - reg : SRAM iomem address range +Optional properties: + +- available: optional list of available chunks inside the sram that the + OS can use. Without available, the whole range is usable for the OS. + Format is , , ...; with base being relative to the + reg property base. + Example: sram: sram@5c000000 { compatible = "mmio-sram"; reg = <0x5c000000 0x40000>; /* 256 KiB SRAM at address 0x5c000000 */ + available = <0x100 0x3ff00>; }; diff --git a/drivers/misc/sram.c b/drivers/misc/sram.c index afe66571..755e640 100644 --- a/drivers/misc/sram.c +++ b/drivers/misc/sram.c @@ -42,6 +42,8 @@ static int sram_probe(struct platform_device *pdev) struct sram_dev *sram; struct resource *res; unsigned long size; + const __be32 *avail_list = NULL; + int avail_size = 0; int ret; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); @@ -65,12 +67,49 @@ static int sram_probe(struct platform_device *pdev) if (!sram->pool) return -ENOMEM; - ret = gen_pool_add_virt(sram->pool, (unsigned long)virt_base, - res->start, size, -1); - if (ret < 0) { - if (sram->clk) - clk_disable_unprepare(sram->clk); - return ret; + if (pdev->dev.of_node) { + avail_list = of_get_property(pdev->dev.of_node, + "available", + &avail_size); + if (avail_list) { + avail_size /= sizeof(*avail_list); + if (!avail_size || avail_size % 2) { + dev_warn(&pdev->dev, "wrong number of arguments in available property\n"); + avail_list = NULL; + } + } + } + + if (!avail_list) { + ret = gen_pool_add_virt(sram->pool, (unsigned long)virt_base, + res->start, size, -1); + if (ret < 0) { + if (sram->clk) + clk_disable_unprepare(sram->clk); + return ret; + } + } else { + unsigned int astart; + unsigned int asize; + int i; + + for (i = 0; i < avail_size; i += 2) { + /* get the next available block */ + astart = be32_to_cpu(*avail_list++); + asize = be32_to_cpu(*avail_list++); + + dev_dbg(&pdev->dev, "found available block 0x%x-0x%x\n", + astart, astart + asize); + + ret = gen_pool_add_virt(sram->pool, + (unsigned long)virt_base + astart, + res->start + astart, asize, -1); + if (ret < 0) { + if (sram->clk) + clk_disable_unprepare(sram->clk); + return ret; + } + } } platform_set_drvdata(pdev, sram);