platform-drivers: move probe to .devinit.text in drivers/video
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Thu, 4 Feb 2010 19:56:51 +0000 (20:56 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Mon, 8 Mar 2010 01:04:50 +0000 (17:04 -0800)
A pointer to a probe callback is passed to the core via
platform_driver_register and so the function must not disappear when the
.init sections are discarded.  Otherwise (if also having HOTPLUG=y)
unbinding and binding a device to the driver via sysfs will result in an
oops as does a device being registered late.

An alternative to this patch is using platform_driver_probe instead of
platform_driver_register plus removing the pointer to the probe function
from the struct platform_driver.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Cc: Adrian Bunk <bunk@stusta.de>
Cc: Alberto Mardegan <mardy@users.sourceforge.net>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Andriy Skulysh <askulysh@gmail.com>
Cc: Antonino Daplas <adaplas@gmail.com>
Cc: Anton Vorontsov <avorontsov@ru.mvista.com>
Cc: Ben Dooks <ben-linux@fluff.org>
Cc: Chandramouli Narayanan <mouli@linux.intel.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Frans Pop <elendil@planet.nl>
Cc: Geert Uytterhoeven <Geert.Uytterhoeven@sonycom.com>
Cc: Greg Kroah-Hartman <gregkh@suse.de>
Cc: Helge Deller <deller@gmx.de>
Cc: Huang Ying <ying.huang@intel.com>
Cc: Ian Molton <spyro@f2s.com>
Cc: Joshua Kinard <kumba@gentoo.org>
Cc: Kaj-Michael Lang <milang@tal.org>
Cc: Krzysztof Helt <krzysztof.h1@poczta.fm>
Cc: linux-fbdev-devel@lists.sourceforge.net
Cc: Maciej W. Rozycki <macro@linux-mips.org>
Cc: Magnus Damm <damm@igel.co.jp>
Cc: Martin Michlmayr <tbm@cyrius.com>
Cc: Matthias Kaehlcke <matthias@kaehlcke.net>
Cc: Paul Mundt <lethal@linux-sh.org>
Cc: Pavel Machek <pavel@suse.cz>
Cc: Philipp Zabel <philipp.zabel@gmail.com>
Cc: Richard Purdie <rpurdie@rpsys.net>
Cc: Roel Kluin <roel.kluin@gmail.com>
Cc: Roland Stigge <stigge@antcom.de>
Cc: Russell King <rmk+kernel@arm.linux.org.uk>
Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
Cc: Vincent Sanders <vince@simtec.co.uk>
Cc: Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>
Acked-by: Ralf Baechle <ralf@linux-mips.org>
Acked-by: Arnaud Patard <arnaud.patard@rtp-net.org>
Acked-by: James Simmons <jsimmons@infradead.org>
Acked-by: Peter Jones <pjones@redhat.com>
Acked-by: Jaya Kumar <jayakumar.lkml@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
17 files changed:
drivers/video/acornfb.c
drivers/video/arcfb.c
drivers/video/cobalt_lcdfb.c
drivers/video/efifb.c
drivers/video/epson1355fb.c
drivers/video/gbefb.c
drivers/video/hgafb.c
drivers/video/hitfb.c
drivers/video/q40fb.c
drivers/video/s3c2410fb.c
drivers/video/sa1100fb.c
drivers/video/sgivwfb.c
drivers/video/sh_mobile_lcdcfb.c
drivers/video/vesafb.c
drivers/video/vfb.c
drivers/video/vga16fb.c
drivers/video/w100fb.c

index 0bcc59eb37fa3787b39164a938199f2e1e0ea8ea..43d7d506736154bee53d3a67fa99fce943a935c0 100644 (file)
@@ -1221,7 +1221,7 @@ free_unused_pages(unsigned int virtual_start, unsigned int virtual_end)
        printk("acornfb: freed %dK memory\n", mb_freed);
 }
 
-static int __init acornfb_probe(struct platform_device *dev)
+static int __devinit acornfb_probe(struct platform_device *dev)
 {
        unsigned long size;
        u_int h_sync, v_sync;
index c3431691c9f21945afcce2efd924d9a9dfeac7bc..01554d6965281435c9a4a8e1876a68e551d3a0cd 100644 (file)
@@ -504,7 +504,7 @@ static struct fb_ops arcfb_ops = {
        .fb_ioctl       = arcfb_ioctl,
 };
 
-static int __init arcfb_probe(struct platform_device *dev)
+static int __devinit arcfb_probe(struct platform_device *dev)
 {
        struct fb_info *info;
        int retval = -ENOMEM;
index 108b89e09a80dbdd8c8593f5977a6b8b1a1b7586..5eb61b5adfe828df50459c2f5b82ef1c40b9526a 100644 (file)
@@ -287,7 +287,7 @@ static struct fb_ops cobalt_lcd_fbops = {
        .fb_cursor      = cobalt_lcdfb_cursor,
 };
 
-static int __init cobalt_lcdfb_probe(struct platform_device *dev)
+static int __devinit cobalt_lcdfb_probe(struct platform_device *dev)
 {
        struct fb_info *info;
        struct resource *res;
index d25df51bb0d2b3160efe478fb4e64f968014ea04..581d2dbf675a0061722db955a66d3fa402166db8 100644 (file)
@@ -210,7 +210,7 @@ static int __init efifb_setup(char *options)
        return 0;
 }
 
-static int __init efifb_probe(struct platform_device *dev)
+static int __devinit efifb_probe(struct platform_device *dev)
 {
        struct fb_info *info;
        int err;
index 2735b79e52a1d52bfc2035d0ca1c514d939dda78..6d755bb3a2bcf0ee832476504a0329b2c4b9e445 100644 (file)
@@ -602,7 +602,7 @@ static int epson1355fb_remove(struct platform_device *dev)
        return 0;
 }
 
-int __init epson1355fb_probe(struct platform_device *dev)
+int __devinit epson1355fb_probe(struct platform_device *dev)
 {
        struct epson1355_par *default_par;
        struct fb_info *info;
index 695fa013fe7ea2883e31137fc7953c9b18054f7e..5643a35c1746681ae1f464fe39036b5d42334b0f 100644 (file)
@@ -1128,7 +1128,7 @@ static int __init gbefb_setup(char *options)
        return 0;
 }
 
-static int __init gbefb_probe(struct platform_device *p_dev)
+static int __devinit gbefb_probe(struct platform_device *p_dev)
 {
        int i, ret = 0;
        struct fb_info *info;
index 0129c044f6d68ac5ffe6dea92021843c00313311..db9b785b56eb929d3baceba900a3f79921c54e57 100644 (file)
@@ -551,7 +551,7 @@ static struct fb_ops hgafb_ops = {
         *  Initialization
         */
 
-static int __init hgafb_probe(struct platform_device *pdev)
+static int __devinit hgafb_probe(struct platform_device *pdev)
 {
        struct fb_info *info;
 
index 73c83a8de2d37a68b35553f7dcc8e18cb5fde890..bf78779199c6ff48fd253993d451b15ee8d74637 100644 (file)
@@ -325,7 +325,7 @@ static struct fb_ops hitfb_ops = {
        .fb_imageblit   = cfb_imageblit,
 };
 
-static int __init hitfb_probe(struct platform_device *dev)
+static int __devinit hitfb_probe(struct platform_device *dev)
 {
        unsigned short lcdclor, ldr3, ldvndr;
        struct fb_info *info;
index 4beac1df617b0ab9f6c909df4b5dc1ec1473afed..de40a626dc76b0effe165e84d258e816ccabf409 100644 (file)
@@ -85,7 +85,7 @@ static struct fb_ops q40fb_ops = {
        .fb_imageblit   = cfb_imageblit,
 };
 
-static int __init q40fb_probe(struct platform_device *dev)
+static int __devinit q40fb_probe(struct platform_device *dev)
 {
        struct fb_info *info;
 
index aac661225c78903d512fb2cb56b48095ee5f6c7a..2b094dec4a567523b0fe47499b1924fc2312e6e9 100644 (file)
@@ -1004,12 +1004,12 @@ dealloc_fb:
        return ret;
 }
 
-static int __init s3c2410fb_probe(struct platform_device *pdev)
+static int __devinit s3c2410fb_probe(struct platform_device *pdev)
 {
        return s3c24xxfb_probe(pdev, DRV_S3C2410);
 }
 
-static int __init s3c2412fb_probe(struct platform_device *pdev)
+static int __devinit s3c2412fb_probe(struct platform_device *pdev)
 {
        return s3c24xxfb_probe(pdev, DRV_S3C2412);
 }
index cdaa873a60541f00acad18def540fd010ee05b5b..e8b76d65a070f3b46c06517d17af81ece01e5bb0 100644 (file)
@@ -1435,7 +1435,7 @@ static struct sa1100fb_info * __init sa1100fb_init_fbinfo(struct device *dev)
        return fbi;
 }
 
-static int __init sa1100fb_probe(struct platform_device *pdev)
+static int __devinit sa1100fb_probe(struct platform_device *pdev)
 {
        struct sa1100fb_info *fbi;
        int ret, irq;
index f86012239bff25c232368778886246a3d423cccf..7a3a5e28eca13411f74022a8326d0f581a5194d2 100644 (file)
@@ -745,7 +745,7 @@ int __init sgivwfb_setup(char *options)
 /*
  *  Initialisation
  */
-static int __init sgivwfb_probe(struct platform_device *dev)
+static int __devinit sgivwfb_probe(struct platform_device *dev)
 {
        struct sgivw_par *par;
        struct fb_info *info;
index 8d7653e56df5e0ebe6a28cebf14c481304688102..bbd1dbf4026a32439bf5ef7b96b037974c5c6416 100644 (file)
@@ -943,7 +943,7 @@ static const struct dev_pm_ops sh_mobile_lcdc_dev_pm_ops = {
 
 static int sh_mobile_lcdc_remove(struct platform_device *pdev);
 
-static int __init sh_mobile_lcdc_probe(struct platform_device *pdev)
+static int __devinit sh_mobile_lcdc_probe(struct platform_device *pdev)
 {
        struct fb_info *info;
        struct sh_mobile_lcdc_priv *priv;
index bd37ee1f6a251bce027920a4eab805b0bbcfc3de..ef4128c8e57af0a31833908b00be09732c8a4fd7 100644 (file)
@@ -226,7 +226,7 @@ static int __init vesafb_setup(char *options)
        return 0;
 }
 
-static int __init vesafb_probe(struct platform_device *dev)
+static int __devinit vesafb_probe(struct platform_device *dev)
 {
        struct fb_info *info;
        int i, err;
index 050d432c7d952c3160794e30f22ad5f0cb7d4151..b8ab995fbda75f92248e62f6508deefb917ca034 100644 (file)
@@ -479,7 +479,7 @@ static int __init vfb_setup(char *options)
      *  Initialisation
      */
 
-static int __init vfb_probe(struct platform_device *dev)
+static int __devinit vfb_probe(struct platform_device *dev)
 {
        struct fb_info *info;
        int retval = -ENOMEM;
index 5b2938903ac2bee26df3de078d6b4106c97ca413..76d8dae5b1bb44d6ab7e7dc67ed0c3cf60c95b7c 100644 (file)
@@ -1293,7 +1293,7 @@ static int vga16fb_setup(char *options)
 }
 #endif
 
-static int __init vga16fb_probe(struct platform_device *dev)
+static int __devinit vga16fb_probe(struct platform_device *dev)
 {
        struct fb_info *info;
        struct vga16fb_par *par;
index 2376f688ec8b69addc7c4f0439bd62e127d8482b..5d223959778a7898b6abc2ae5822f17635952e04 100644 (file)
@@ -628,7 +628,7 @@ static int w100fb_resume(struct platform_device *dev)
 #endif
 
 
-int __init w100fb_probe(struct platform_device *pdev)
+int __devinit w100fb_probe(struct platform_device *pdev)
 {
        int err = -EIO;
        struct w100fb_mach_info *inf;