@@ -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 <base size>, <base size>, ...; 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>;
};
@@ -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);