18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (c) 2013, The Linux Foundation. All rights reserved.
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#include <linux/kernel.h>
78c2ecf20Sopenharmony_ci#include <linux/bitops.h>
88c2ecf20Sopenharmony_ci#include <linux/err.h>
98c2ecf20Sopenharmony_ci#include <linux/bug.h>
108c2ecf20Sopenharmony_ci#include <linux/delay.h>
118c2ecf20Sopenharmony_ci#include <linux/export.h>
128c2ecf20Sopenharmony_ci#include <linux/clk-provider.h>
138c2ecf20Sopenharmony_ci#include <linux/regmap.h>
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#include <asm/div64.h>
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci#include "clk-pll.h"
188c2ecf20Sopenharmony_ci#include "common.h"
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci#define PLL_OUTCTRL		BIT(0)
218c2ecf20Sopenharmony_ci#define PLL_BYPASSNL		BIT(1)
228c2ecf20Sopenharmony_ci#define PLL_RESET_N		BIT(2)
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_cistatic int clk_pll_enable(struct clk_hw *hw)
258c2ecf20Sopenharmony_ci{
268c2ecf20Sopenharmony_ci	struct clk_pll *pll = to_clk_pll(hw);
278c2ecf20Sopenharmony_ci	int ret;
288c2ecf20Sopenharmony_ci	u32 mask, val;
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci	mask = PLL_OUTCTRL | PLL_RESET_N | PLL_BYPASSNL;
318c2ecf20Sopenharmony_ci	ret = regmap_read(pll->clkr.regmap, pll->mode_reg, &val);
328c2ecf20Sopenharmony_ci	if (ret)
338c2ecf20Sopenharmony_ci		return ret;
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci	/* Skip if already enabled or in FSM mode */
368c2ecf20Sopenharmony_ci	if ((val & mask) == mask || val & PLL_VOTE_FSM_ENA)
378c2ecf20Sopenharmony_ci		return 0;
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci	/* Disable PLL bypass mode. */
408c2ecf20Sopenharmony_ci	ret = regmap_update_bits(pll->clkr.regmap, pll->mode_reg, PLL_BYPASSNL,
418c2ecf20Sopenharmony_ci				 PLL_BYPASSNL);
428c2ecf20Sopenharmony_ci	if (ret)
438c2ecf20Sopenharmony_ci		return ret;
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci	/*
468c2ecf20Sopenharmony_ci	 * H/W requires a 5us delay between disabling the bypass and
478c2ecf20Sopenharmony_ci	 * de-asserting the reset. Delay 10us just to be safe.
488c2ecf20Sopenharmony_ci	 */
498c2ecf20Sopenharmony_ci	udelay(10);
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci	/* De-assert active-low PLL reset. */
528c2ecf20Sopenharmony_ci	ret = regmap_update_bits(pll->clkr.regmap, pll->mode_reg, PLL_RESET_N,
538c2ecf20Sopenharmony_ci				 PLL_RESET_N);
548c2ecf20Sopenharmony_ci	if (ret)
558c2ecf20Sopenharmony_ci		return ret;
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci	/* Wait until PLL is locked. */
588c2ecf20Sopenharmony_ci	udelay(50);
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ci	/* Enable PLL output. */
618c2ecf20Sopenharmony_ci	return regmap_update_bits(pll->clkr.regmap, pll->mode_reg, PLL_OUTCTRL,
628c2ecf20Sopenharmony_ci				 PLL_OUTCTRL);
638c2ecf20Sopenharmony_ci}
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_cistatic void clk_pll_disable(struct clk_hw *hw)
668c2ecf20Sopenharmony_ci{
678c2ecf20Sopenharmony_ci	struct clk_pll *pll = to_clk_pll(hw);
688c2ecf20Sopenharmony_ci	u32 mask;
698c2ecf20Sopenharmony_ci	u32 val;
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_ci	regmap_read(pll->clkr.regmap, pll->mode_reg, &val);
728c2ecf20Sopenharmony_ci	/* Skip if in FSM mode */
738c2ecf20Sopenharmony_ci	if (val & PLL_VOTE_FSM_ENA)
748c2ecf20Sopenharmony_ci		return;
758c2ecf20Sopenharmony_ci	mask = PLL_OUTCTRL | PLL_RESET_N | PLL_BYPASSNL;
768c2ecf20Sopenharmony_ci	regmap_update_bits(pll->clkr.regmap, pll->mode_reg, mask, 0);
778c2ecf20Sopenharmony_ci}
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_cistatic unsigned long
808c2ecf20Sopenharmony_ciclk_pll_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
818c2ecf20Sopenharmony_ci{
828c2ecf20Sopenharmony_ci	struct clk_pll *pll = to_clk_pll(hw);
838c2ecf20Sopenharmony_ci	u32 l, m, n, config;
848c2ecf20Sopenharmony_ci	unsigned long rate;
858c2ecf20Sopenharmony_ci	u64 tmp;
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_ci	regmap_read(pll->clkr.regmap, pll->l_reg, &l);
888c2ecf20Sopenharmony_ci	regmap_read(pll->clkr.regmap, pll->m_reg, &m);
898c2ecf20Sopenharmony_ci	regmap_read(pll->clkr.regmap, pll->n_reg, &n);
908c2ecf20Sopenharmony_ci
918c2ecf20Sopenharmony_ci	l &= 0x3ff;
928c2ecf20Sopenharmony_ci	m &= 0x7ffff;
938c2ecf20Sopenharmony_ci	n &= 0x7ffff;
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_ci	rate = parent_rate * l;
968c2ecf20Sopenharmony_ci	if (n) {
978c2ecf20Sopenharmony_ci		tmp = parent_rate;
988c2ecf20Sopenharmony_ci		tmp *= m;
998c2ecf20Sopenharmony_ci		do_div(tmp, n);
1008c2ecf20Sopenharmony_ci		rate += tmp;
1018c2ecf20Sopenharmony_ci	}
1028c2ecf20Sopenharmony_ci	if (pll->post_div_width) {
1038c2ecf20Sopenharmony_ci		regmap_read(pll->clkr.regmap, pll->config_reg, &config);
1048c2ecf20Sopenharmony_ci		config >>= pll->post_div_shift;
1058c2ecf20Sopenharmony_ci		config &= BIT(pll->post_div_width) - 1;
1068c2ecf20Sopenharmony_ci		rate /= config + 1;
1078c2ecf20Sopenharmony_ci	}
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_ci	return rate;
1108c2ecf20Sopenharmony_ci}
1118c2ecf20Sopenharmony_ci
1128c2ecf20Sopenharmony_cistatic const
1138c2ecf20Sopenharmony_cistruct pll_freq_tbl *find_freq(const struct pll_freq_tbl *f, unsigned long rate)
1148c2ecf20Sopenharmony_ci{
1158c2ecf20Sopenharmony_ci	if (!f)
1168c2ecf20Sopenharmony_ci		return NULL;
1178c2ecf20Sopenharmony_ci
1188c2ecf20Sopenharmony_ci	for (; f->freq; f++)
1198c2ecf20Sopenharmony_ci		if (rate <= f->freq)
1208c2ecf20Sopenharmony_ci			return f;
1218c2ecf20Sopenharmony_ci
1228c2ecf20Sopenharmony_ci	return NULL;
1238c2ecf20Sopenharmony_ci}
1248c2ecf20Sopenharmony_ci
1258c2ecf20Sopenharmony_cistatic int
1268c2ecf20Sopenharmony_ciclk_pll_determine_rate(struct clk_hw *hw, struct clk_rate_request *req)
1278c2ecf20Sopenharmony_ci{
1288c2ecf20Sopenharmony_ci	struct clk_pll *pll = to_clk_pll(hw);
1298c2ecf20Sopenharmony_ci	const struct pll_freq_tbl *f;
1308c2ecf20Sopenharmony_ci
1318c2ecf20Sopenharmony_ci	f = find_freq(pll->freq_tbl, req->rate);
1328c2ecf20Sopenharmony_ci	if (!f)
1338c2ecf20Sopenharmony_ci		req->rate = clk_pll_recalc_rate(hw, req->best_parent_rate);
1348c2ecf20Sopenharmony_ci	else
1358c2ecf20Sopenharmony_ci		req->rate = f->freq;
1368c2ecf20Sopenharmony_ci
1378c2ecf20Sopenharmony_ci	return 0;
1388c2ecf20Sopenharmony_ci}
1398c2ecf20Sopenharmony_ci
1408c2ecf20Sopenharmony_cistatic int
1418c2ecf20Sopenharmony_ciclk_pll_set_rate(struct clk_hw *hw, unsigned long rate, unsigned long p_rate)
1428c2ecf20Sopenharmony_ci{
1438c2ecf20Sopenharmony_ci	struct clk_pll *pll = to_clk_pll(hw);
1448c2ecf20Sopenharmony_ci	const struct pll_freq_tbl *f;
1458c2ecf20Sopenharmony_ci	bool enabled;
1468c2ecf20Sopenharmony_ci	u32 mode;
1478c2ecf20Sopenharmony_ci	u32 enable_mask = PLL_OUTCTRL | PLL_BYPASSNL | PLL_RESET_N;
1488c2ecf20Sopenharmony_ci
1498c2ecf20Sopenharmony_ci	f = find_freq(pll->freq_tbl, rate);
1508c2ecf20Sopenharmony_ci	if (!f)
1518c2ecf20Sopenharmony_ci		return -EINVAL;
1528c2ecf20Sopenharmony_ci
1538c2ecf20Sopenharmony_ci	regmap_read(pll->clkr.regmap, pll->mode_reg, &mode);
1548c2ecf20Sopenharmony_ci	enabled = (mode & enable_mask) == enable_mask;
1558c2ecf20Sopenharmony_ci
1568c2ecf20Sopenharmony_ci	if (enabled)
1578c2ecf20Sopenharmony_ci		clk_pll_disable(hw);
1588c2ecf20Sopenharmony_ci
1598c2ecf20Sopenharmony_ci	regmap_update_bits(pll->clkr.regmap, pll->l_reg, 0x3ff, f->l);
1608c2ecf20Sopenharmony_ci	regmap_update_bits(pll->clkr.regmap, pll->m_reg, 0x7ffff, f->m);
1618c2ecf20Sopenharmony_ci	regmap_update_bits(pll->clkr.regmap, pll->n_reg, 0x7ffff, f->n);
1628c2ecf20Sopenharmony_ci	regmap_write(pll->clkr.regmap, pll->config_reg, f->ibits);
1638c2ecf20Sopenharmony_ci
1648c2ecf20Sopenharmony_ci	if (enabled)
1658c2ecf20Sopenharmony_ci		clk_pll_enable(hw);
1668c2ecf20Sopenharmony_ci
1678c2ecf20Sopenharmony_ci	return 0;
1688c2ecf20Sopenharmony_ci}
1698c2ecf20Sopenharmony_ci
1708c2ecf20Sopenharmony_ciconst struct clk_ops clk_pll_ops = {
1718c2ecf20Sopenharmony_ci	.enable = clk_pll_enable,
1728c2ecf20Sopenharmony_ci	.disable = clk_pll_disable,
1738c2ecf20Sopenharmony_ci	.recalc_rate = clk_pll_recalc_rate,
1748c2ecf20Sopenharmony_ci	.determine_rate = clk_pll_determine_rate,
1758c2ecf20Sopenharmony_ci	.set_rate = clk_pll_set_rate,
1768c2ecf20Sopenharmony_ci};
1778c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(clk_pll_ops);
1788c2ecf20Sopenharmony_ci
1798c2ecf20Sopenharmony_cistatic int wait_for_pll(struct clk_pll *pll)
1808c2ecf20Sopenharmony_ci{
1818c2ecf20Sopenharmony_ci	u32 val;
1828c2ecf20Sopenharmony_ci	int count;
1838c2ecf20Sopenharmony_ci	int ret;
1848c2ecf20Sopenharmony_ci	const char *name = clk_hw_get_name(&pll->clkr.hw);
1858c2ecf20Sopenharmony_ci
1868c2ecf20Sopenharmony_ci	/* Wait for pll to enable. */
1878c2ecf20Sopenharmony_ci	for (count = 200; count > 0; count--) {
1888c2ecf20Sopenharmony_ci		ret = regmap_read(pll->clkr.regmap, pll->status_reg, &val);
1898c2ecf20Sopenharmony_ci		if (ret)
1908c2ecf20Sopenharmony_ci			return ret;
1918c2ecf20Sopenharmony_ci		if (val & BIT(pll->status_bit))
1928c2ecf20Sopenharmony_ci			return 0;
1938c2ecf20Sopenharmony_ci		udelay(1);
1948c2ecf20Sopenharmony_ci	}
1958c2ecf20Sopenharmony_ci
1968c2ecf20Sopenharmony_ci	WARN(1, "%s didn't enable after voting for it!\n", name);
1978c2ecf20Sopenharmony_ci	return -ETIMEDOUT;
1988c2ecf20Sopenharmony_ci}
1998c2ecf20Sopenharmony_ci
2008c2ecf20Sopenharmony_cistatic int clk_pll_vote_enable(struct clk_hw *hw)
2018c2ecf20Sopenharmony_ci{
2028c2ecf20Sopenharmony_ci	int ret;
2038c2ecf20Sopenharmony_ci	struct clk_pll *p = to_clk_pll(clk_hw_get_parent(hw));
2048c2ecf20Sopenharmony_ci
2058c2ecf20Sopenharmony_ci	ret = clk_enable_regmap(hw);
2068c2ecf20Sopenharmony_ci	if (ret)
2078c2ecf20Sopenharmony_ci		return ret;
2088c2ecf20Sopenharmony_ci
2098c2ecf20Sopenharmony_ci	return wait_for_pll(p);
2108c2ecf20Sopenharmony_ci}
2118c2ecf20Sopenharmony_ci
2128c2ecf20Sopenharmony_ciconst struct clk_ops clk_pll_vote_ops = {
2138c2ecf20Sopenharmony_ci	.enable = clk_pll_vote_enable,
2148c2ecf20Sopenharmony_ci	.disable = clk_disable_regmap,
2158c2ecf20Sopenharmony_ci};
2168c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(clk_pll_vote_ops);
2178c2ecf20Sopenharmony_ci
2188c2ecf20Sopenharmony_cistatic void clk_pll_configure(struct clk_pll *pll, struct regmap *regmap,
2198c2ecf20Sopenharmony_ci	const struct pll_config *config)
2208c2ecf20Sopenharmony_ci{
2218c2ecf20Sopenharmony_ci	u32 val;
2228c2ecf20Sopenharmony_ci	u32 mask;
2238c2ecf20Sopenharmony_ci
2248c2ecf20Sopenharmony_ci	regmap_write(regmap, pll->l_reg, config->l);
2258c2ecf20Sopenharmony_ci	regmap_write(regmap, pll->m_reg, config->m);
2268c2ecf20Sopenharmony_ci	regmap_write(regmap, pll->n_reg, config->n);
2278c2ecf20Sopenharmony_ci
2288c2ecf20Sopenharmony_ci	val = config->vco_val;
2298c2ecf20Sopenharmony_ci	val |= config->pre_div_val;
2308c2ecf20Sopenharmony_ci	val |= config->post_div_val;
2318c2ecf20Sopenharmony_ci	val |= config->mn_ena_mask;
2328c2ecf20Sopenharmony_ci	val |= config->main_output_mask;
2338c2ecf20Sopenharmony_ci	val |= config->aux_output_mask;
2348c2ecf20Sopenharmony_ci
2358c2ecf20Sopenharmony_ci	mask = config->vco_mask;
2368c2ecf20Sopenharmony_ci	mask |= config->pre_div_mask;
2378c2ecf20Sopenharmony_ci	mask |= config->post_div_mask;
2388c2ecf20Sopenharmony_ci	mask |= config->mn_ena_mask;
2398c2ecf20Sopenharmony_ci	mask |= config->main_output_mask;
2408c2ecf20Sopenharmony_ci	mask |= config->aux_output_mask;
2418c2ecf20Sopenharmony_ci
2428c2ecf20Sopenharmony_ci	regmap_update_bits(regmap, pll->config_reg, mask, val);
2438c2ecf20Sopenharmony_ci}
2448c2ecf20Sopenharmony_ci
2458c2ecf20Sopenharmony_civoid clk_pll_configure_sr(struct clk_pll *pll, struct regmap *regmap,
2468c2ecf20Sopenharmony_ci		const struct pll_config *config, bool fsm_mode)
2478c2ecf20Sopenharmony_ci{
2488c2ecf20Sopenharmony_ci	clk_pll_configure(pll, regmap, config);
2498c2ecf20Sopenharmony_ci	if (fsm_mode)
2508c2ecf20Sopenharmony_ci		qcom_pll_set_fsm_mode(regmap, pll->mode_reg, 1, 8);
2518c2ecf20Sopenharmony_ci}
2528c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(clk_pll_configure_sr);
2538c2ecf20Sopenharmony_ci
2548c2ecf20Sopenharmony_civoid clk_pll_configure_sr_hpm_lp(struct clk_pll *pll, struct regmap *regmap,
2558c2ecf20Sopenharmony_ci		const struct pll_config *config, bool fsm_mode)
2568c2ecf20Sopenharmony_ci{
2578c2ecf20Sopenharmony_ci	clk_pll_configure(pll, regmap, config);
2588c2ecf20Sopenharmony_ci	if (fsm_mode)
2598c2ecf20Sopenharmony_ci		qcom_pll_set_fsm_mode(regmap, pll->mode_reg, 1, 0);
2608c2ecf20Sopenharmony_ci}
2618c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(clk_pll_configure_sr_hpm_lp);
2628c2ecf20Sopenharmony_ci
2638c2ecf20Sopenharmony_cistatic int clk_pll_sr2_enable(struct clk_hw *hw)
2648c2ecf20Sopenharmony_ci{
2658c2ecf20Sopenharmony_ci	struct clk_pll *pll = to_clk_pll(hw);
2668c2ecf20Sopenharmony_ci	int ret;
2678c2ecf20Sopenharmony_ci	u32 mode;
2688c2ecf20Sopenharmony_ci
2698c2ecf20Sopenharmony_ci	ret = regmap_read(pll->clkr.regmap, pll->mode_reg, &mode);
2708c2ecf20Sopenharmony_ci	if (ret)
2718c2ecf20Sopenharmony_ci		return ret;
2728c2ecf20Sopenharmony_ci
2738c2ecf20Sopenharmony_ci	/* Disable PLL bypass mode. */
2748c2ecf20Sopenharmony_ci	ret = regmap_update_bits(pll->clkr.regmap, pll->mode_reg, PLL_BYPASSNL,
2758c2ecf20Sopenharmony_ci				 PLL_BYPASSNL);
2768c2ecf20Sopenharmony_ci	if (ret)
2778c2ecf20Sopenharmony_ci		return ret;
2788c2ecf20Sopenharmony_ci
2798c2ecf20Sopenharmony_ci	/*
2808c2ecf20Sopenharmony_ci	 * H/W requires a 5us delay between disabling the bypass and
2818c2ecf20Sopenharmony_ci	 * de-asserting the reset. Delay 10us just to be safe.
2828c2ecf20Sopenharmony_ci	 */
2838c2ecf20Sopenharmony_ci	udelay(10);
2848c2ecf20Sopenharmony_ci
2858c2ecf20Sopenharmony_ci	/* De-assert active-low PLL reset. */
2868c2ecf20Sopenharmony_ci	ret = regmap_update_bits(pll->clkr.regmap, pll->mode_reg, PLL_RESET_N,
2878c2ecf20Sopenharmony_ci				 PLL_RESET_N);
2888c2ecf20Sopenharmony_ci	if (ret)
2898c2ecf20Sopenharmony_ci		return ret;
2908c2ecf20Sopenharmony_ci
2918c2ecf20Sopenharmony_ci	ret = wait_for_pll(pll);
2928c2ecf20Sopenharmony_ci	if (ret)
2938c2ecf20Sopenharmony_ci		return ret;
2948c2ecf20Sopenharmony_ci
2958c2ecf20Sopenharmony_ci	/* Enable PLL output. */
2968c2ecf20Sopenharmony_ci	return regmap_update_bits(pll->clkr.regmap, pll->mode_reg, PLL_OUTCTRL,
2978c2ecf20Sopenharmony_ci				 PLL_OUTCTRL);
2988c2ecf20Sopenharmony_ci}
2998c2ecf20Sopenharmony_ci
3008c2ecf20Sopenharmony_cistatic int
3018c2ecf20Sopenharmony_ciclk_pll_sr2_set_rate(struct clk_hw *hw, unsigned long rate, unsigned long prate)
3028c2ecf20Sopenharmony_ci{
3038c2ecf20Sopenharmony_ci	struct clk_pll *pll = to_clk_pll(hw);
3048c2ecf20Sopenharmony_ci	const struct pll_freq_tbl *f;
3058c2ecf20Sopenharmony_ci	bool enabled;
3068c2ecf20Sopenharmony_ci	u32 mode;
3078c2ecf20Sopenharmony_ci	u32 enable_mask = PLL_OUTCTRL | PLL_BYPASSNL | PLL_RESET_N;
3088c2ecf20Sopenharmony_ci
3098c2ecf20Sopenharmony_ci	f = find_freq(pll->freq_tbl, rate);
3108c2ecf20Sopenharmony_ci	if (!f)
3118c2ecf20Sopenharmony_ci		return -EINVAL;
3128c2ecf20Sopenharmony_ci
3138c2ecf20Sopenharmony_ci	regmap_read(pll->clkr.regmap, pll->mode_reg, &mode);
3148c2ecf20Sopenharmony_ci	enabled = (mode & enable_mask) == enable_mask;
3158c2ecf20Sopenharmony_ci
3168c2ecf20Sopenharmony_ci	if (enabled)
3178c2ecf20Sopenharmony_ci		clk_pll_disable(hw);
3188c2ecf20Sopenharmony_ci
3198c2ecf20Sopenharmony_ci	regmap_update_bits(pll->clkr.regmap, pll->l_reg, 0x3ff, f->l);
3208c2ecf20Sopenharmony_ci	regmap_update_bits(pll->clkr.regmap, pll->m_reg, 0x7ffff, f->m);
3218c2ecf20Sopenharmony_ci	regmap_update_bits(pll->clkr.regmap, pll->n_reg, 0x7ffff, f->n);
3228c2ecf20Sopenharmony_ci
3238c2ecf20Sopenharmony_ci	if (enabled)
3248c2ecf20Sopenharmony_ci		clk_pll_sr2_enable(hw);
3258c2ecf20Sopenharmony_ci
3268c2ecf20Sopenharmony_ci	return 0;
3278c2ecf20Sopenharmony_ci}
3288c2ecf20Sopenharmony_ci
3298c2ecf20Sopenharmony_ciconst struct clk_ops clk_pll_sr2_ops = {
3308c2ecf20Sopenharmony_ci	.enable = clk_pll_sr2_enable,
3318c2ecf20Sopenharmony_ci	.disable = clk_pll_disable,
3328c2ecf20Sopenharmony_ci	.set_rate = clk_pll_sr2_set_rate,
3338c2ecf20Sopenharmony_ci	.recalc_rate = clk_pll_recalc_rate,
3348c2ecf20Sopenharmony_ci	.determine_rate = clk_pll_determine_rate,
3358c2ecf20Sopenharmony_ci};
3368c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(clk_pll_sr2_ops);
337