powerpc/powernv: Reorder OPAL subsystem initialisation
authorAlistair Popple <alistair@popple.id.au>
Fri, 15 May 2015 04:06:36 +0000 (14:06 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 22 May 2015 05:14:37 +0000 (15:14 +1000)
Most of the OPAL subsystems are always compiled in for PowerNV and
many of them need to be initialised before or after other OPAL
subsystems. Rather than trying to control this ordering through
machine initcalls it is clearer and easier to control initialisation
order with explicit calls in opal_init.

Signed-off-by: Alistair Popple <alistair@popple.id.au>
Cc: Mahesh Jagannath Salgaonkar <mahesh@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/include/asm/opal.h
arch/powerpc/platforms/powernv/opal-async.c
arch/powerpc/platforms/powernv/opal-hmi.c
arch/powerpc/platforms/powernv/opal-memory-errors.c
arch/powerpc/platforms/powernv/opal-sensor.c
arch/powerpc/platforms/powernv/opal.c

index 9a4781357fa6d1fdfbf231df7701b4568d807cf2..dcdf83c8625650b003ab910232431f64883694e5 100644 (file)
@@ -240,6 +240,9 @@ extern int opal_elog_init(void);
 extern void opal_platform_dump_init(void);
 extern void opal_sys_param_init(void);
 extern void opal_msglog_init(void);
+extern int opal_async_comp_init(void);
+extern int opal_sensor_init(void);
+extern int opal_hmi_handler_init(void);
 
 extern int opal_machine_check(struct pt_regs *regs);
 extern bool opal_mce_check_early_recovery(struct pt_regs *regs);
index 693b6cdac691b63057890e6b1152f87de5bf4b13..bdc8c0c71d156483619f17db2f81e50722c0be7c 100644 (file)
@@ -151,7 +151,7 @@ static struct notifier_block opal_async_comp_nb = {
                .priority       = 0,
 };
 
-static int __init opal_async_comp_init(void)
+int __init opal_async_comp_init(void)
 {
        struct device_node *opal_node;
        const __be32 *async;
@@ -205,4 +205,3 @@ out_opal_node:
 out:
        return err;
 }
-machine_subsys_initcall(powernv, opal_async_comp_init);
index b322bfb51343f65fdfe76d265cdcb76928011d21..a8f49d380449bf172a9f9361389b9beae52bc2e2 100644 (file)
@@ -170,7 +170,7 @@ static struct notifier_block opal_hmi_handler_nb = {
        .priority       = 0,
 };
 
-static int __init opal_hmi_handler_init(void)
+int __init opal_hmi_handler_init(void)
 {
        int ret;
 
@@ -186,4 +186,3 @@ static int __init opal_hmi_handler_init(void)
        }
        return 0;
 }
-machine_subsys_initcall(powernv, opal_hmi_handler_init);
index 43db2136dbff8f67101d085b8e5ecef7f75dacdb..00a29432be39fb60f6209a625c98ee8b54504bb0 100644 (file)
@@ -144,4 +144,4 @@ static int __init opal_mem_err_init(void)
        }
        return 0;
 }
-machine_subsys_initcall(powernv, opal_mem_err_init);
+machine_device_initcall(powernv, opal_mem_err_init);
index 655250499d18cd84e59a8217d5f102ffd15ddab0..a06059df9239202d660a5f7579034b715f9ee18a 100644 (file)
@@ -77,7 +77,7 @@ out:
 }
 EXPORT_SYMBOL_GPL(opal_get_sensor_data);
 
-static __init int opal_sensor_init(void)
+int __init opal_sensor_init(void)
 {
        struct platform_device *pdev;
        struct device_node *sensor;
@@ -93,4 +93,3 @@ static __init int opal_sensor_init(void)
 
        return PTR_ERR_OR_ZERO(pdev);
 }
-machine_subsys_initcall(powernv, opal_sensor_init);
index 2241565b0739ff3bc6dc84f9bc6c63c70edf8b8c..eb3decc67c4310420dc2aa3482ca3941a4258fc3 100644 (file)
@@ -393,7 +393,6 @@ static int __init opal_message_init(void)
        }
        return 0;
 }
-machine_early_initcall(powernv, opal_message_init);
 
 int opal_get_chars(uint32_t vtermno, char *buf, int count)
 {
@@ -807,6 +806,18 @@ static int __init opal_init(void)
                of_node_put(consoles);
        }
 
+       /* Initialise OPAL messaging system */
+       opal_message_init();
+
+       /* Initialise OPAL asynchronous completion interface */
+       opal_async_comp_init();
+
+       /* Initialise OPAL sensor interface */
+       opal_sensor_init();
+
+       /* Initialise OPAL hypervisor maintainence interrupt handling */
+       opal_hmi_handler_init();
+
        /* Create i2c platform devices */
        opal_i2c_create_devs();