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