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