Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

clk: qcom: clk-rcg: add clk_rcg_floor_ops ops

Add clk_rcg_floor_ops for clock that can't provide a stable freq and
require to use a floor freq to provide the requested frequency.

Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Reviewed-by: Stephen Boyd <sboyd@kernel.org>
Tested-by: Jonathan McDowell <noodles@earth.li>
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Link: https://lore.kernel.org/r/20220226135235.10051-10-ansuelsmth@gmail.com

authored by

Ansuel Smith and committed by
Bjorn Andersson
33958ad3 28aa450d

+25
+24
drivers/clk/qcom/clk-rcg.c
··· 526 526 return __clk_rcg_set_rate(rcg, f); 527 527 } 528 528 529 + static int clk_rcg_set_floor_rate(struct clk_hw *hw, unsigned long rate, 530 + unsigned long parent_rate) 531 + { 532 + struct clk_rcg *rcg = to_clk_rcg(hw); 533 + const struct freq_tbl *f; 534 + 535 + f = qcom_find_freq_floor(rcg->freq_tbl, rate); 536 + if (!f) 537 + return -EINVAL; 538 + 539 + return __clk_rcg_set_rate(rcg, f); 540 + } 541 + 529 542 static int clk_rcg_bypass_set_rate(struct clk_hw *hw, unsigned long rate, 530 543 unsigned long parent_rate) 531 544 { ··· 828 815 .set_rate = clk_rcg_set_rate, 829 816 }; 830 817 EXPORT_SYMBOL_GPL(clk_rcg_ops); 818 + 819 + const struct clk_ops clk_rcg_floor_ops = { 820 + .enable = clk_enable_regmap, 821 + .disable = clk_disable_regmap, 822 + .get_parent = clk_rcg_get_parent, 823 + .set_parent = clk_rcg_set_parent, 824 + .recalc_rate = clk_rcg_recalc_rate, 825 + .determine_rate = clk_rcg_determine_rate, 826 + .set_rate = clk_rcg_set_floor_rate, 827 + }; 828 + EXPORT_SYMBOL_GPL(clk_rcg_floor_ops); 831 829 832 830 const struct clk_ops clk_rcg_bypass_ops = { 833 831 .enable = clk_enable_regmap,
+1
drivers/clk/qcom/clk-rcg.h
··· 86 86 }; 87 87 88 88 extern const struct clk_ops clk_rcg_ops; 89 + extern const struct clk_ops clk_rcg_floor_ops; 89 90 extern const struct clk_ops clk_rcg_bypass_ops; 90 91 extern const struct clk_ops clk_rcg_bypass2_ops; 91 92 extern const struct clk_ops clk_rcg_pixel_ops;