From: Krzysztof H. <krz...@po...> - 2008-06-07 08:56:57
|
On Sat, 7 Jun 2008 00:49:26 -0400 Jaya Kumar <jay...@gm...> wrote: > These changes are used in order to support the use of a separate > framebuffer provided by the platform device driver. Other changes > are cleanup to error handling and order of release. > > Signed-off-by: Jaya Kumar <jay...@gm...> > --- > drivers/video/metronomefb.c | 209 +++++++++++++++++++++++++------------------ > include/video/metronomefb.h | 22 ++--- > 2 files changed, 130 insertions(+), 101 deletions(-) > > diff --git a/drivers/video/metronomefb.c b/drivers/video/metronomefb.c > index 8ccd113..b32f4d2 100644 > --- a/drivers/video/metronomefb.c > +++ b/drivers/video/metronomefb.c > @@ -710,14 +746,12 @@ err_cmap: > err_fb_rel: > framebuffer_release(info); > err_free_irq: > - board->free_irq(info); > -err_dma_free: > - dma_free_writecombine(&dev->dev, par->metromemsize, par->metromem, > - par->metromem_dma); > + board->cleanup(par); > err_csum_table: > vfree(par->csum_table); > err_vfree: > - vfree(videomemory); > + if (videomemory) > + vfree(videomemory); > module_put(board->owner); > return retval; > } One suspicious thing is that framebuffer_release(info) is called the first in the metronomefb_probe() (in case of failure) and as the last in the metronomefb_remove() (see below). It seems to be an error in the _probe function, the fb_info is allocated before the first vmalloc() so order of error labels is wrong. Regards, Krzysztof > @@ -728,15 +762,15 @@ static int __devexit metronomefb_remove(struct platform_device *dev) > > if (info) { > struct metronomefb_par *par = info->par; > + > + unregister_framebuffer(info); > fb_deferred_io_cleanup(info); > - dma_free_writecombine(&dev->dev, par->metromemsize, > - par->metromem, par->metromem_dma); > fb_dealloc_cmap(&info->cmap); > vfree(par->csum_table); > - unregister_framebuffer(info); > vfree((void __force *)info->screen_base); > - par->board->free_irq(info); > + par->board->cleanup(par); > module_put(par->board->owner); > + dev_dbg(&dev->dev, "calling release\n"); > framebuffer_release(info); > } > return 0; > @@ -761,6 +795,9 @@ static void __exit metronomefb_exit(void) > platform_driver_unregister(&metronomefb_driver); > } > ---------------------------------------------------------------------- Tanie rozmowy! Sprawdz >>> http://link.interia.pl/f1e22 |