Message ID | 20231011143809.1108034-2-thierry.reding@gmail.com |
---|---|
State | Superseded |
Headers | show |
Series | fbdev/simplefb: Add missing simple-framebuffer features | expand |
Hi, On 10/11/23 16:38, Thierry Reding wrote: > From: Thierry Reding <treding@nvidia.com> > > The simple-framebuffer bindings specify that the "memory-region" > property can be used as an alternative to the "reg" property to define > the framebuffer memory used by the display hardware. Implement support > for this in the simplefb driver. > > Signed-off-by: Thierry Reding <treding@nvidia.com> Thanks, patch looks good to me: Reviewed-by: Hans de Goede <hdegoede@redhat.com> Regards, Hans > --- > drivers/video/fbdev/simplefb.c | 35 +++++++++++++++++++++++++++++----- > 1 file changed, 30 insertions(+), 5 deletions(-) > > diff --git a/drivers/video/fbdev/simplefb.c b/drivers/video/fbdev/simplefb.c > index 62f99f6fccd3..18025f34fde7 100644 > --- a/drivers/video/fbdev/simplefb.c > +++ b/drivers/video/fbdev/simplefb.c > @@ -21,6 +21,7 @@ > #include <linux/platform_device.h> > #include <linux/clk.h> > #include <linux/of.h> > +#include <linux/of_address.h> > #include <linux/of_clk.h> > #include <linux/of_platform.h> > #include <linux/parser.h> > @@ -121,12 +122,13 @@ struct simplefb_params { > u32 height; > u32 stride; > struct simplefb_format *format; > + struct resource memory; > }; > > static int simplefb_parse_dt(struct platform_device *pdev, > struct simplefb_params *params) > { > - struct device_node *np = pdev->dev.of_node; > + struct device_node *np = pdev->dev.of_node, *mem; > int ret; > const char *format; > int i; > @@ -166,6 +168,23 @@ static int simplefb_parse_dt(struct platform_device *pdev, > return -EINVAL; > } > > + mem = of_parse_phandle(np, "memory-region", 0); > + if (mem) { > + ret = of_address_to_resource(mem, 0, ¶ms->memory); > + if (ret < 0) { > + dev_err(&pdev->dev, "failed to parse memory-region\n"); > + of_node_put(mem); > + return ret; > + } > + > + if (of_property_present(np, "reg")) > + dev_warn(&pdev->dev, "preferring \"memory-region\" over \"reg\" property\n"); > + > + of_node_put(mem); > + } else { > + memset(¶ms->memory, 0, sizeof(params->memory)); > + } > + > return 0; > } > > @@ -193,6 +212,8 @@ static int simplefb_parse_pd(struct platform_device *pdev, > return -EINVAL; > } > > + memset(¶ms->memory, 0, sizeof(params->memory)); > + > return 0; > } > > @@ -431,10 +452,14 @@ static int simplefb_probe(struct platform_device *pdev) > if (ret) > return ret; > > - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > - if (!res) { > - dev_err(&pdev->dev, "No memory resource\n"); > - return -EINVAL; > + if (params.memory.start == 0 && params.memory.end == 0) { > + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > + if (!res) { > + dev_err(&pdev->dev, "No memory resource\n"); > + return -EINVAL; > + } > + } else { > + res = ¶ms.memory; > } > > mem = request_mem_region(res->start, resource_size(res), "simplefb");
diff --git a/drivers/video/fbdev/simplefb.c b/drivers/video/fbdev/simplefb.c index 62f99f6fccd3..18025f34fde7 100644 --- a/drivers/video/fbdev/simplefb.c +++ b/drivers/video/fbdev/simplefb.c @@ -21,6 +21,7 @@ #include <linux/platform_device.h> #include <linux/clk.h> #include <linux/of.h> +#include <linux/of_address.h> #include <linux/of_clk.h> #include <linux/of_platform.h> #include <linux/parser.h> @@ -121,12 +122,13 @@ struct simplefb_params { u32 height; u32 stride; struct simplefb_format *format; + struct resource memory; }; static int simplefb_parse_dt(struct platform_device *pdev, struct simplefb_params *params) { - struct device_node *np = pdev->dev.of_node; + struct device_node *np = pdev->dev.of_node, *mem; int ret; const char *format; int i; @@ -166,6 +168,23 @@ static int simplefb_parse_dt(struct platform_device *pdev, return -EINVAL; } + mem = of_parse_phandle(np, "memory-region", 0); + if (mem) { + ret = of_address_to_resource(mem, 0, ¶ms->memory); + if (ret < 0) { + dev_err(&pdev->dev, "failed to parse memory-region\n"); + of_node_put(mem); + return ret; + } + + if (of_property_present(np, "reg")) + dev_warn(&pdev->dev, "preferring \"memory-region\" over \"reg\" property\n"); + + of_node_put(mem); + } else { + memset(¶ms->memory, 0, sizeof(params->memory)); + } + return 0; } @@ -193,6 +212,8 @@ static int simplefb_parse_pd(struct platform_device *pdev, return -EINVAL; } + memset(¶ms->memory, 0, sizeof(params->memory)); + return 0; } @@ -431,10 +452,14 @@ static int simplefb_probe(struct platform_device *pdev) if (ret) return ret; - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) { - dev_err(&pdev->dev, "No memory resource\n"); - return -EINVAL; + if (params.memory.start == 0 && params.memory.end == 0) { + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) { + dev_err(&pdev->dev, "No memory resource\n"); + return -EINVAL; + } + } else { + res = ¶ms.memory; } mem = request_mem_region(res->start, resource_size(res), "simplefb");