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