18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (c) 2014 MediaTek Inc.
48c2ecf20Sopenharmony_ci * Author: James Liao <jamesjj.liao@mediatek.com>
58c2ecf20Sopenharmony_ci */
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#ifndef __DRV_CLK_GATE_H
88c2ecf20Sopenharmony_ci#define __DRV_CLK_GATE_H
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#include <linux/regmap.h>
118c2ecf20Sopenharmony_ci#include <linux/clk-provider.h>
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_cistruct clk;
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_cistruct mtk_clk_gate {
168c2ecf20Sopenharmony_ci	struct clk_hw	hw;
178c2ecf20Sopenharmony_ci	struct regmap	*regmap;
188c2ecf20Sopenharmony_ci	int		set_ofs;
198c2ecf20Sopenharmony_ci	int		clr_ofs;
208c2ecf20Sopenharmony_ci	int		sta_ofs;
218c2ecf20Sopenharmony_ci	u8		bit;
228c2ecf20Sopenharmony_ci};
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_cistatic inline struct mtk_clk_gate *to_mtk_clk_gate(struct clk_hw *hw)
258c2ecf20Sopenharmony_ci{
268c2ecf20Sopenharmony_ci	return container_of(hw, struct mtk_clk_gate, hw);
278c2ecf20Sopenharmony_ci}
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ciextern const struct clk_ops mtk_clk_gate_ops_setclr;
308c2ecf20Sopenharmony_ciextern const struct clk_ops mtk_clk_gate_ops_setclr_inv;
318c2ecf20Sopenharmony_ciextern const struct clk_ops mtk_clk_gate_ops_no_setclr;
328c2ecf20Sopenharmony_ciextern const struct clk_ops mtk_clk_gate_ops_no_setclr_inv;
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_cistruct clk *mtk_clk_register_gate(
358c2ecf20Sopenharmony_ci		const char *name,
368c2ecf20Sopenharmony_ci		const char *parent_name,
378c2ecf20Sopenharmony_ci		struct regmap *regmap,
388c2ecf20Sopenharmony_ci		int set_ofs,
398c2ecf20Sopenharmony_ci		int clr_ofs,
408c2ecf20Sopenharmony_ci		int sta_ofs,
418c2ecf20Sopenharmony_ci		u8 bit,
428c2ecf20Sopenharmony_ci		const struct clk_ops *ops,
438c2ecf20Sopenharmony_ci		unsigned long flags,
448c2ecf20Sopenharmony_ci		struct device *dev);
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci#define GATE_MTK_FLAGS(_id, _name, _parent, _regs, _shift,	\
478c2ecf20Sopenharmony_ci			_ops, _flags) {				\
488c2ecf20Sopenharmony_ci		.id = _id,					\
498c2ecf20Sopenharmony_ci		.name = _name,					\
508c2ecf20Sopenharmony_ci		.parent_name = _parent,				\
518c2ecf20Sopenharmony_ci		.regs = _regs,					\
528c2ecf20Sopenharmony_ci		.shift = _shift,				\
538c2ecf20Sopenharmony_ci		.ops = _ops,					\
548c2ecf20Sopenharmony_ci		.flags = _flags,				\
558c2ecf20Sopenharmony_ci	}
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci#define GATE_MTK(_id, _name, _parent, _regs, _shift, _ops)		\
588c2ecf20Sopenharmony_ci	GATE_MTK_FLAGS(_id, _name, _parent, _regs, _shift, _ops, 0)
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ci#endif /* __DRV_CLK_GATE_H */
61