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