rapidio: modify subsystem and driver initialization sequence
authorAlexandre Bounine <alexandre.bounine@idt.com>
Wed, 23 Mar 2011 23:43:04 +0000 (16:43 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 24 Mar 2011 02:46:42 +0000 (19:46 -0700)
Subsystem initialization sequence modified to support presence of multiple
RapidIO controllers in the system.  The new sequence is compatible with
initialization of PCI devices.

Signed-off-by: Alexandre Bounine <alexandre.bounine@idt.com>
Cc: Kumar Gala <galak@kernel.crashing.org>
Cc: Matt Porter <mporter@kernel.crashing.org>
Cc: Li Yang <leoli@freescale.com>
Cc: Thomas Moll <thomas.moll@sysgo.com>
Cc: Micha Nelissen <micha@neli.hopto.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
arch/powerpc/sysdev/fsl_rio.c
drivers/net/rionet.c
drivers/rapidio/rio.c
include/linux/rio.h

index f95cb56..576b806 100644 (file)
@@ -1574,18 +1574,10 @@ err_ops:
  */
 static int __devinit fsl_of_rio_rpn_probe(struct platform_device *dev)
 {
-       int rc;
        printk(KERN_INFO "Setting up RapidIO peer-to-peer network %s\n",
                        dev->dev.of_node->full_name);
 
-       rc = fsl_rio_setup(dev);
-       if (rc)
-               goto out;
-
-       /* Enumerate all registered ports */
-       rc = rio_init_mports();
-out:
-       return rc;
+       return fsl_rio_setup(dev);
 };
 
 static const struct of_device_id fsl_of_rio_rpn_ids[] = {
index 678e577..26afbaa 100644 (file)
@@ -571,5 +571,5 @@ static void __exit rionet_exit(void)
        rio_unregister_driver(&rionet_driver);
 }
 
-module_init(rionet_init);
+late_initcall(rionet_init);
 module_exit(rionet_exit);
index d520dba..f861b72 100644 (file)
@@ -1134,8 +1134,6 @@ static int __devinit rio_init(void)
        return 0;
 }
 
-device_initcall(rio_init);
-
 int __devinit rio_init_mports(void)
 {
        int rc = 0;
@@ -1158,10 +1156,14 @@ int __devinit rio_init_mports(void)
                        rio_disc_mport(port);
        }
 
+       rio_init();
+
       out:
        return rc;
 }
 
+device_initcall_sync(rio_init_mports);
+
 void rio_register_mport(struct rio_mport *port)
 {
        list_add_tail(&port->node, &rio_mports);
index efed116..b6bcb16 100644 (file)
@@ -395,7 +395,6 @@ union rio_pw_msg {
 };
 
 /* Architecture and hardware-specific functions */
-extern int rio_init_mports(void);
 extern void rio_register_mport(struct rio_mport *);
 extern int rio_open_inb_mbox(struct rio_mport *, void *, int, int);
 extern void rio_close_inb_mbox(struct rio_mport *, int);