clk: sunxi-ng: mux: Support finding closest rate
authorFrank Oltmanns <frank@oltmanns.dev>
Mon, 7 Aug 2023 12:43:41 +0000 (14:43 +0200)
committerChen-Yu Tsai <wens@csie.org>
Wed, 9 Aug 2023 15:33:59 +0000 (23:33 +0800)
When finding the best rate for a mux clock, consider rates that are
higher than the requested rate when CCU_FEATURE_ROUND_CLOSEST is used.
Furthermore, introduce an initialization macro that sets this flag.

Acked-by: Maxime Ripard <mripard@kernel.org>
Reviewed-by: Jernej Skrabec <jernej.skrabec@gmail.com>
Signed-off-by: Frank Oltmanns <frank@oltmanns.dev>
Link: https://lore.kernel.org/r/20230807-pll-mipi_set_rate_parent-v6-8-f173239a4b59@oltmanns.dev
Signed-off-by: Chen-Yu Tsai <wens@csie.org>
drivers/clk/sunxi-ng/ccu_mux.c
drivers/clk/sunxi-ng/ccu_mux.h

index 3ca695439620b1aabaf92fe00da4bad247b63e73..5edc63b466516cc0717e2533045cc87f10c6d88d 100644 (file)
@@ -242,6 +242,17 @@ static int ccu_mux_set_parent(struct clk_hw *hw, u8 index)
        return ccu_mux_helper_set_parent(&cm->common, &cm->mux, index);
 }
 
+static int ccu_mux_determine_rate(struct clk_hw *hw,
+                                 struct clk_rate_request *req)
+{
+       struct ccu_mux *cm = hw_to_ccu_mux(hw);
+
+       if (cm->common.features & CCU_FEATURE_CLOSEST_RATE)
+               return clk_mux_determine_rate_flags(hw, req, CLK_MUX_ROUND_CLOSEST);
+
+       return clk_mux_determine_rate_flags(hw, req, 0);
+}
+
 static unsigned long ccu_mux_recalc_rate(struct clk_hw *hw,
                                         unsigned long parent_rate)
 {
@@ -259,7 +270,7 @@ const struct clk_ops ccu_mux_ops = {
        .get_parent     = ccu_mux_get_parent,
        .set_parent     = ccu_mux_set_parent,
 
-       .determine_rate = __clk_mux_determine_rate,
+       .determine_rate = ccu_mux_determine_rate,
        .recalc_rate    = ccu_mux_recalc_rate,
 };
 EXPORT_SYMBOL_NS_GPL(ccu_mux_ops, SUNXI_CCU);
index 2c1811a445b0b564390a5d1ab76aed24d3cd283b..eb1172ebbd94b5e3515f618390a4753c7eb5be4d 100644 (file)
@@ -46,20 +46,36 @@ struct ccu_mux {
        struct ccu_common       common;
 };
 
+#define SUNXI_CCU_MUX_TABLE_WITH_GATE_FEAT(_struct, _name, _parents, _table,   \
+                                    _reg, _shift, _width, _gate,               \
+                                    _flags, _features)                         \
+       struct ccu_mux _struct = {                                              \
+               .enable = _gate,                                                \
+               .mux    = _SUNXI_CCU_MUX_TABLE(_shift, _width, _table),         \
+               .common = {                                                     \
+                       .reg            = _reg,                                 \
+                       .hw.init        = CLK_HW_INIT_PARENTS(_name,            \
+                                                             _parents,         \
+                                                             &ccu_mux_ops,     \
+                                                             _flags),          \
+                       .features       = _features,                            \
+               }                                                               \
+       }
+
+#define SUNXI_CCU_MUX_TABLE_WITH_GATE_CLOSEST(_struct, _name, _parents,        \
+                                             _table, _reg, _shift,     \
+                                             _width, _gate, _flags)    \
+       SUNXI_CCU_MUX_TABLE_WITH_GATE_FEAT(_struct, _name, _parents,    \
+                                          _table, _reg, _shift,        \
+                                          _width, _gate, _flags,       \
+                                          CCU_FEATURE_CLOSEST_RATE)
+
 #define SUNXI_CCU_MUX_TABLE_WITH_GATE(_struct, _name, _parents, _table,        \
                                     _reg, _shift, _width, _gate,       \
                                     _flags)                            \
-       struct ccu_mux _struct = {                                      \
-               .enable = _gate,                                        \
-               .mux    = _SUNXI_CCU_MUX_TABLE(_shift, _width, _table), \
-               .common = {                                             \
-                       .reg            = _reg,                         \
-                       .hw.init        = CLK_HW_INIT_PARENTS(_name,    \
-                                                             _parents, \
-                                                             &ccu_mux_ops, \
-                                                             _flags),  \
-               }                                                       \
-       }
+       SUNXI_CCU_MUX_TABLE_WITH_GATE_FEAT(_struct, _name, _parents,    \
+                                          _table, _reg, _shift,        \
+                                          _width, _gate, _flags, 0)
 
 #define SUNXI_CCU_MUX_WITH_GATE(_struct, _name, _parents, _reg,                \
                                _shift, _width, _gate, _flags)          \