18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci// 38c2ecf20Sopenharmony_ci// Spreadtrum composite clock driver 48c2ecf20Sopenharmony_ci// 58c2ecf20Sopenharmony_ci// Copyright (C) 2017 Spreadtrum, Inc. 68c2ecf20Sopenharmony_ci// Author: Chunyan Zhang <chunyan.zhang@spreadtrum.com> 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include <linux/clk-provider.h> 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include "composite.h" 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_cistatic long sprd_comp_round_rate(struct clk_hw *hw, unsigned long rate, 138c2ecf20Sopenharmony_ci unsigned long *parent_rate) 148c2ecf20Sopenharmony_ci{ 158c2ecf20Sopenharmony_ci struct sprd_comp *cc = hw_to_sprd_comp(hw); 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci return sprd_div_helper_round_rate(&cc->common, &cc->div, 188c2ecf20Sopenharmony_ci rate, parent_rate); 198c2ecf20Sopenharmony_ci} 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_cistatic unsigned long sprd_comp_recalc_rate(struct clk_hw *hw, 228c2ecf20Sopenharmony_ci unsigned long parent_rate) 238c2ecf20Sopenharmony_ci{ 248c2ecf20Sopenharmony_ci struct sprd_comp *cc = hw_to_sprd_comp(hw); 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci return sprd_div_helper_recalc_rate(&cc->common, &cc->div, parent_rate); 278c2ecf20Sopenharmony_ci} 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_cistatic int sprd_comp_set_rate(struct clk_hw *hw, unsigned long rate, 308c2ecf20Sopenharmony_ci unsigned long parent_rate) 318c2ecf20Sopenharmony_ci{ 328c2ecf20Sopenharmony_ci struct sprd_comp *cc = hw_to_sprd_comp(hw); 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci return sprd_div_helper_set_rate(&cc->common, &cc->div, 358c2ecf20Sopenharmony_ci rate, parent_rate); 368c2ecf20Sopenharmony_ci} 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_cistatic u8 sprd_comp_get_parent(struct clk_hw *hw) 398c2ecf20Sopenharmony_ci{ 408c2ecf20Sopenharmony_ci struct sprd_comp *cc = hw_to_sprd_comp(hw); 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci return sprd_mux_helper_get_parent(&cc->common, &cc->mux); 438c2ecf20Sopenharmony_ci} 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_cistatic int sprd_comp_set_parent(struct clk_hw *hw, u8 index) 468c2ecf20Sopenharmony_ci{ 478c2ecf20Sopenharmony_ci struct sprd_comp *cc = hw_to_sprd_comp(hw); 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci return sprd_mux_helper_set_parent(&cc->common, &cc->mux, index); 508c2ecf20Sopenharmony_ci} 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ciconst struct clk_ops sprd_comp_ops = { 538c2ecf20Sopenharmony_ci .get_parent = sprd_comp_get_parent, 548c2ecf20Sopenharmony_ci .set_parent = sprd_comp_set_parent, 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci .round_rate = sprd_comp_round_rate, 578c2ecf20Sopenharmony_ci .recalc_rate = sprd_comp_recalc_rate, 588c2ecf20Sopenharmony_ci .set_rate = sprd_comp_set_rate, 598c2ecf20Sopenharmony_ci}; 608c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(sprd_comp_ops); 61