(resend due to mailer issues. Apologies to anyone receiving this twice) This patch series reworks the Xilinx framebuffer driver and then adds an of_platform bus binding. The of_platform bus binding is needed to use the driver in arch/powerpc platforms. Antonino, Assuming there are no major issues, I'd like to get this patch series queued up for inclusion in 2.6.24. Thanks, g. -- Grant Likely, B.Sc. P.Eng. Secret Lab Technologies Ltd. -
From: Grant Likely <grant.likely@secretlab.ca> Debug support: when DEBUG is defined, output relevant details to the log about the framebuffer registration. Signed-off-by: Grant Likely <grant.likely@secretlab.ca> --- drivers/video/xilinxfb.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) diff --git a/drivers/video/xilinxfb.c b/drivers/video/xilinxfb.c index 4bc67ab..1a5f1e4 100644 --- a/drivers/video/xilinxfb.c +++ b/drivers/video/xilinxfb.c @@ -287,6 +287,11 @@ xilinxfb_drv_probe(struct device *dev) goto failed4; } + /* Put a banner in the log (for DEBUG) */ + dev_dbg(dev, "regs: phys=%x, virt=%p\n", + drvdata->regs_phys, drvdata->regs); + dev_dbg(dev, "fb: phys=%p, virt=%p, size=%x\n", + (void*)drvdata->fb_phys, drvdata->fb_virt, FB_SIZE); return 0; /* success */ failed4: -
From: Grant Likely <grant.likely@secretlab.ca>
The dev_dbg, dev_err, etc functions provide more context that plain
vanilla printk which is useful for debugging. Where appropriate,
change printk calls to the appropriate dev_*() call.
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
---
drivers/video/xilinxfb.c | 14 +++++++-------
1 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/drivers/video/xilinxfb.c b/drivers/video/xilinxfb.c
index 1a5f1e4..e63cbd1 100644
--- a/drivers/video/xilinxfb.c
+++ b/drivers/video/xilinxfb.c
@@ -18,6 +18,7 @@
* Geert Uytterhoeven.
*/
+#include <linux/device.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/version.h>
@@ -214,7 +215,7 @@ xilinxfb_drv_probe(struct device *dev)
drvdata = kzalloc(sizeof(*drvdata), GFP_KERNEL);
if (!drvdata) {
- printk(KERN_ERR "Couldn't allocate device private record\n");
+ dev_err(dev, "Couldn't allocate device private record\n");
return -ENOMEM;
}
dev_set_drvdata(dev, drvdata);
@@ -222,14 +223,13 @@ xilinxfb_drv_probe(struct device *dev)
/* Map the control registers in */
regs_res = platform_get_resource(pdev, IORESOURCE_IO, 0);
if (!regs_res || (regs_res->end - regs_res->start + 1 < 8)) {
- printk(KERN_ERR "Couldn't get registers resource\n");
+ dev_err(dev, "Couldn't get registers resource\n");
retval = -EFAULT;
goto failed1;
}
if (!request_mem_region(regs_res->start, 8, DRIVER_NAME)) {
- printk(KERN_ERR
- "Couldn't lock memory region at 0x%08X\n",
+ dev_err(dev, "Couldn't lock memory region at 0x%08X\n",
regs_res->start);
retval = -EBUSY;
goto failed1;
@@ -241,7 +241,7 @@ xilinxfb_drv_probe(struct device *dev)
drvdata->fb_virt = dma_alloc_coherent(dev, PAGE_ALIGN(FB_SIZE),
&drvdata->fb_phys, GFP_KERNEL);
if (!drvdata->fb_virt) {
- printk(KERN_ERR "Could not allocate frame buffer memory\n");
+ dev_err(dev, "Could not allocate frame buffer memory\n");
retval = ...From: Grant Likely <grant.likely@secretlab.ca>
Labels and gotos are used in xilinxfb_assign to unwind allocations
on device registration failures. Rename the labels to reflect the
error which occured. This change is being made to make it easier
to add new failout paths (which occurs in a subsuquent patch) and
to make reviewing the failout path easier.
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
---
drivers/video/xilinxfb.c | 18 +++++++++---------
1 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/drivers/video/xilinxfb.c b/drivers/video/xilinxfb.c
index e63cbd1..9aa754a 100644
--- a/drivers/video/xilinxfb.c
+++ b/drivers/video/xilinxfb.c
@@ -225,14 +225,14 @@ xilinxfb_drv_probe(struct device *dev)
if (!regs_res || (regs_res->end - regs_res->start + 1 < 8)) {
dev_err(dev, "Couldn't get registers resource\n");
retval = -EFAULT;
- goto failed1;
+ goto err_region;
}
if (!request_mem_region(regs_res->start, 8, DRIVER_NAME)) {
dev_err(dev, "Couldn't lock memory region at 0x%08X\n",
regs_res->start);
retval = -EBUSY;
- goto failed1;
+ goto err_region;
}
drvdata->regs = (u32 __iomem*) ioremap(regs_res->start, 8);
drvdata->regs_phys = regs_res->start;
@@ -243,7 +243,7 @@ xilinxfb_drv_probe(struct device *dev)
if (!drvdata->fb_virt) {
dev_err(dev, "Could not allocate frame buffer memory\n");
retval = -ENOMEM;
- goto failed2;
+ goto err_fbmem;
}
/* Clear (turn to black) the framebuffer */
@@ -270,7 +270,7 @@ xilinxfb_drv_probe(struct device *dev)
dev_err(dev, "Fail to allocate colormap (%d entries)\n",
PALETTE_ENTRIES_NO);
retval = -EFAULT;
- goto failed3;
+ goto err_cmap;
}
drvdata->info.flags = FBINFO_DEFAULT;
@@ -284,7 +284,7 @@ xilinxfb_drv_probe(struct device *dev)
if (register_framebuffer(&drvdata->info) < 0) {
dev_err(dev, "Could not register frame buffer\n");
retval = -EINVAL;
- goto failed4;
+ goto err_regfb;
}
/* Put a banner in ...From: Grant Likely <grant.likely@secretlab.ca> Adds the of_platform bus binding to the xilinxfb driver. Needed to use framebuffer devices described in the OF device tree (used by arch/powerpc). Signed-off-by: Grant Likely <grant.likely@secretlab.ca> --- drivers/video/xilinxfb.c | 101 ++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 93 insertions(+), 8 deletions(-) diff --git a/drivers/video/xilinxfb.c b/drivers/video/xilinxfb.c index e482bb5..4cf03e1 100644 --- a/drivers/video/xilinxfb.c +++ b/drivers/video/xilinxfb.c @@ -6,9 +6,12 @@ * Author: MontaVista Software, Inc. * source@mvista.com * - * 2002-2007 (c) MontaVista Software, Inc. This file is licensed under the - * terms of the GNU General Public License version 2. This program is licensed - * "as is" without any warranty of any kind, whether express or implied. + * 2002-2007 (c) MontaVista Software, Inc. + * 2007 (c) Secret Lab Technologies, Ltd. + * + * This file is licensed under the terms of the GNU General Public License + * version 2. This program is licensed "as is" without any warranty of any + * kind, whether express or implied. */ /* @@ -29,7 +32,10 @@ #include <linux/init.h> #include <linux/dma-mapping.h> #include <linux/platform_device.h> - +#if defined(CONFIG_OF) +#include <linux/of_device.h> +#include <linux/of_platform.h> +#endif #include <asm/io.h> #include <linux/xilinxfb.h> @@ -384,13 +390,91 @@ static struct platform_driver xilinxfb_platform_driver = { }, }; +/* --------------------------------------------------------------------- + * OF bus binding + */ + +#if defined(CONFIG_OF) +static int __devinit +xilinxfb_of_probe(struct of_device *op, const struct of_device_id *match) +{ + struct resource res; + const u32 *prop; + int width = 0, height = 0, rotate = 0; + int size, rc; + + dev_dbg(&op->dev, "xilinxfb_of_probe(%p, %p)\n", op, match); + + rc = of_address_to_resource(op->node, 0, &res); + if (rc) ...
Is it better to add error handling for platform_driver_register()?
rc = platform_driver_register(&xilinxfb_platform_driver);
if (rc)
xilinxfb_of_unregister();
-
Right, good catch. I'll fix that Thanks! g. -- Grant Likely, B.Sc., P.Eng. Secret Lab Technologies Ltd. grant.likely@secretlab.ca (403) 399-0195 -
Acked-by: Andrei Konovalov <akonovalov@ru.mvista.com> Assuming the issue with error handling in xilinxfb_init() pointed out by -
From: Grant Likely <grant.likely@secretlab.ca>
Split the device setup code away from the platform bus binding. This is
in preparation for adding the of_platform bus binding to this driver and
most of the setup code is common between the two busses.
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
---
drivers/video/xilinxfb.c | 133 ++++++++++++++++++++++++++++------------------
1 files changed, 80 insertions(+), 53 deletions(-)
diff --git a/drivers/video/xilinxfb.c b/drivers/video/xilinxfb.c
index 9aa754a..12d9127 100644
--- a/drivers/video/xilinxfb.c
+++ b/drivers/video/xilinxfb.c
@@ -196,23 +196,17 @@ static struct fb_ops xilinxfb_ops =
.fb_imageblit = cfb_imageblit,
};
-/* === The device driver === */
+/* ---------------------------------------------------------------------
+ * Bus independent setup/teardown
+ */
-static int
-xilinxfb_drv_probe(struct device *dev)
+static int xilinxfb_assign(struct device *dev, unsigned long physaddr,
+ int width_mm, int height_mm, int rotate)
{
- struct platform_device *pdev;
- struct xilinxfb_platform_data *pdata;
struct xilinxfb_drvdata *drvdata;
- struct resource *regs_res;
- int retval;
-
- if (!dev)
- return -EINVAL;
-
- pdev = to_platform_device(dev);
- pdata = pdev->dev.platform_data;
+ int rc;
+ /* Allocate the driver data region */
drvdata = kzalloc(sizeof(*drvdata), GFP_KERNEL);
if (!drvdata) {
dev_err(dev, "Couldn't allocate device private record\n");
@@ -221,40 +215,39 @@ xilinxfb_drv_probe(struct device *dev)
dev_set_drvdata(dev, drvdata);
/* Map the control registers in */
- regs_res = platform_get_resource(pdev, IORESOURCE_IO, 0);
- if (!regs_res || (regs_res->end - regs_res->start + 1 < 8)) {
- dev_err(dev, "Couldn't get registers resource\n");
- retval = -EFAULT;
+ if (!request_mem_region(physaddr, 8, DRIVER_NAME)) {
+ dev_err(dev, "Couldn't lock memory region at 0x%08lX\n",
+ physaddr);
+ rc = -ENODEV;
goto err_region;
}
-
- if ...From: Grant Likely <grant.likely@secretlab.ca>
Change the platform bus binding to make use of the established
platform_bus API.
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
---
drivers/video/xilinxfb.c | 32 ++++++++++++++++----------------
1 files changed, 16 insertions(+), 16 deletions(-)
diff --git a/drivers/video/xilinxfb.c b/drivers/video/xilinxfb.c
index 12d9127..e482bb5 100644
--- a/drivers/video/xilinxfb.c
+++ b/drivers/video/xilinxfb.c
@@ -339,26 +339,24 @@ static int xilinxfb_release(struct device *dev)
*/
static int
-xilinxfb_drv_probe(struct device *dev)
+xilinxfb_platform_probe(struct platform_device *pdev)
{
- struct platform_device *pdev;
struct xilinxfb_platform_data *pdata;
struct resource *res;
int width_mm;
int height_mm;
int rotate;
- pdev = to_platform_device(dev);
pdata = pdev->dev.platform_data;
if (!pdata) {
- dev_err(dev, "Missing pdata structure\n");
+ dev_err(&pdev->dev, "Missing pdata structure\n");
return -ENODEV;
}
/* Find the registers address */
res = platform_get_resource(pdev, IORESOURCE_IO, 0);
if (!res) {
- dev_err(dev, "Couldn't get registers resource\n");
+ dev_err(&pdev->dev, "Couldn't get registers resource\n");
return -ENODEV;
}
@@ -366,22 +364,24 @@ xilinxfb_drv_probe(struct device *dev)
width_mm = pdata->screen_width_mm;
rotate = pdata->rotate_screen ? 1 : 0;
- return xilinxfb_assign(dev, res->start, width_mm, height_mm, rotate);
+ return xilinxfb_assign(&pdev->dev, res->start, width_mm, height_mm,
+ rotate);
}
static int
-xilinxfb_drv_remove(struct device *dev)
+xilinxfb_platform_remove(struct platform_device *pdev)
{
- return xilinxfb_release(dev);
+ return xilinxfb_release(&pdev->dev);
}
-static struct device_driver xilinxfb_driver = {
- .name = DRIVER_NAME,
- .bus = &platform_bus_type,
-
- .probe = xilinxfb_drv_probe,
- .remove = xilinxfb_drv_remove
+static struct platform_driver xilinxfb_platform_driver ...BTW, what path do framebuffer patches take to get into Linus' tree? Does he pull your tree directly, or do they go through someone else's tree? Thanks, -- Grant Likely, B.Sc., P.Eng. Secret Lab Technologies Ltd. grant.likely@secretlab.ca (403) 399-0195 -
They all go to -mm tree, unless it's a needed fix, then to Linus's. Tony -
Ah, okay. Since the XilinxFB is a powerpc-only device, is it okay with you if I get Paul Mackerras to merge them into his tree instead (that way the changes go in with the platform code which requires these changes) Paulus, is that okay by you? Thanks, g. -- Grant Likely, B.Sc., P.Eng. Secret Lab Technologies Ltd. grant.likely@secretlab.ca (403) 399-0195 -
