From: Grant Likely <hidden> Date: 2007-10-01 15:59:27
(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.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
From: Grant Likely <hidden> Date: 2007-10-01 15:57:52
From: Grant Likely <redacted>
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 <redacted>
---
drivers/video/xilinxfb.c | 14 +++++++-------
1 files changed, 7 insertions(+), 7 deletions(-)
@@ -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;gotofailed1;}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;gotofailed1;
@@ -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=-ENOMEM;gotofailed2;}
@@ -267,7 +267,7 @@ xilinxfb_drv_probe(struct device *dev)drvdata->info.pseudo_palette=drvdata->pseudo_palette;if(fb_alloc_cmap(&drvdata->info.cmap,PALETTE_ENTRIES_NO,0)<0){-printk(KERN_ERR"Fail to allocate colormap (%d entries)\n",+dev_err(dev,"Fail to allocate colormap (%d entries)\n",PALETTE_ENTRIES_NO);retval=-EFAULT;gotofailed3;
@@ -282,7 +282,7 @@ xilinxfb_drv_probe(struct device *dev)/* Register new frame buffer */if(register_framebuffer(&drvdata->info)<0){-printk(KERN_ERR"Could not register frame buffer\n");+dev_err(dev,"Could not register frame buffer\n");retval=-EINVAL;gotofailed4;}
From: Grant Likely <hidden> Date: 2007-10-01 15:58:33
From: Grant Likely <redacted>
Debug support: when DEBUG is defined, output relevant details to the
log about the framebuffer registration.
Signed-off-by: Grant Likely <redacted>
---
drivers/video/xilinxfb.c | 5 +++++
1 files changed, 5 insertions(+), 0 deletions(-)
From: Grant Likely <hidden> Date: 2007-10-01 15:58:46
From: Grant Likely <redacted>
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 <redacted>
---
drivers/video/xilinxfb.c | 18 +++++++++---------
1 files changed, 9 insertions(+), 9 deletions(-)
@@ -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;-gotofailed1;+gotoerr_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;-gotofailed1;+gotoerr_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;-gotofailed2;+gotoerr_fbmem;}/* Clear (turn to black) the framebuffer */
@@ -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;-gotofailed4;+gotoerr_regfb;}/* Put a banner in the log (for DEBUG) */
From: Grant Likely <hidden> Date: 2007-10-01 15:59:04
From: Grant Likely <redacted>
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 <redacted>
---
drivers/video/xilinxfb.c | 101 ++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 93 insertions(+), 8 deletions(-)
@@ -384,13 +390,91 @@ static struct platform_driver xilinxfb_platform_driver = {},};+/* ---------------------------------------------------------------------+*OFbusbinding+*/++#if defined(CONFIG_OF)+staticint__devinit+xilinxfb_of_probe(structof_device*op,conststructof_device_id*match)+{+structresourceres;+constu32*prop;+intwidth=0,height=0,rotate=0;+intsize,rc;++dev_dbg(&op->dev,"xilinxfb_of_probe(%p, %p)\n",op,match);++rc=of_address_to_resource(op->node,0,&res);+if(rc){+dev_err(&op->dev,"invalid address\n");+returnrc;+}++prop=of_get_property(op->node,"display-number",&size);+if((prop)&&(size>=sizeof(u32)*2)){+width=prop[0];+height=prop[1];+}++if(of_find_property(op->node,"rotate-display",NULL))+rotate=1;++returnxilinxfb_assign(&op->dev,res.start,width,height,rotate);+}++staticint__devexitxilinxfb_of_remove(structof_device*op)+{+returnxilinxfb_release(&op->dev);+}++/* Match table for of_platform binding */+staticstructof_device_id__devinitxilinxfb_of_match[]={+{.compatible="xilinx,ml300-fb",},+{},+};+MODULE_DEVICE_TABLE(of,xilinxfb_of_match);++staticstructof_platform_driverxilinxfb_of_driver={+.owner=THIS_MODULE,+.name=DRIVER_NAME,+.match_table=xilinxfb_of_match,+.probe=xilinxfb_of_probe,+.remove=__devexit_p(xilinxfb_of_remove),+.driver={+.name=DRIVER_NAME,+},+};++/* Registration helpers to keep the number of #ifdefs to a minimum */+staticinlineint__initxilinxfb_of_register(void)+{+pr_debug("xilinxfb: calling of_register_platform_driver()\n");+returnof_register_platform_driver(&xilinxfb_of_driver);+}++staticinlinevoid__exitxilinxfb_of_unregister(void)+{+of_unregister_platform_driver(&xilinxfb_of_driver);+}+#else /* CONFIG_OF */+/* CONFIG_OF not enabled; do nothing helpers */+staticinlineint__initxilinxfb_of_register(void){return0;}+staticinlinevoid__exitxilinxfb_of_unregister(void){}+#endif /* CONFIG_OF */++/* ---------------------------------------------------------------------+*Modulesetupandteardown+*/+staticint__initxilinxfb_init(void){-/*-*Nokernelbootoptionsused,-*sowejustneedtoregisterthedriver-*/+intrc;+rc=xilinxfb_of_register();+if(rc)+returnrc;+returnplatform_driver_register(&xilinxfb_platform_driver);}
From: Grant Likely <hidden> Date: 2007-10-01 15:59:44
From: Grant Likely <redacted>
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 <redacted>
---
drivers/video/xilinxfb.c | 133 ++++++++++++++++++++++++++++------------------
1 files changed, 80 insertions(+), 53 deletions(-)
@@ -196,23 +196,17 @@ static struct fb_ops xilinxfb_ops =.fb_imageblit=cfb_imageblit,};-/* === The device driver === */+/* ---------------------------------------------------------------------+*Busindependentsetup/teardown+*/-staticint-xilinxfb_drv_probe(structdevice*dev)+staticintxilinxfb_assign(structdevice*dev,unsignedlongphysaddr,+intwidth_mm,intheight_mm,introtate){-structplatform_device*pdev;-structxilinxfb_platform_data*pdata;structxilinxfb_drvdata*drvdata;-structresource*regs_res;-intretval;--if(!dev)-return-EINVAL;--pdev=to_platform_device(dev);-pdata=pdev->dev.platform_data;+intrc;+/* 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;gotoerr_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;-gotoerr_region;+drvdata->regs_phys=physaddr;+drvdata->regs=ioremap(physaddr,8);+if(!drvdata->regs){+dev_err(dev,"Couldn't lock memory region at 0x%08lX\n",+physaddr);+rc=-ENODEV;+gotoerr_map;}-drvdata->regs=(u32__iomem*)ioremap(regs_res->start,8);-drvdata->regs_phys=regs_res->start;/* Allocate the framebuffer memory */drvdata->fb_virt=dma_alloc_coherent(dev,PAGE_ALIGN(FB_SIZE),&drvdata->fb_phys,GFP_KERNEL);if(!drvdata->fb_virt){dev_err(dev,"Could not allocate frame buffer memory\n");-retval=-ENOMEM;+rc=-ENOMEM;gotoerr_fbmem;}/* Clear (turn to black) the framebuffer */-memset_io((void*)drvdata->fb_virt,0,FB_SIZE);+memset_io(drvdata->fb_virt,0,FB_SIZE);/* Tell the hardware where the frame buffer is */xilinx_fb_out_be32(drvdata,REG_FB_ADDR,drvdata->fb_phys);/* Turn on the display */drvdata->reg_ctrl_default=REG_CTRL_ENABLE;-if(pdata&&pdata->rotate_screen)+if(rotate)drvdata->reg_ctrl_default|=REG_CTRL_ROTATE;xilinx_fb_out_be32(drvdata,REG_CTRL,drvdata->reg_ctrl_default);
@@ -265,31 +258,29 @@ xilinxfb_drv_probe(struct device *dev)drvdata->info.fix=xilinx_fb_fix;drvdata->info.fix.smem_start=drvdata->fb_phys;drvdata->info.pseudo_palette=drvdata->pseudo_palette;+drvdata->info.flags=FBINFO_DEFAULT;+drvdata->info.var=xilinx_fb_var;++xilinx_fb_var.height=height_mm;+xilinx_fb_var.width=width_mm;-if(fb_alloc_cmap(&drvdata->info.cmap,PALETTE_ENTRIES_NO,0)<0){+/* Allocate a colour map */+rc=fb_alloc_cmap(&drvdata->info.cmap,PALETTE_ENTRIES_NO,0);+if(rc){dev_err(dev,"Fail to allocate colormap (%d entries)\n",PALETTE_ENTRIES_NO);-retval=-EFAULT;gotoerr_cmap;}-drvdata->info.flags=FBINFO_DEFAULT;-if(pdata){-xilinx_fb_var.height=pdata->screen_height_mm;-xilinx_fb_var.width=pdata->screen_width_mm;-}-drvdata->info.var=xilinx_fb_var;-/* Register new frame buffer */-if(register_framebuffer(&drvdata->info)<0){+rc=register_framebuffer(&drvdata->info);+if(rc){dev_err(dev,"Could not register frame buffer\n");-retval=-EINVAL;gotoerr_regfb;}/* 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,"regs: phys=%lx, virt=%p\n",physaddr,drvdata->regs);dev_dbg(dev,"fb: phys=%p, virt=%p, size=%x\n",(void*)drvdata->fb_phys,drvdata->fb_virt,FB_SIZE);return0;/* success */
@@ -300,30 +291,25 @@ err_regfb:err_cmap:dma_free_coherent(dev,PAGE_ALIGN(FB_SIZE),drvdata->fb_virt,drvdata->fb_phys);-/* Turn off the display */xilinx_fb_out_be32(drvdata,REG_CTRL,0);-iounmap(drvdata->regs);err_fbmem:-release_mem_region(regs_res->start,8);+iounmap(drvdata->regs);++err_map:+release_mem_region(physaddr,8);err_region:kfree(drvdata);dev_set_drvdata(dev,NULL);-returnretval;+returnrc;}-staticint-xilinxfb_drv_remove(structdevice*dev)+staticintxilinxfb_release(structdevice*dev){-structxilinxfb_drvdata*drvdata;--if(!dev)-return-ENODEV;--drvdata=(structxilinxfb_drvdata*)dev_get_drvdata(dev);+structxilinxfb_drvdata*drvdata=dev_get_drvdata(dev);#if !defined(CONFIG_FRAMEBUFFER_CONSOLE) && defined(CONFIG_LOGO)xilinx_fb_blank(VESA_POWERDOWN,&drvdata->info);
@@ -348,6 +334,47 @@ xilinxfb_drv_remove(struct device *dev)return0;}+/* ---------------------------------------------------------------------+*Platformbusbinding+*/++staticint+xilinxfb_drv_probe(structdevice*dev)+{+structplatform_device*pdev;+structxilinxfb_platform_data*pdata;+structresource*res;+intwidth_mm;+intheight_mm;+introtate;++pdev=to_platform_device(dev);+pdata=pdev->dev.platform_data;+if(!pdata){+dev_err(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");+return-ENODEV;+}++height_mm=pdata->screen_height_mm;+width_mm=pdata->screen_width_mm;+rotate=pdata->rotate_screen?1:0;++returnxilinxfb_assign(dev,res->start,width_mm,height_mm,rotate);+}++staticint+xilinxfb_drv_remove(structdevice*dev)+{+returnxilinxfb_release(dev);+}+staticstructdevice_driverxilinxfb_driver={.name=DRIVER_NAME,-------------------------------------------------------------------------
From: Grant Likely <hidden> Date: 2007-10-01 15:59:57
From: Grant Likely <redacted>
Change the platform bus binding to make use of the established
platform_bus API.
Signed-off-by: Grant Likely <redacted>
---
drivers/video/xilinxfb.c | 32 ++++++++++++++++----------------
1 files changed, 16 insertions(+), 16 deletions(-)
static int __init
xilinxfb_init(void)
{
- /*
- * No kernel boot options used,
- * so we just need to register the driver
- */
+ int rc;
+ rc = xilinxfb_of_register();
+ if (rc)
+ return rc;
+
return platform_driver_register(&xilinxfb_platform_driver);
Is it better to add error handling for platform_driver_register()?
rc = platform_driver_register(&xilinxfb_platform_driver);
if (rc)
xilinxfb_of_unregister();
return rc;
From: Grant Likely <hidden> Date: 2007-10-01 16:46:46
On 10/1/07, Akinobu Mita [off-list ref] wrote:
2007/10/2, Grant Likely [off-list ref]:
quoted
static int __init
xilinxfb_init(void)
{
- /*
- * No kernel boot options used,
- * so we just need to register the driver
- */
+ int rc;
+ rc = xilinxfb_of_register();
+ if (rc)
+ return rc;
+
return platform_driver_register(&xilinxfb_platform_driver);
Is it better to add error handling for platform_driver_register()?
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
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
From: "Antonino A. Daplas" <adaplas@gmail.com> Date: 2007-10-03 00:15:23
On Mon, 2007-10-01 at 09:57 -0600, Grant Likely wrote:
(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.
Okay.
Tony
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
From: Andrei Konovalov <hidden> Date: 2007-10-04 12:00:31
Grant Likely wrote:
From: Grant Likely <redacted>
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 <redacted>
---
Acked-by: Andrei Konovalov <redacted>
Assuming the issue with error handling in xilinxfb_init() pointed out by
Akinobu Mita is fixed.
From: Andrei Konovalov <hidden> Date: 2007-10-04 12:01:19
Grant Likely wrote:
From: Grant Likely <redacted>
Debug support: when DEBUG is defined, output relevant details to the
log about the framebuffer registration.
Signed-off-by: Grant Likely <redacted>
---
From: Andrei Konovalov <hidden> Date: 2007-10-04 12:01:42
Grant Likely wrote:
From: Grant Likely <redacted>
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 <redacted>
---
From: Andrei Konovalov <hidden> Date: 2007-10-04 12:02:17
Grant Likely wrote:
From: Grant Likely <redacted>
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 <redacted>
---
From: Andrei Konovalov <hidden> Date: 2007-10-04 12:02:36
Grant Likely wrote:
From: Grant Likely <redacted>
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 <redacted>
---
From: Andrei Konovalov <hidden> Date: 2007-10-04 12:02:56
Grant Likely wrote:
From: Grant Likely <redacted>
Change the platform bus binding to make use of the established
platform_bus API.
Signed-off-by: Grant Likely <redacted>
---
From: Grant Likely <hidden> Date: 2007-10-09 04:44:14
On 10/2/07, Antonino A. Daplas [off-list ref] wrote:
On Mon, 2007-10-01 at 09:57 -0600, Grant Likely wrote:
quoted
Assuming there are no major issues, I'd like to get this patch series
queued up for inclusion in 2.6.24.
Okay.
Tony
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,
g.
--
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.
grant.likely@secretlab.ca
(403) 399-0195
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
From: "Antonino A. Daplas" <adaplas@gmail.com> Date: 2007-10-09 05:04:18
On Mon, 2007-10-08 at 22:43 -0600, Grant Likely wrote:
On 10/2/07, Antonino A. Daplas [off-list ref] wrote:
quoted
On Mon, 2007-10-01 at 09:57 -0600, Grant Likely wrote:
quoted
Assuming there are no major issues, I'd like to get this patch series
queued up for inclusion in 2.6.24.
Okay.
Tony
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?
They all go to -mm tree, unless it's a needed fix, then to Linus's.
Tony
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
From: Grant Likely <hidden> Date: 2007-10-09 17:39:27
On 10/8/07, Antonino A. Daplas [off-list ref] wrote:
On Mon, 2007-10-08 at 22:43 -0600, Grant Likely wrote:
quoted
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?
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
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
From: "Antonino A. Daplas" <adaplas@gmail.com> Date: 2007-10-09 21:06:49
On Tue, 2007-10-09 at 11:39 -0600, Grant Likely wrote:
On 10/8/07, Antonino A. Daplas [off-list ref] wrote:
quoted
On Mon, 2007-10-08 at 22:43 -0600, Grant Likely wrote:
quoted
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?
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)
Fine with me.
Tony
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/