18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (c) 2018 MediaTek Inc.
48c2ecf20Sopenharmony_ci * Author: Owen Chen <owen.chen@mediatek.com>
58c2ecf20Sopenharmony_ci */
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#ifndef __DRV_CLK_MTK_MUX_H
88c2ecf20Sopenharmony_ci#define __DRV_CLK_MTK_MUX_H
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#include <linux/clk-provider.h>
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_cistruct mtk_clk_mux {
138c2ecf20Sopenharmony_ci	struct clk_hw hw;
148c2ecf20Sopenharmony_ci	struct regmap *regmap;
158c2ecf20Sopenharmony_ci	const struct mtk_mux *data;
168c2ecf20Sopenharmony_ci	spinlock_t *lock;
178c2ecf20Sopenharmony_ci};
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_cistruct mtk_mux {
208c2ecf20Sopenharmony_ci	int id;
218c2ecf20Sopenharmony_ci	const char *name;
228c2ecf20Sopenharmony_ci	const char * const *parent_names;
238c2ecf20Sopenharmony_ci	unsigned int flags;
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci	u32 mux_ofs;
268c2ecf20Sopenharmony_ci	u32 set_ofs;
278c2ecf20Sopenharmony_ci	u32 clr_ofs;
288c2ecf20Sopenharmony_ci	u32 upd_ofs;
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci	u8 mux_shift;
318c2ecf20Sopenharmony_ci	u8 mux_width;
328c2ecf20Sopenharmony_ci	u8 gate_shift;
338c2ecf20Sopenharmony_ci	s8 upd_shift;
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci	const struct clk_ops *ops;
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci	signed char num_parents;
388c2ecf20Sopenharmony_ci};
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ciextern const struct clk_ops mtk_mux_ops;
418c2ecf20Sopenharmony_ciextern const struct clk_ops mtk_mux_clr_set_upd_ops;
428c2ecf20Sopenharmony_ciextern const struct clk_ops mtk_mux_gate_ops;
438c2ecf20Sopenharmony_ciextern const struct clk_ops mtk_mux_gate_clr_set_upd_ops;
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci#define GATE_CLR_SET_UPD_FLAGS(_id, _name, _parents, _mux_ofs,		\
468c2ecf20Sopenharmony_ci			_mux_set_ofs, _mux_clr_ofs, _shift, _width,	\
478c2ecf20Sopenharmony_ci			_gate, _upd_ofs, _upd, _flags, _ops) {		\
488c2ecf20Sopenharmony_ci		.id = _id,						\
498c2ecf20Sopenharmony_ci		.name = _name,						\
508c2ecf20Sopenharmony_ci		.mux_ofs = _mux_ofs,					\
518c2ecf20Sopenharmony_ci		.set_ofs = _mux_set_ofs,				\
528c2ecf20Sopenharmony_ci		.clr_ofs = _mux_clr_ofs,				\
538c2ecf20Sopenharmony_ci		.upd_ofs = _upd_ofs,					\
548c2ecf20Sopenharmony_ci		.mux_shift = _shift,					\
558c2ecf20Sopenharmony_ci		.mux_width = _width,					\
568c2ecf20Sopenharmony_ci		.gate_shift = _gate,					\
578c2ecf20Sopenharmony_ci		.upd_shift = _upd,					\
588c2ecf20Sopenharmony_ci		.parent_names = _parents,				\
598c2ecf20Sopenharmony_ci		.num_parents = ARRAY_SIZE(_parents),			\
608c2ecf20Sopenharmony_ci		.flags = _flags,					\
618c2ecf20Sopenharmony_ci		.ops = &_ops,						\
628c2ecf20Sopenharmony_ci	}
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_ci#define MUX_GATE_CLR_SET_UPD_FLAGS(_id, _name, _parents, _mux_ofs,	\
658c2ecf20Sopenharmony_ci			_mux_set_ofs, _mux_clr_ofs, _shift, _width,	\
668c2ecf20Sopenharmony_ci			_gate, _upd_ofs, _upd, _flags)			\
678c2ecf20Sopenharmony_ci		GATE_CLR_SET_UPD_FLAGS(_id, _name, _parents, _mux_ofs,	\
688c2ecf20Sopenharmony_ci			_mux_set_ofs, _mux_clr_ofs, _shift, _width,	\
698c2ecf20Sopenharmony_ci			_gate, _upd_ofs, _upd, _flags,			\
708c2ecf20Sopenharmony_ci			mtk_mux_gate_clr_set_upd_ops)
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_ci#define MUX_GATE_CLR_SET_UPD(_id, _name, _parents, _mux_ofs,		\
738c2ecf20Sopenharmony_ci			_mux_set_ofs, _mux_clr_ofs, _shift, _width,	\
748c2ecf20Sopenharmony_ci			_gate, _upd_ofs, _upd)				\
758c2ecf20Sopenharmony_ci		MUX_GATE_CLR_SET_UPD_FLAGS(_id, _name, _parents,	\
768c2ecf20Sopenharmony_ci			_mux_ofs, _mux_set_ofs, _mux_clr_ofs, _shift,	\
778c2ecf20Sopenharmony_ci			_width, _gate, _upd_ofs, _upd,			\
788c2ecf20Sopenharmony_ci			CLK_SET_RATE_PARENT)
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_cistruct clk *mtk_clk_register_mux(const struct mtk_mux *mux,
818c2ecf20Sopenharmony_ci				 struct regmap *regmap,
828c2ecf20Sopenharmony_ci				 spinlock_t *lock);
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ciint mtk_clk_register_muxes(const struct mtk_mux *muxes,
858c2ecf20Sopenharmony_ci			   int num, struct device_node *node,
868c2ecf20Sopenharmony_ci			   spinlock_t *lock,
878c2ecf20Sopenharmony_ci			   struct clk_onecell_data *clk_data);
888c2ecf20Sopenharmony_ci
898c2ecf20Sopenharmony_ci#endif /* __DRV_CLK_MTK_MUX_H */
90