xref: /linux/drivers/clk/clk-scmi.h (revision 502d45774af09f1c681c754c4b7cdfb5d7f72fd9)
1a73edd3eSPeng Fan /* SPDX-License-Identifier: GPL-2.0 */
2a73edd3eSPeng Fan /*
3a73edd3eSPeng Fan  *  Copyright 2025 NXP
4a73edd3eSPeng Fan  */
5a73edd3eSPeng Fan 
6a73edd3eSPeng Fan #ifndef __SCMI_CLK_H
7a73edd3eSPeng Fan #define __SCMI_CLK_H
8a73edd3eSPeng Fan 
9a73edd3eSPeng Fan #include <linux/bits.h>
10*77369b1eSPeng Fan #include <linux/clk-provider.h>
11a73edd3eSPeng Fan #include <linux/scmi_protocol.h>
12a73edd3eSPeng Fan #include <linux/types.h>
13a73edd3eSPeng Fan 
14a73edd3eSPeng Fan #define NOT_ATOMIC	false
15a73edd3eSPeng Fan #define ATOMIC		true
16a73edd3eSPeng Fan 
17a73edd3eSPeng Fan enum scmi_clk_feats {
18a73edd3eSPeng Fan 	SCMI_CLK_ATOMIC_SUPPORTED,
19a73edd3eSPeng Fan 	SCMI_CLK_STATE_CTRL_SUPPORTED,
20a73edd3eSPeng Fan 	SCMI_CLK_RATE_CTRL_SUPPORTED,
21a73edd3eSPeng Fan 	SCMI_CLK_PARENT_CTRL_SUPPORTED,
22a73edd3eSPeng Fan 	SCMI_CLK_DUTY_CYCLE_SUPPORTED,
23*77369b1eSPeng Fan 	SCMI_CLK_EXT_OEM_SSC_SUPPORTED,
24a73edd3eSPeng Fan 	SCMI_CLK_FEATS_COUNT
25a73edd3eSPeng Fan };
26a73edd3eSPeng Fan 
27a73edd3eSPeng Fan #define SCMI_MAX_CLK_OPS	BIT(SCMI_CLK_FEATS_COUNT)
28a73edd3eSPeng Fan 
29a73edd3eSPeng Fan struct scmi_clk {
30a73edd3eSPeng Fan 	u32 id;
31a73edd3eSPeng Fan 	struct device *dev;
32a73edd3eSPeng Fan 	struct clk_hw hw;
33a73edd3eSPeng Fan 	const struct scmi_clock_info *info;
34a73edd3eSPeng Fan 	const struct scmi_protocol_handle *ph;
35a73edd3eSPeng Fan 	struct clk_parent_data *parent_data;
36a73edd3eSPeng Fan };
37a73edd3eSPeng Fan 
38a73edd3eSPeng Fan #define to_scmi_clk(clk) container_of(clk, struct scmi_clk, hw)
39a73edd3eSPeng Fan 
40a73edd3eSPeng Fan extern const struct scmi_clk_proto_ops *scmi_proto_clk_ops;
41a73edd3eSPeng Fan 
42*77369b1eSPeng Fan struct scmi_clk_oem {
43*77369b1eSPeng Fan 	int (*query_ext_oem_feats)(const struct scmi_protocol_handle *ph,
44*77369b1eSPeng Fan 				   u32 id, unsigned int *feats_key);
45*77369b1eSPeng Fan 	int (*set_spread_spectrum)(struct clk_hw *hw,
46*77369b1eSPeng Fan 				   const struct clk_spread_spectrum *ss_conf);
47*77369b1eSPeng Fan };
48*77369b1eSPeng Fan 
49*77369b1eSPeng Fan int scmi_clk_oem_init(struct scmi_device *dev);
50*77369b1eSPeng Fan 
51a73edd3eSPeng Fan #endif
52