1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * System Control and Management Interface (SCMI) Message Protocol Quirks
4  *
5  * Copyright (C) 2025 ARM Ltd.
6  */
7 #ifndef _SCMI_QUIRKS_H
8 #define _SCMI_QUIRKS_H
9 
10 #include <linux/static_key.h>
11 #include <linux/types.h>
12 
13 #ifdef CONFIG_ARM_SCMI_QUIRKS
14 
15 #define DECLARE_SCMI_QUIRK(_qn)						\
16 	DECLARE_STATIC_KEY_FALSE(scmi_quirk_ ## _qn)
17 
18 /*
19  * A helper to associate the actual code snippet to use as a quirk
20  * named as _qn.
21  */
22 #define SCMI_QUIRK(_qn, _blk)						\
23 	do {								\
24 		if (static_branch_unlikely(&(scmi_quirk_ ## _qn)))	\
25 			(_blk);						\
26 	} while (0)
27 
28 void scmi_quirks_initialize(void);
29 void scmi_quirks_enable(struct device *dev, const char *vend,
30 			const char *subv, const u32 impl);
31 
32 #else
33 
34 #define DECLARE_SCMI_QUIRK(_qn)
35 /* Force quirks compilation even when SCMI Quirks are disabled */
36 #define SCMI_QUIRK(_qn, _blk)						\
37 	do {								\
38 		if (0)							\
39 			(_blk);						\
40 	} while (0)
41 
42 static inline void scmi_quirks_initialize(void) { }
43 static inline void scmi_quirks_enable(struct device *dev, const char *vend,
44 				      const char *sub_vend, const u32 impl) { }
45 
46 #endif /* CONFIG_ARM_SCMI_QUIRKS */
47 
48 /* Quirk delarations */
49 DECLARE_SCMI_QUIRK(clock_rates_triplet_out_of_spec);
50 DECLARE_SCMI_QUIRK(perf_level_get_fc_force);
51 
52 #endif /* _SCMI_QUIRKS_H */
53