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
scmi_quirks_initialize(void)42 static inline void scmi_quirks_initialize(void) { }
scmi_quirks_enable(struct device * dev,const char * vend,const char * sub_vend,const u32 impl)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