162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) 2016 Maxime Ripard. All rights reserved.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef _CCU_GATE_H_
762306a36Sopenharmony_ci#define _CCU_GATE_H_
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/clk-provider.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include "ccu_common.h"
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_cistruct ccu_gate {
1462306a36Sopenharmony_ci	u32			enable;
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci	struct ccu_common	common;
1762306a36Sopenharmony_ci};
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#define SUNXI_CCU_GATE(_struct, _name, _parent, _reg, _gate, _flags)	\
2062306a36Sopenharmony_ci	struct ccu_gate _struct = {					\
2162306a36Sopenharmony_ci		.enable	= _gate,					\
2262306a36Sopenharmony_ci		.common	= {						\
2362306a36Sopenharmony_ci			.reg		= _reg,				\
2462306a36Sopenharmony_ci			.hw.init	= CLK_HW_INIT(_name,		\
2562306a36Sopenharmony_ci						      _parent,		\
2662306a36Sopenharmony_ci						      &ccu_gate_ops,	\
2762306a36Sopenharmony_ci						      _flags),		\
2862306a36Sopenharmony_ci		}							\
2962306a36Sopenharmony_ci	}
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci#define SUNXI_CCU_GATE_HW(_struct, _name, _parent, _reg, _gate, _flags)	\
3262306a36Sopenharmony_ci	struct ccu_gate _struct = {					\
3362306a36Sopenharmony_ci		.enable	= _gate,					\
3462306a36Sopenharmony_ci		.common	= {						\
3562306a36Sopenharmony_ci			.reg		= _reg,				\
3662306a36Sopenharmony_ci			.hw.init	= CLK_HW_INIT_HW(_name,		\
3762306a36Sopenharmony_ci							 _parent,	\
3862306a36Sopenharmony_ci							 &ccu_gate_ops,	\
3962306a36Sopenharmony_ci							 _flags),	\
4062306a36Sopenharmony_ci		}							\
4162306a36Sopenharmony_ci	}
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci#define SUNXI_CCU_GATE_FW(_struct, _name, _parent, _reg, _gate, _flags)	\
4462306a36Sopenharmony_ci	struct ccu_gate _struct = {					\
4562306a36Sopenharmony_ci		.enable	= _gate,					\
4662306a36Sopenharmony_ci		.common	= {						\
4762306a36Sopenharmony_ci			.reg		= _reg,				\
4862306a36Sopenharmony_ci			.hw.init	= CLK_HW_INIT_FW_NAME(_name,	\
4962306a36Sopenharmony_ci							      _parent,	\
5062306a36Sopenharmony_ci							      &ccu_gate_ops, \
5162306a36Sopenharmony_ci							      _flags),	\
5262306a36Sopenharmony_ci		}							\
5362306a36Sopenharmony_ci	}
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci/*
5662306a36Sopenharmony_ci * The following macros allow the re-use of the data structure
5762306a36Sopenharmony_ci * holding the parent info.
5862306a36Sopenharmony_ci */
5962306a36Sopenharmony_ci#define SUNXI_CCU_GATE_HWS(_struct, _name, _parent, _reg, _gate, _flags) \
6062306a36Sopenharmony_ci	struct ccu_gate _struct = {					\
6162306a36Sopenharmony_ci		.enable	= _gate,					\
6262306a36Sopenharmony_ci		.common	= {						\
6362306a36Sopenharmony_ci			.reg		= _reg,				\
6462306a36Sopenharmony_ci			.hw.init	= CLK_HW_INIT_HWS(_name,	\
6562306a36Sopenharmony_ci							  _parent,	\
6662306a36Sopenharmony_ci							  &ccu_gate_ops, \
6762306a36Sopenharmony_ci							  _flags),	\
6862306a36Sopenharmony_ci		}							\
6962306a36Sopenharmony_ci	}
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci#define SUNXI_CCU_GATE_HWS_WITH_PREDIV(_struct, _name, _parent, _reg,	\
7262306a36Sopenharmony_ci				       _gate, _prediv, _flags)		\
7362306a36Sopenharmony_ci	struct ccu_gate _struct = {					\
7462306a36Sopenharmony_ci		.enable	= _gate,					\
7562306a36Sopenharmony_ci		.common	= {						\
7662306a36Sopenharmony_ci			.reg		= _reg,				\
7762306a36Sopenharmony_ci			.prediv		= _prediv,			\
7862306a36Sopenharmony_ci			.features	= CCU_FEATURE_ALL_PREDIV,	\
7962306a36Sopenharmony_ci			.hw.init	= CLK_HW_INIT_HWS(_name,	\
8062306a36Sopenharmony_ci							  _parent,	\
8162306a36Sopenharmony_ci							  &ccu_gate_ops, \
8262306a36Sopenharmony_ci							  _flags),	\
8362306a36Sopenharmony_ci		}							\
8462306a36Sopenharmony_ci	}
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci#define SUNXI_CCU_GATE_DATA(_struct, _name, _data, _reg, _gate, _flags)	\
8762306a36Sopenharmony_ci	struct ccu_gate _struct = {					\
8862306a36Sopenharmony_ci		.enable	= _gate,					\
8962306a36Sopenharmony_ci		.common	= {						\
9062306a36Sopenharmony_ci			.reg		= _reg,				\
9162306a36Sopenharmony_ci			.hw.init	=				\
9262306a36Sopenharmony_ci				CLK_HW_INIT_PARENTS_DATA(_name,		\
9362306a36Sopenharmony_ci							 _data,		\
9462306a36Sopenharmony_ci							 &ccu_gate_ops,	\
9562306a36Sopenharmony_ci							 _flags),	\
9662306a36Sopenharmony_ci		}							\
9762306a36Sopenharmony_ci	}
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci#define SUNXI_CCU_GATE_DATA_WITH_PREDIV(_struct, _name, _parent, _reg,	\
10062306a36Sopenharmony_ci					_gate, _prediv, _flags)		\
10162306a36Sopenharmony_ci	struct ccu_gate _struct = {					\
10262306a36Sopenharmony_ci		.enable	= _gate,					\
10362306a36Sopenharmony_ci		.common	= {						\
10462306a36Sopenharmony_ci			.reg		= _reg,				\
10562306a36Sopenharmony_ci			.prediv		= _prediv,			\
10662306a36Sopenharmony_ci			.features	= CCU_FEATURE_ALL_PREDIV,	\
10762306a36Sopenharmony_ci			.hw.init	= CLK_HW_INIT_PARENTS_DATA(_name, \
10862306a36Sopenharmony_ci								   _parent, \
10962306a36Sopenharmony_ci								   &ccu_gate_ops, \
11062306a36Sopenharmony_ci								   _flags), \
11162306a36Sopenharmony_ci		}							\
11262306a36Sopenharmony_ci	}
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_cistatic inline struct ccu_gate *hw_to_ccu_gate(struct clk_hw *hw)
11562306a36Sopenharmony_ci{
11662306a36Sopenharmony_ci	struct ccu_common *common = hw_to_ccu_common(hw);
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci	return container_of(common, struct ccu_gate, common);
11962306a36Sopenharmony_ci}
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_civoid ccu_gate_helper_disable(struct ccu_common *common, u32 gate);
12262306a36Sopenharmony_ciint ccu_gate_helper_enable(struct ccu_common *common, u32 gate);
12362306a36Sopenharmony_ciint ccu_gate_helper_is_enabled(struct ccu_common *common, u32 gate);
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ciextern const struct clk_ops ccu_gate_ops;
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ci#endif /* _CCU_GATE_H_ */
128