Skip to content

Commit 1eaf18e

Browse files
committed
firmware: arm_scmi: Move scmi protocols registration into the driver
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>
1 parent 5a2f0a0 commit 1eaf18e

8 files changed

Lines changed: 42 additions & 37 deletions

File tree

drivers/firmware/arm_scmi/clock.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -364,9 +364,4 @@ static int scmi_clock_protocol_init(struct scmi_handle *handle)
364364
return 0;
365365
}
366366

367-
static int __init scmi_clock_init(void)
368-
{
369-
return scmi_protocol_register(SCMI_PROTOCOL_CLOCK,
370-
&scmi_clock_protocol_init);
371-
}
372-
subsys_initcall(scmi_clock_init);
367+
DEFINE_SCMI_PROTOCOL_REGISTER_UNREGISTER(SCMI_PROTOCOL_CLOCK, clock)

drivers/firmware/arm_scmi/common.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,27 @@ int scmi_base_protocol_init(struct scmi_handle *h);
159159
int __init scmi_bus_init(void);
160160
void __exit scmi_bus_exit(void);
161161

162+
#define DECLARE_SCMI_REGISTER_UNREGISTER(func) \
163+
int __init scmi_##func##_register(void); \
164+
void __exit scmi_##func##_unregister(void)
165+
DECLARE_SCMI_REGISTER_UNREGISTER(clock);
166+
DECLARE_SCMI_REGISTER_UNREGISTER(perf);
167+
DECLARE_SCMI_REGISTER_UNREGISTER(power);
168+
DECLARE_SCMI_REGISTER_UNREGISTER(reset);
169+
DECLARE_SCMI_REGISTER_UNREGISTER(sensors);
170+
DECLARE_SCMI_REGISTER_UNREGISTER(system);
171+
172+
#define DEFINE_SCMI_PROTOCOL_REGISTER_UNREGISTER(id, name) \
173+
int __init scmi_##name##_register(void) \
174+
{ \
175+
return scmi_protocol_register((id), &scmi_##name##_protocol_init); \
176+
} \
177+
\
178+
void __exit scmi_##name##_unregister(void) \
179+
{ \
180+
scmi_protocol_unregister((id)); \
181+
}
182+
162183
/* SCMI Transport */
163184
/**
164185
* struct scmi_chan_info - Structure representing a SCMI channel information

drivers/firmware/arm_scmi/driver.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -933,14 +933,28 @@ static int __init scmi_driver_init(void)
933933
{
934934
scmi_bus_init();
935935

936+
scmi_clock_register();
937+
scmi_perf_register();
938+
scmi_power_register();
939+
scmi_reset_register();
940+
scmi_sensors_register();
941+
scmi_system_register();
942+
936943
return platform_driver_register(&scmi_driver);
937944
}
938-
module_init(scmi_driver_init);
945+
subsys_initcall(scmi_driver_init);
939946

940947
static void __exit scmi_driver_exit(void)
941948
{
942949
scmi_bus_exit();
943950

951+
scmi_clock_unregister();
952+
scmi_perf_unregister();
953+
scmi_power_unregister();
954+
scmi_reset_unregister();
955+
scmi_sensors_unregister();
956+
scmi_system_unregister();
957+
944958
platform_driver_unregister(&scmi_driver);
945959
}
946960
module_exit(scmi_driver_exit);

drivers/firmware/arm_scmi/perf.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -890,9 +890,4 @@ static int scmi_perf_protocol_init(struct scmi_handle *handle)
890890
return 0;
891891
}
892892

893-
static int __init scmi_perf_init(void)
894-
{
895-
return scmi_protocol_register(SCMI_PROTOCOL_PERF,
896-
&scmi_perf_protocol_init);
897-
}
898-
subsys_initcall(scmi_perf_init);
893+
DEFINE_SCMI_PROTOCOL_REGISTER_UNREGISTER(SCMI_PROTOCOL_PERF, perf)

drivers/firmware/arm_scmi/power.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -301,9 +301,4 @@ static int scmi_power_protocol_init(struct scmi_handle *handle)
301301
return 0;
302302
}
303303

304-
static int __init scmi_power_init(void)
305-
{
306-
return scmi_protocol_register(SCMI_PROTOCOL_POWER,
307-
&scmi_power_protocol_init);
308-
}
309-
subsys_initcall(scmi_power_init);
304+
DEFINE_SCMI_PROTOCOL_REGISTER_UNREGISTER(SCMI_PROTOCOL_POWER, power)

drivers/firmware/arm_scmi/reset.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -313,9 +313,4 @@ static int scmi_reset_protocol_init(struct scmi_handle *handle)
313313
return 0;
314314
}
315315

316-
static int __init scmi_reset_init(void)
317-
{
318-
return scmi_protocol_register(SCMI_PROTOCOL_RESET,
319-
&scmi_reset_protocol_init);
320-
}
321-
subsys_initcall(scmi_reset_init);
316+
DEFINE_SCMI_PROTOCOL_REGISTER_UNREGISTER(SCMI_PROTOCOL_RESET, reset)

drivers/firmware/arm_scmi/sensors.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -365,9 +365,4 @@ static int scmi_sensors_protocol_init(struct scmi_handle *handle)
365365
return 0;
366366
}
367367

368-
static int __init scmi_sensors_init(void)
369-
{
370-
return scmi_protocol_register(SCMI_PROTOCOL_SENSOR,
371-
&scmi_sensors_protocol_init);
372-
}
373-
subsys_initcall(scmi_sensors_init);
368+
DEFINE_SCMI_PROTOCOL_REGISTER_UNREGISTER(SCMI_PROTOCOL_SENSOR, sensors)

drivers/firmware/arm_scmi/system.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,4 @@ static int scmi_system_protocol_init(struct scmi_handle *handle)
128128
return 0;
129129
}
130130

131-
static int __init scmi_system_init(void)
132-
{
133-
return scmi_protocol_register(SCMI_PROTOCOL_SYSTEM,
134-
&scmi_system_protocol_init);
135-
}
136-
subsys_initcall(scmi_system_init);
131+
DEFINE_SCMI_PROTOCOL_REGISTER_UNREGISTER(SCMI_PROTOCOL_SYSTEM, system)

0 commit comments

Comments
 (0)