Author | Tokens | Token Proportion | Commits | Commit Proportion |
---|---|---|---|---|
Manivannan Sadhasivam | 792 | 91.14% | 1 | 25.00% |
Maxime Ripard | 77 | 8.86% | 3 | 75.00% |
Total | 869 | 4 |
// SPDX-License-Identifier: GPL-2.0+ // // OWL composite clock driver // // Copyright (c) 2014 Actions Semi Inc. // Author: David Liu <liuwei@actions-semi.com> // // Copyright (c) 2018 Linaro Ltd. // Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> #include <linux/clk-provider.h> #include <linux/regmap.h> #include "owl-composite.h" static u8 owl_comp_get_parent(struct clk_hw *hw) { struct owl_composite *comp = hw_to_owl_comp(hw); return owl_mux_helper_get_parent(&comp->common, &comp->mux_hw); } static int owl_comp_set_parent(struct clk_hw *hw, u8 index) { struct owl_composite *comp = hw_to_owl_comp(hw); return owl_mux_helper_set_parent(&comp->common, &comp->mux_hw, index); } static void owl_comp_disable(struct clk_hw *hw) { struct owl_composite *comp = hw_to_owl_comp(hw); struct owl_clk_common *common = &comp->common; owl_gate_set(common, &comp->gate_hw, false); } static int owl_comp_enable(struct clk_hw *hw) { struct owl_composite *comp = hw_to_owl_comp(hw); struct owl_clk_common *common = &comp->common; owl_gate_set(common, &comp->gate_hw, true); return 0; } static int owl_comp_is_enabled(struct clk_hw *hw) { struct owl_composite *comp = hw_to_owl_comp(hw); struct owl_clk_common *common = &comp->common; return owl_gate_clk_is_enabled(common, &comp->gate_hw); } static int owl_comp_div_determine_rate(struct clk_hw *hw, struct clk_rate_request *req) { struct owl_composite *comp = hw_to_owl_comp(hw); long rate; rate = owl_divider_helper_round_rate(&comp->common, &comp->rate.div_hw, req->rate, &req->best_parent_rate); if (rate < 0) return rate; req->rate = rate; return 0; } static unsigned long owl_comp_div_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) { struct owl_composite *comp = hw_to_owl_comp(hw); return owl_divider_helper_recalc_rate(&comp->common, &comp->rate.div_hw, parent_rate); } static int owl_comp_div_set_rate(struct clk_hw *hw, unsigned long rate, unsigned long parent_rate) { struct owl_composite *comp = hw_to_owl_comp(hw); return owl_divider_helper_set_rate(&comp->common, &comp->rate.div_hw, rate, parent_rate); } static int owl_comp_fact_determine_rate(struct clk_hw *hw, struct clk_rate_request *req) { struct owl_composite *comp = hw_to_owl_comp(hw); long rate; rate = owl_factor_helper_round_rate(&comp->common, &comp->rate.factor_hw, req->rate, &req->best_parent_rate); if (rate < 0) return rate; req->rate = rate; return 0; } static unsigned long owl_comp_fact_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) { struct owl_composite *comp = hw_to_owl_comp(hw); return owl_factor_helper_recalc_rate(&comp->common, &comp->rate.factor_hw, parent_rate); } static int owl_comp_fact_set_rate(struct clk_hw *hw, unsigned long rate, unsigned long parent_rate) { struct owl_composite *comp = hw_to_owl_comp(hw); return owl_factor_helper_set_rate(&comp->common, &comp->rate.factor_hw, rate, parent_rate); } static long owl_comp_fix_fact_round_rate(struct clk_hw *hw, unsigned long rate, unsigned long *parent_rate) { struct owl_composite *comp = hw_to_owl_comp(hw); struct clk_fixed_factor *fix_fact_hw = &comp->rate.fix_fact_hw; return comp->fix_fact_ops->round_rate(&fix_fact_hw->hw, rate, parent_rate); } static unsigned long owl_comp_fix_fact_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) { struct owl_composite *comp = hw_to_owl_comp(hw); struct clk_fixed_factor *fix_fact_hw = &comp->rate.fix_fact_hw; return comp->fix_fact_ops->recalc_rate(&fix_fact_hw->hw, parent_rate); } static int owl_comp_fix_fact_set_rate(struct clk_hw *hw, unsigned long rate, unsigned long parent_rate) { /* * We must report success but we can do so unconditionally because * owl_comp_fix_fact_round_rate returns values that ensure this call is * a nop. */ return 0; } const struct clk_ops owl_comp_div_ops = { /* mux_ops */ .get_parent = owl_comp_get_parent, .set_parent = owl_comp_set_parent, /* gate_ops */ .disable = owl_comp_disable, .enable = owl_comp_enable, .is_enabled = owl_comp_is_enabled, /* div_ops */ .determine_rate = owl_comp_div_determine_rate, .recalc_rate = owl_comp_div_recalc_rate, .set_rate = owl_comp_div_set_rate, }; const struct clk_ops owl_comp_fact_ops = { /* mux_ops */ .get_parent = owl_comp_get_parent, .set_parent = owl_comp_set_parent, /* gate_ops */ .disable = owl_comp_disable, .enable = owl_comp_enable, .is_enabled = owl_comp_is_enabled, /* fact_ops */ .determine_rate = owl_comp_fact_determine_rate, .recalc_rate = owl_comp_fact_recalc_rate, .set_rate = owl_comp_fact_set_rate, }; const struct clk_ops owl_comp_fix_fact_ops = { /* gate_ops */ .disable = owl_comp_disable, .enable = owl_comp_enable, .is_enabled = owl_comp_is_enabled, /* fix_fact_ops */ .round_rate = owl_comp_fix_fact_round_rate, .recalc_rate = owl_comp_fix_fact_recalc_rate, .set_rate = owl_comp_fix_fact_set_rate, }; const struct clk_ops owl_comp_pass_ops = { /* mux_ops */ .determine_rate = clk_hw_determine_rate_no_reparent, .get_parent = owl_comp_get_parent, .set_parent = owl_comp_set_parent, /* gate_ops */ .disable = owl_comp_disable, .enable = owl_comp_enable, .is_enabled = owl_comp_is_enabled, };
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with Cregit http://github.com/cregit/cregit
Version 2.0-RC1