Enables 'memory-region' property referring to the memory description on
the reserved-memory node in case of devicetree use.
If there is no 'reg' property that specifies the address and size of
the framebuffer, the address and size written in the memory description
on the reserved-memory node can be used for the framebuffer.
Furthermore, the reserved-memory node needs to have "no-map" attributes
because simplefb driver maps the region by ioremap_wc().
Signed-off-by: Kunihiko Hayashi <hayashi.kunihiko@xxxxxxxxxxxxx>
---
.../bindings/display/simple-framebuffer.txt | 3 ++
drivers/video/fbdev/simplefb.c | 32 ++++++++++++++++++++++
2 files changed, 35 insertions(+)
diff --git a/Documentation/devicetree/bindings/display/simple-framebuffer.txt b/Documentation/devicetree/bindings/display/simple-framebuffer.txt
index 5a9ce51..be5139f 100644
--- a/Documentation/devicetree/bindings/display/simple-framebuffer.txt
+++ b/Documentation/devicetree/bindings/display/simple-framebuffer.txt
@@ -56,6 +56,9 @@ Optional properties:
framebuffer remains active.
- display : phandle pointing to the primary display hardware node
+- memory-region: phandle to a node describing memory region as framebuffer
+ memory instead of reg property. The node should include
+ 'no-map'.
Example:
diff --git a/drivers/video/fbdev/simplefb.c b/drivers/video/fbdev/simplefb.c
index a3c44ec..aefc4b1 100644
--- a/drivers/video/fbdev/simplefb.c
+++ b/drivers/video/fbdev/simplefb.c
@@ -29,6 +29,7 @@
#include <linux/clk.h>
#include <linux/clk-provider.h>
#include <linux/of.h>
+#include <linux/of_address.h>
#include <linux/of_platform.h>
#include <linux/parser.h>
#include <linux/regulator/consumer.h>
@@ -294,6 +295,35 @@ static void simplefb_clocks_enable(struct simplefb_par *par,
static void simplefb_clocks_destroy(struct simplefb_par *par) { }
#endif
+#if defined CONFIG_OF
+static struct resource *simplefb_parse_dt_reserved_mem(struct device *dev)
+{
+ static struct resource res;
+ struct device_node *np;
+ int ret;
+
+ np = of_parse_phandle(dev->of_node, "memory-region", 0);
+ if (!np)
+ return NULL;
+
+ ret = of_address_to_resource(np, 0, &res);
+ if (ret < 0)
+ return NULL;
+
+ if (!of_find_property(np, "no-map", NULL)) {
+ dev_err(dev, "Can't apply mapped reserved-memory\n");
+ return NULL;
+ }
+
+ return &res;
+}
+#else
+static struct resource *simplefb_parse_dt_reserved_mem(struct device *dev)
+{
+ return NULL;
+}
+#endif
+
#if defined CONFIG_OF && defined CONFIG_REGULATOR
#define SUPPLY_SUFFIX "-supply"
@@ -428,6 +458,8 @@ static int simplefb_probe(struct platform_device *pdev)
return ret;
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!mem)
+ mem = simplefb_parse_dt_reserved_mem(&pdev->dev);
if (!mem) {
dev_err(&pdev->dev, "No memory resource\n");
return -EINVAL;