From: Eric Miao <eric.y.miao@gmail.com>
To: Jaya Kumar <jayakumar.lkml@gmail.com>
Cc: ymiao3@marvell.com, linux-fbdev-devel@lists.sourceforge.net,
linux-arm-kernel@lists.arm.linux.org.uk
Subject: Re: [RFC 2.6.26-rc3 1/7] pxafb: module unloading support
Date: Tue, 10 Jun 2008 14:25:02 +0800 [thread overview]
Message-ID: <484E1E3E.40204@gmail.com> (raw)
In-Reply-To: <1212814166-10313-2-git-send-email-jayakumar.lkml@gmail.com>
Jaya Kumar wrote:
> This patch to pxafb adds:
> - exit and remove handlers
> - changes to use __devinit/exit for probe functions and __init/exit for
> init/exit functions
> - reorders failure handling in probe
>
Overall looks OK to me. However, I suggest to have three separate
patches for this:
1 for reorder failure
1 for sanitized usage of __devinit
1 for exit and remove handlers
with some comments below.
> Signed-off-by: Jaya Kumar <jayakumar.lkml@gmail.com>
> ---
> drivers/video/pxafb.c | 66 ++++++++++++++++++++++++++++++++++++++++---------
> 1 files changed, 54 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/video/pxafb.c b/drivers/video/pxafb.c
> index 274bc93..209a03d 100644
> --- a/drivers/video/pxafb.c
> +++ b/drivers/video/pxafb.c
> @@ -1246,7 +1246,7 @@ static int pxafb_resume(struct platform_device *dev)
> * cache. Once this area is remapped, all virtual memory
> * access to the video memory should occur at the new region.
> */
> -static int __init pxafb_map_video_memory(struct pxafb_info *fbi)
> +static int __devinit pxafb_map_video_memory(struct pxafb_info *fbi)
> {
> /*
> * We reserve one page for the palette, plus the size
> @@ -1346,7 +1346,7 @@ decode_mode:
> pxafb_decode_mode_info(fbi, inf->modes, inf->num_modes);
> }
>
> -static struct pxafb_info * __init pxafb_init_fbinfo(struct device *dev)
> +static struct pxafb_info * __devinit pxafb_init_fbinfo(struct device *dev)
> {
> struct pxafb_info *fbi;
> void *addr;
> @@ -1408,7 +1408,7 @@ static struct pxafb_info * __init pxafb_init_fbinfo(struct device *dev)
> }
>
> #ifdef CONFIG_FB_PXA_PARAMETERS
> -static int __init parse_opt_mode(struct device *dev, const char *this_opt)
> +static int __devinit parse_opt_mode(struct device *dev, const char *this_opt)
> {
> struct pxafb_mach_info *inf = dev->platform_data;
>
> @@ -1467,7 +1467,7 @@ done:
> return 0;
> }
>
> -static int __init parse_opt(struct device *dev, char *this_opt)
> +static int __devinit parse_opt(struct device *dev, char *this_opt)
> {
> struct pxafb_mach_info *inf = dev->platform_data;
> struct pxafb_mode_info *mode = &inf->modes[0];
> @@ -1565,7 +1565,7 @@ static int __init parse_opt(struct device *dev, char *this_opt)
> return 0;
> }
>
> -static int __init pxafb_parse_options(struct device *dev, char *options)
> +static int __devinit pxafb_parse_options(struct device *dev, char *options)
> {
> char *this_opt;
> int ret;
> @@ -1587,7 +1587,7 @@ static int __init pxafb_parse_options(struct device *dev, char *options)
> static char g_options[256] __devinitdata = "";
>
> #ifndef CONFIG_MODULES
> -static int __devinit pxafb_setup_options(void)
> +static int __init pxafb_setup_options(void)
> {
> char *options = NULL;
>
> @@ -1611,7 +1611,7 @@ MODULE_PARM_DESC(options, "LCD parameters (see Documentation/fb/pxafb.txt)");
> #define pxafb_setup_options() (0)
> #endif
>
> -static int __init pxafb_probe(struct platform_device *dev)
> +static int __devinit pxafb_probe(struct platform_device *dev)
> {
> struct pxafb_info *fbi;
> struct pxafb_mach_info *inf;
> @@ -1763,29 +1763,65 @@ static int __init pxafb_probe(struct platform_device *dev)
>
> failed_free_irq:
> free_irq(irq, fbi);
> -failed_free_res:
> - release_mem_region(r->start, r->end - r->start + 1);
> -failed_free_io:
> - iounmap(fbi->mmio_base);
> + if (fbi->fb.cmap.len)
> + fb_dealloc_cmap(&fbi->fb.cmap);
> failed_free_mem:
> dma_free_writecombine(&dev->dev, fbi->map_size,
> fbi->map_cpu, fbi->map_dma);
> +failed_free_io:
> + iounmap(fbi->mmio_base);
> +failed_free_res:
> + release_mem_region(r->start, r->end - r->start + 1);
I'd prefer a separate patch to fix the exit sequence. There is another
issue of the below code labeled by "failed:", which incorrect kfree()
the fbi, which might not be initialized yet. So I'd suggest another
failed_fbi as below:
> failed:
> platform_set_drvdata(dev, NULL);
> kfree(fbi);
failed_fbi:
kfree(fbi);
failed:
return ret;
and platform_set_drvdata() can be moved to failed_free_irq, since that
is the place after which platform_set_drvdata(dev, fbi) is called.
> return ret;
> }
>
> +static int __devexit pxafb_remove(struct platform_device *dev)
> +{
> + struct pxafb_info *fbi = platform_get_drvdata(dev);
> + struct resource *r;
> + int irq;
> +
> + if (fbi) {
I'd write this as
if (fbi == NULL)
return 0;
so we save one indent tab here, but that's personal style and
it's up to you.
> + struct fb_info *info = &fbi->fb;
> +
> + unregister_framebuffer(info);
> + if (fbi->fb.cmap.len)
> + fb_dealloc_cmap(&info->cmap);
> +
> + pxafb_disable_controller(fbi);
> + clk_put(fbi->clk);
> +
> + dma_free_writecombine(&dev->dev, fbi->map_size,
> + fbi->map_cpu, fbi->map_dma);
> +
> + irq = platform_get_irq(dev, 0);
> + free_irq(irq, fbi);
> +
> + iounmap(fbi->mmio_base);
> +
> + r = platform_get_resource(dev, IORESOURCE_MEM, 0);
> + release_mem_region(r->start, r->end - r->start + 1);
> +
> + kfree(fbi);
> + }
> + return 0;
> +}
> +
> static struct platform_driver pxafb_driver = {
> .probe = pxafb_probe,
> + .remove = pxafb_remove,
> .suspend = pxafb_suspend,
> .resume = pxafb_resume,
> .driver = {
> + .owner = THIS_MODULE,
> .name = "pxa2xx-fb",
> },
> };
>
> -static int __devinit pxafb_init(void)
> +static int __init pxafb_init(void)
> {
> if (pxafb_setup_options())
> return -EINVAL;
> @@ -1793,7 +1829,13 @@ static int __devinit pxafb_init(void)
> return platform_driver_register(&pxafb_driver);
> }
>
> +static void __exit pxafb_exit(void)
> +{
> + platform_driver_unregister(&pxafb_driver);
> +}
> +
> module_init(pxafb_init);
> +module_exit(pxafb_exit);
>
> MODULE_DESCRIPTION("loadable framebuffer driver for PXA");
> MODULE_LICENSE("GPL");
-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
next prev parent reply other threads:[~2008-06-10 6:25 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-06-07 4:49 [RFC 2.6.26-rc3 0/7] am200epd, pxafb, metronomefb changes v3 Jaya Kumar
2008-06-07 4:49 ` [RFC 2.6.26-rc3 1/7] pxafb: module unloading support Jaya Kumar
2008-06-07 8:35 ` Krzysztof Helt
2008-06-10 6:25 ` Eric Miao [this message]
2008-06-10 6:43 ` Lothar Waßmann
2008-06-10 7:44 ` Eric Miao
2008-06-12 4:36 ` Jaya Kumar
2008-06-12 5:25 ` Krzysztof Helt
2008-06-12 10:20 ` Eric Miao
2008-06-12 14:17 ` Jaya Kumar
2008-06-07 4:49 ` [RFC 2.6.26-rc3 2/7] pxafb: add shared framebuffer interface Jaya Kumar
2008-06-07 8:38 ` Krzysztof Helt
2008-06-07 4:49 ` [RFC 2.6.26-rc3 3/7] gumstix: conversion to MFP support and add bluetooth support Jaya Kumar
2008-06-07 4:49 ` [RFC 2.6.26-rc3 4/7] am200epd: move am200epd to mach-pxa Jaya Kumar
2008-06-07 8:40 ` Krzysztof Helt
2008-06-07 4:49 ` [RFC 2.6.26-rc3 5/7] am200epd: convert to shared fb and use gpio api Jaya Kumar
2008-06-07 8:43 ` Krzysztof Helt
2008-06-07 4:49 ` [RFC 2.6.26-rc3 6/7] metronomefb: convert printk to dev_dbg/err messages Jaya Kumar
2008-06-07 8:46 ` Krzysztof Helt
2008-06-07 4:49 ` [RFC 2.6.26-rc3 7/7] metronomefb: changes to use separate framebuffer Jaya Kumar
2008-06-07 8:59 ` Krzysztof Helt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=484E1E3E.40204@gmail.com \
--to=eric.y.miao@gmail.com \
--cc=jayakumar.lkml@gmail.com \
--cc=linux-arm-kernel@lists.arm.linux.org.uk \
--cc=linux-fbdev-devel@lists.sourceforge.net \
--cc=ymiao3@marvell.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).