xref: /linux/drivers/firmware/arm_scmi/quirks.h (revision 297d9111e9fcf47dd1dcc6f79bba915f35378d01)
1487c407dSCristian Marussi /* SPDX-License-Identifier: GPL-2.0 */
2487c407dSCristian Marussi /*
3487c407dSCristian Marussi  * System Control and Management Interface (SCMI) Message Protocol Quirks
4487c407dSCristian Marussi  *
5487c407dSCristian Marussi  * Copyright (C) 2025 ARM Ltd.
6487c407dSCristian Marussi  */
7487c407dSCristian Marussi #ifndef _SCMI_QUIRKS_H
8487c407dSCristian Marussi #define _SCMI_QUIRKS_H
9487c407dSCristian Marussi 
10487c407dSCristian Marussi #include <linux/static_key.h>
11487c407dSCristian Marussi #include <linux/types.h>
12487c407dSCristian Marussi 
13487c407dSCristian Marussi #ifdef CONFIG_ARM_SCMI_QUIRKS
14487c407dSCristian Marussi 
15487c407dSCristian Marussi #define DECLARE_SCMI_QUIRK(_qn)						\
16487c407dSCristian Marussi 	DECLARE_STATIC_KEY_FALSE(scmi_quirk_ ## _qn)
17487c407dSCristian Marussi 
18487c407dSCristian Marussi /*
19487c407dSCristian Marussi  * A helper to associate the actual code snippet to use as a quirk
20487c407dSCristian Marussi  * named as _qn.
21487c407dSCristian Marussi  */
22487c407dSCristian Marussi #define SCMI_QUIRK(_qn, _blk)						\
23487c407dSCristian Marussi 	do {								\
24487c407dSCristian Marussi 		if (static_branch_unlikely(&(scmi_quirk_ ## _qn)))	\
25487c407dSCristian Marussi 			(_blk);						\
26487c407dSCristian Marussi 	} while (0)
27487c407dSCristian Marussi 
28487c407dSCristian Marussi void scmi_quirks_initialize(void);
29487c407dSCristian Marussi void scmi_quirks_enable(struct device *dev, const char *vend,
30487c407dSCristian Marussi 			const char *subv, const u32 impl);
31487c407dSCristian Marussi 
32487c407dSCristian Marussi #else
33487c407dSCristian Marussi 
34487c407dSCristian Marussi #define DECLARE_SCMI_QUIRK(_qn)
35487c407dSCristian Marussi /* Force quirks compilation even when SCMI Quirks are disabled */
36487c407dSCristian Marussi #define SCMI_QUIRK(_qn, _blk)						\
37487c407dSCristian Marussi 	do {								\
38487c407dSCristian Marussi 		if (0)							\
39487c407dSCristian Marussi 			(_blk);						\
40487c407dSCristian Marussi 	} while (0)
41487c407dSCristian Marussi 
scmi_quirks_initialize(void)42487c407dSCristian Marussi static inline void scmi_quirks_initialize(void) { }
scmi_quirks_enable(struct device * dev,const char * vend,const char * sub_vend,const u32 impl)43487c407dSCristian Marussi static inline void scmi_quirks_enable(struct device *dev, const char *vend,
44487c407dSCristian Marussi 				      const char *sub_vend, const u32 impl) { }
45487c407dSCristian Marussi 
46487c407dSCristian Marussi #endif /* CONFIG_ARM_SCMI_QUIRKS */
47487c407dSCristian Marussi 
487b487beaSCristian Marussi /* Quirk delarations */
497b487beaSCristian Marussi DECLARE_SCMI_QUIRK(clock_rates_triplet_out_of_spec);
50*397f802dSJohan Hovold DECLARE_SCMI_QUIRK(perf_level_get_fc_force);
517b487beaSCristian Marussi 
52487c407dSCristian Marussi #endif /* _SCMI_QUIRKS_H */
53