1 /*
2  * Copyright 2024 NXP
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 /**
8  * @file
9  * @brief SCMI clock protocol helpers
10  */
11 
12 #ifndef _INCLUDE_ZEPHYR_DRIVERS_FIRMWARE_SCMI_CLK_H_
13 #define _INCLUDE_ZEPHYR_DRIVERS_FIRMWARE_SCMI_CLK_H_
14 
15 #include <zephyr/drivers/firmware/scmi/protocol.h>
16 
17 #define SCMI_CLK_CONFIG_DISABLE_ENABLE_MASK GENMASK(1, 0)
18 #define SCMI_CLK_CONFIG_ENABLE_DISABLE(x)\
19 	((uint32_t)(x) & SCMI_CLK_CONFIG_DISABLE_ENABLE_MASK)
20 
21 #define SCMI_CLK_ATTRIBUTES_CLK_NUM(x) ((x) & GENMASK(15, 0))
22 
23 #define SCMI_CLK_RATE_SET_FLAGS_ASYNC                BIT(0)
24 #define SCMI_CLK_RATE_SET_FLAGS_IGNORE_DELEAYED_RESP BIT(1)
25 #define SCMI_CLK_RATE_SET_FLAGS_ROUNDS_UP_DOWN       BIT(2)
26 #define SCMI_CLK_RATE_SET_FLAGS_ROUNDS_AUTO          BIT(3)
27 
28 /**
29  * @struct scmi_clock_config
30  *
31  * @brief Describes the parameters for the CLOCK_CONFIG_SET
32  * command
33  */
34 struct scmi_clock_config {
35 	uint32_t clk_id;
36 	uint32_t attributes;
37 	uint32_t extended_cfg_val;
38 };
39 
40 /**
41  * @struct scmi_clock_rate_config
42  *
43  * @brief Describes the parameters for the CLOCK_RATE_SET
44  * command
45  */
46 struct scmi_clock_rate_config {
47 	uint32_t flags;
48 	uint32_t clk_id;
49 	uint32_t rate[2];
50 };
51 
52 /**
53  * @brief Clock protocol command message IDs
54  */
55 enum scmi_clock_message {
56 	SCMI_CLK_MSG_PROTOCOL_VERSION = 0x0,
57 	SCMI_CLK_MSG_PROTOCOL_ATTRIBUTES = 0x1,
58 	SCMI_CLK_MSG_PROTOCOL_MESSAGE_ATTRIBUTES = 0x2,
59 	SCMI_CLK_MSG_CLOCK_ATTRIBUTES = 0x3,
60 	SCMI_CLK_MSG_CLOCK_DESCRIBE_RATES = 0x4,
61 	SCMI_CLK_MSG_CLOCK_RATE_SET = 0x5,
62 	SCMI_CLK_MSG_CLOCK_RATE_GET = 0x6,
63 	SCMI_CLK_MSG_CLOCK_CONFIG_SET = 0x7,
64 	SCMI_CLK_MSG_CLOCK_NAME_GET = 0x8,
65 	SCMI_CLK_MSG_CLOCK_RATE_NOTIFY = 0x9,
66 	SCMI_CLK_MSG_CLOCK_RATE_CHANGE_REQUESTED_NOTIFY = 0xa,
67 	SCMI_CLK_MSG_CLOCK_CONFIG_GET = 0xb,
68 	SCMI_CLK_MSG_CLOCK_POSSIBLE_PARENTS_GET = 0xc,
69 	SCMI_CLK_MSG_CLOCK_PARENT_SET = 0xd,
70 	SCMI_CLK_MSG_CLOCK_PARENT_GET = 0xe,
71 	SCMI_CLK_MSG_CLOCK_GET_PERMISSIONS = 0xf,
72 	SCMI_CLK_MSG_NEGOTIATE_PROTOCOL_VERSION = 0x10,
73 };
74 
75 /**
76  * @brief Send the PROTOCOL_ATTRIBUTES command and get its reply
77  *
78  * @param proto pointer to SCMI clock protocol data
79  * @param attributes pointer to attributes to be set via
80  * this command
81  *
82  * @retval 0 if successful
83  * @retval negative errno if failure
84  */
85 int scmi_clock_protocol_attributes(struct scmi_protocol *proto,
86 				   uint32_t *attributes);
87 
88 /**
89  * @brief Send the CLOCK_CONFIG_SET command and get its reply
90  *
91  * @param proto pointer to SCMI clock protocol data
92  * @param cfg pointer to structure containing configuration
93  * to be set
94  *
95  * @retval 0 if successful
96  * @retval negative errno if failure
97  */
98 int scmi_clock_config_set(struct scmi_protocol *proto,
99 			  struct scmi_clock_config *cfg);
100 /**
101  * @brief Query the rate of a clock
102  *
103  * @param proto pointer to SCMI clock protocol data
104  * @param clk_id ID of the clock for which the query is done
105  * @param rate pointer to rate to be set via this command
106  *
107  * @retval 0 if successful
108  * @retval negative errno if failure
109  */
110 int scmi_clock_rate_get(struct scmi_protocol *proto,
111 			uint32_t clk_id, uint32_t *rate);
112 
113 /**
114  * @brief Send the CLOCK_RATE_SET command and get its reply
115  *
116  * @param proto pointer to SCMI clock protocol data
117  * @param cfg pointer to structure containing configuration
118  * to be set
119  *
120  * @retval 0 if successful
121  * @retval negative errno if failure
122  */
123 int scmi_clock_rate_set(struct scmi_protocol *proto, struct scmi_clock_rate_config *cfg);
124 
125 /**
126  * @brief Query the parent of a clock
127  *
128  * @param proto pointer to SCMI clock protocol data
129  * @param clk_id ID of the clock for which the query is done
130  * @param parent_id pointer to be set via this command
131  *
132  * @retval 0 if successful
133  * @retval negative errno if failure
134  */
135 int scmi_clock_parent_get(struct scmi_protocol *proto, uint32_t clk_id, uint32_t *parent_id);
136 
137 /**
138  * @brief Send the CLOCK_PARENT_SET command and get its reply
139  *
140  * @param proto pointer to SCMI clock protocol data
141  * @param clk_id ID of the clock for which the query is done
142  * @param parent_id to be set via this command
143  * to be set
144  *
145  * @retval 0 if successful
146  * @retval negative errno if failure
147  */
148 int scmi_clock_parent_set(struct scmi_protocol *proto, uint32_t clk_id, uint32_t parent_id);
149 
150 #endif /* _INCLUDE_ZEPHYR_DRIVERS_FIRMWARE_SCMI_CLK_H_ */
151