Commit 78e7f7da authored by Frank Oltmanns's avatar Frank Oltmanns Committed by Chen-Yu Tsai
Browse files

clk: sunxi-ng: mux: Support finding closest rate



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: default avatarMaxime Ripard <mripard@kernel.org>
Reviewed-by: default avatarJernej Skrabec <jernej.skrabec@gmail.com>
Signed-off-by: default avatarFrank Oltmanns <frank@oltmanns.dev>
Link: https://lore.kernel.org/r/20230807-pll-mipi_set_rate_parent-v6-8-f173239a4b59@oltmanns.dev


Signed-off-by: default avatarChen-Yu Tsai <wens@csie.org>
parent 088cefca
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -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);
+27 −11
Original line number Diff line number Diff line
@@ -46,9 +46,9 @@ struct ccu_mux {
	struct ccu_common	common;
};

#define SUNXI_CCU_MUX_TABLE_WITH_GATE(_struct, _name, _parents, _table,	\
#define SUNXI_CCU_MUX_TABLE_WITH_GATE_FEAT(_struct, _name, _parents, _table,	\
				     _reg, _shift, _width, _gate,		\
				     _flags)				\
				     _flags, _features)				\
	struct ccu_mux _struct = {						\
		.enable	= _gate,						\
		.mux	= _SUNXI_CCU_MUX_TABLE(_shift, _width, _table),		\
@@ -58,9 +58,25 @@ struct ccu_mux {
							      _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)				\
	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)		\
	SUNXI_CCU_MUX_TABLE_WITH_GATE(_struct, _name, _parents, NULL,	\