]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
firmware: arm_scmi: Move scmi protocols registration into the driver
authorSudeep Holla <sudeep.holla@arm.com>
Mon, 7 Sep 2020 11:06:01 +0000 (12:06 +0100)
committerSudeep Holla <sudeep.holla@arm.com>
Mon, 14 Sep 2020 06:30:55 +0000 (07:30 +0100)
In preparation to enable building SCMI as a single module, let us move
the SCMI protocol registration call into the driver. This enables us
to also add unregistration of the SCMI protocols.

The main reason for this is to keep it simple instead of maintaining
it as separate modules and dealing with all possible initcall races
and deferred probe handling. We can move it as separate modules if
needed in future.

Link: https://lore.kernel.org/r/20200907195046.56615-4-sudeep.holla@arm.com
Tested-by: Cristian Marussi <cristian.marussi@arm.com>
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
drivers/firmware/arm_scmi/clock.c
drivers/firmware/arm_scmi/common.h
drivers/firmware/arm_scmi/driver.c
drivers/firmware/arm_scmi/perf.c
drivers/firmware/arm_scmi/power.c
drivers/firmware/arm_scmi/reset.c
drivers/firmware/arm_scmi/sensors.c
drivers/firmware/arm_scmi/system.c

index a3b90be28009c4bb25ac51aac06a80ce0239b9c6..c1cfe3ee3d55a826ff1f97ca8156873a61c212ca 100644 (file)
@@ -364,9 +364,4 @@ static int scmi_clock_protocol_init(struct scmi_handle *handle)
        return 0;
 }
 
-static int __init scmi_clock_init(void)
-{
-       return scmi_protocol_register(SCMI_PROTOCOL_CLOCK,
-                                     &scmi_clock_protocol_init);
-}
-subsys_initcall(scmi_clock_init);
+DEFINE_SCMI_PROTOCOL_REGISTER_UNREGISTER(SCMI_PROTOCOL_CLOCK, clock)
index a940c6cf1e512ce9d0c6f005b923ada60029a0a5..37fb583f1bf5f9e1362b121ca6eb9796345009fc 100644 (file)
@@ -159,6 +159,27 @@ int scmi_base_protocol_init(struct scmi_handle *h);
 int __init scmi_bus_init(void);
 void __exit scmi_bus_exit(void);
 
+#define DECLARE_SCMI_REGISTER_UNREGISTER(func)         \
+       int __init scmi_##func##_register(void);        \
+       void __exit scmi_##func##_unregister(void)
+DECLARE_SCMI_REGISTER_UNREGISTER(clock);
+DECLARE_SCMI_REGISTER_UNREGISTER(perf);
+DECLARE_SCMI_REGISTER_UNREGISTER(power);
+DECLARE_SCMI_REGISTER_UNREGISTER(reset);
+DECLARE_SCMI_REGISTER_UNREGISTER(sensors);
+DECLARE_SCMI_REGISTER_UNREGISTER(system);
+
+#define DEFINE_SCMI_PROTOCOL_REGISTER_UNREGISTER(id, name) \
+int __init scmi_##name##_register(void) \
+{ \
+       return scmi_protocol_register((id), &scmi_##name##_protocol_init); \
+} \
+\
+void __exit scmi_##name##_unregister(void) \
+{ \
+       scmi_protocol_unregister((id)); \
+}
+
 /* SCMI Transport */
 /**
  * struct scmi_chan_info - Structure representing a SCMI channel information
index 8f60c6a97cc3c4f1d409728182e0c1056a269c68..c5dea87edf8f2c61b6be519232434be9a91e6f50 100644 (file)
@@ -933,14 +933,28 @@ static int __init scmi_driver_init(void)
 {
        scmi_bus_init();
 
+       scmi_clock_register();
+       scmi_perf_register();
+       scmi_power_register();
+       scmi_reset_register();
+       scmi_sensors_register();
+       scmi_system_register();
+
        return platform_driver_register(&scmi_driver);
 }
-module_init(scmi_driver_init);
+subsys_initcall(scmi_driver_init);
 
 static void __exit scmi_driver_exit(void)
 {
        scmi_bus_exit();
 
+       scmi_clock_unregister();
+       scmi_perf_unregister();
+       scmi_power_unregister();
+       scmi_reset_unregister();
+       scmi_sensors_unregister();
+       scmi_system_unregister();
+
        platform_driver_unregister(&scmi_driver);
 }
 module_exit(scmi_driver_exit);
index a3e7b1bfab00fb6ad9ecc9fb51aae4daee182dd3..ed475b40bd083a0d20424977cfa223633e1199f0 100644 (file)
@@ -890,9 +890,4 @@ static int scmi_perf_protocol_init(struct scmi_handle *handle)
        return 0;
 }
 
-static int __init scmi_perf_init(void)
-{
-       return scmi_protocol_register(SCMI_PROTOCOL_PERF,
-                                     &scmi_perf_protocol_init);
-}
-subsys_initcall(scmi_perf_init);
+DEFINE_SCMI_PROTOCOL_REGISTER_UNREGISTER(SCMI_PROTOCOL_PERF, perf)
index 32bcf5821ea975c9f37e32dfe0c399e10a5b120d..1f37258e9beec6b59796d7eb25643925903b639d 100644 (file)
@@ -301,9 +301,4 @@ static int scmi_power_protocol_init(struct scmi_handle *handle)
        return 0;
 }
 
-static int __init scmi_power_init(void)
-{
-       return scmi_protocol_register(SCMI_PROTOCOL_POWER,
-                                     &scmi_power_protocol_init);
-}
-subsys_initcall(scmi_power_init);
+DEFINE_SCMI_PROTOCOL_REGISTER_UNREGISTER(SCMI_PROTOCOL_POWER, power)
index 4e2dc5fc43d93da4782fd3d642a1af27a1386468..f063cfe17e0299b04185b47a070c18a779227a4b 100644 (file)
@@ -313,9 +313,4 @@ static int scmi_reset_protocol_init(struct scmi_handle *handle)
        return 0;
 }
 
-static int __init scmi_reset_init(void)
-{
-       return scmi_protocol_register(SCMI_PROTOCOL_RESET,
-                                     &scmi_reset_protocol_init);
-}
-subsys_initcall(scmi_reset_init);
+DEFINE_SCMI_PROTOCOL_REGISTER_UNREGISTER(SCMI_PROTOCOL_RESET, reset)
index 7d83680198de0b8a068e1430bde33db0de939020..9703cf6356a0452c3af99d608c6ba52febd6c901 100644 (file)
@@ -365,9 +365,4 @@ static int scmi_sensors_protocol_init(struct scmi_handle *handle)
        return 0;
 }
 
-static int __init scmi_sensors_init(void)
-{
-       return scmi_protocol_register(SCMI_PROTOCOL_SENSOR,
-                                     &scmi_sensors_protocol_init);
-}
-subsys_initcall(scmi_sensors_init);
+DEFINE_SCMI_PROTOCOL_REGISTER_UNREGISTER(SCMI_PROTOCOL_SENSOR, sensors)
index aa1e74f066a06b39399dac4b50c5436364996205..283e12d5f24b7364a4c08103a40c2c46ac0f0065 100644 (file)
@@ -128,9 +128,4 @@ static int scmi_system_protocol_init(struct scmi_handle *handle)
        return 0;
 }
 
-static int __init scmi_system_init(void)
-{
-       return scmi_protocol_register(SCMI_PROTOCOL_SYSTEM,
-                                     &scmi_system_protocol_init);
-}
-subsys_initcall(scmi_system_init);
+DEFINE_SCMI_PROTOCOL_REGISTER_UNREGISTER(SCMI_PROTOCOL_SYSTEM, system)