xref: /openbmc/linux/drivers/clk/sprd/composite.c (revision 4fcba55c)
14fcba55cSChunyan Zhang // SPDX-License-Identifier: GPL-2.0
24fcba55cSChunyan Zhang //
34fcba55cSChunyan Zhang // Spreadtrum composite clock driver
44fcba55cSChunyan Zhang //
54fcba55cSChunyan Zhang // Copyright (C) 2017 Spreadtrum, Inc.
64fcba55cSChunyan Zhang // Author: Chunyan Zhang <chunyan.zhang@spreadtrum.com>
74fcba55cSChunyan Zhang 
84fcba55cSChunyan Zhang #include <linux/clk-provider.h>
94fcba55cSChunyan Zhang 
104fcba55cSChunyan Zhang #include "composite.h"
114fcba55cSChunyan Zhang 
124fcba55cSChunyan Zhang static long sprd_comp_round_rate(struct clk_hw *hw, unsigned long rate,
134fcba55cSChunyan Zhang 				unsigned long *parent_rate)
144fcba55cSChunyan Zhang {
154fcba55cSChunyan Zhang 	struct sprd_comp *cc = hw_to_sprd_comp(hw);
164fcba55cSChunyan Zhang 
174fcba55cSChunyan Zhang 	return sprd_div_helper_round_rate(&cc->common, &cc->div,
184fcba55cSChunyan Zhang 					 rate, parent_rate);
194fcba55cSChunyan Zhang }
204fcba55cSChunyan Zhang 
214fcba55cSChunyan Zhang static unsigned long sprd_comp_recalc_rate(struct clk_hw *hw,
224fcba55cSChunyan Zhang 					  unsigned long parent_rate)
234fcba55cSChunyan Zhang {
244fcba55cSChunyan Zhang 	struct sprd_comp *cc = hw_to_sprd_comp(hw);
254fcba55cSChunyan Zhang 
264fcba55cSChunyan Zhang 	return sprd_div_helper_recalc_rate(&cc->common, &cc->div, parent_rate);
274fcba55cSChunyan Zhang }
284fcba55cSChunyan Zhang 
294fcba55cSChunyan Zhang static int sprd_comp_set_rate(struct clk_hw *hw, unsigned long rate,
304fcba55cSChunyan Zhang 			     unsigned long parent_rate)
314fcba55cSChunyan Zhang {
324fcba55cSChunyan Zhang 	struct sprd_comp *cc = hw_to_sprd_comp(hw);
334fcba55cSChunyan Zhang 
344fcba55cSChunyan Zhang 	return sprd_div_helper_set_rate(&cc->common, &cc->div,
354fcba55cSChunyan Zhang 				       rate, parent_rate);
364fcba55cSChunyan Zhang }
374fcba55cSChunyan Zhang 
384fcba55cSChunyan Zhang static u8 sprd_comp_get_parent(struct clk_hw *hw)
394fcba55cSChunyan Zhang {
404fcba55cSChunyan Zhang 	struct sprd_comp *cc = hw_to_sprd_comp(hw);
414fcba55cSChunyan Zhang 
424fcba55cSChunyan Zhang 	return sprd_mux_helper_get_parent(&cc->common, &cc->mux);
434fcba55cSChunyan Zhang }
444fcba55cSChunyan Zhang 
454fcba55cSChunyan Zhang static int sprd_comp_set_parent(struct clk_hw *hw, u8 index)
464fcba55cSChunyan Zhang {
474fcba55cSChunyan Zhang 	struct sprd_comp *cc = hw_to_sprd_comp(hw);
484fcba55cSChunyan Zhang 
494fcba55cSChunyan Zhang 	return sprd_mux_helper_set_parent(&cc->common, &cc->mux, index);
504fcba55cSChunyan Zhang }
514fcba55cSChunyan Zhang 
524fcba55cSChunyan Zhang const struct clk_ops sprd_comp_ops = {
534fcba55cSChunyan Zhang 	.get_parent	= sprd_comp_get_parent,
544fcba55cSChunyan Zhang 	.set_parent	= sprd_comp_set_parent,
554fcba55cSChunyan Zhang 
564fcba55cSChunyan Zhang 	.round_rate	= sprd_comp_round_rate,
574fcba55cSChunyan Zhang 	.recalc_rate	= sprd_comp_recalc_rate,
584fcba55cSChunyan Zhang 	.set_rate	= sprd_comp_set_rate,
594fcba55cSChunyan Zhang };
604fcba55cSChunyan Zhang EXPORT_SYMBOL_GPL(sprd_comp_ops);
61