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