18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci//
38c2ecf20Sopenharmony_ci// Spreadtrum gate clock driver
48c2ecf20Sopenharmony_ci//
58c2ecf20Sopenharmony_ci// Copyright (C) 2017 Spreadtrum, Inc.
68c2ecf20Sopenharmony_ci// Author: Chunyan Zhang <chunyan.zhang@spreadtrum.com>
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#ifndef _SPRD_GATE_H_
98c2ecf20Sopenharmony_ci#define _SPRD_GATE_H_
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#include "common.h"
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_cistruct sprd_gate {
148c2ecf20Sopenharmony_ci	u32			enable_mask;
158c2ecf20Sopenharmony_ci	u16			flags;
168c2ecf20Sopenharmony_ci	u16			sc_offset;
178c2ecf20Sopenharmony_ci	u16			udelay;
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci	struct sprd_clk_common	common;
208c2ecf20Sopenharmony_ci};
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci/*
238c2ecf20Sopenharmony_ci * sprd_gate->flags is used for:
248c2ecf20Sopenharmony_ci * CLK_GATE_SET_TO_DISABLE	BIT(0)
258c2ecf20Sopenharmony_ci * CLK_GATE_HIWORD_MASK		BIT(1)
268c2ecf20Sopenharmony_ci * CLK_GATE_BIG_ENDIAN		BIT(2)
278c2ecf20Sopenharmony_ci * so we define new flags from	BIT(3)
288c2ecf20Sopenharmony_ci */
298c2ecf20Sopenharmony_ci#define SPRD_GATE_NON_AON BIT(3) /* not alway powered on, check before read */
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci#define SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg,	\
328c2ecf20Sopenharmony_ci				    _sc_offset, _enable_mask, _flags,	\
338c2ecf20Sopenharmony_ci				    _gate_flags, _udelay, _ops, _fn)	\
348c2ecf20Sopenharmony_ci	struct sprd_gate _struct = {					\
358c2ecf20Sopenharmony_ci		.enable_mask	= _enable_mask,				\
368c2ecf20Sopenharmony_ci		.sc_offset	= _sc_offset,				\
378c2ecf20Sopenharmony_ci		.flags		= _gate_flags,				\
388c2ecf20Sopenharmony_ci		.udelay		= _udelay,				\
398c2ecf20Sopenharmony_ci		.common	= {						\
408c2ecf20Sopenharmony_ci			.regmap		= NULL,				\
418c2ecf20Sopenharmony_ci			.reg		= _reg,				\
428c2ecf20Sopenharmony_ci			.hw.init	= _fn(_name, _parent,		\
438c2ecf20Sopenharmony_ci					      _ops, _flags),		\
448c2ecf20Sopenharmony_ci		}							\
458c2ecf20Sopenharmony_ci	}
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci#define SPRD_SC_GATE_CLK_OPS_UDELAY(_struct, _name, _parent, _reg,	\
488c2ecf20Sopenharmony_ci				    _sc_offset, _enable_mask, _flags,	\
498c2ecf20Sopenharmony_ci				    _gate_flags, _udelay, _ops)		\
508c2ecf20Sopenharmony_ci	SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg,	\
518c2ecf20Sopenharmony_ci				    _sc_offset, _enable_mask, _flags,	\
528c2ecf20Sopenharmony_ci				    _gate_flags, _udelay, _ops, CLK_HW_INIT)
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_ci#define SPRD_SC_GATE_CLK_OPS(_struct, _name, _parent, _reg, _sc_offset,	\
558c2ecf20Sopenharmony_ci			     _enable_mask, _flags, _gate_flags, _ops)	\
568c2ecf20Sopenharmony_ci	SPRD_SC_GATE_CLK_OPS_UDELAY(_struct, _name, _parent, _reg,	\
578c2ecf20Sopenharmony_ci				    _sc_offset, _enable_mask, _flags,	\
588c2ecf20Sopenharmony_ci				    _gate_flags, 0, _ops)
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ci#define SPRD_SC_GATE_CLK(_struct, _name, _parent, _reg, _sc_offset,	\
618c2ecf20Sopenharmony_ci			 _enable_mask, _flags, _gate_flags)		\
628c2ecf20Sopenharmony_ci	SPRD_SC_GATE_CLK_OPS(_struct, _name, _parent, _reg, _sc_offset,	\
638c2ecf20Sopenharmony_ci			     _enable_mask, _flags, _gate_flags,		\
648c2ecf20Sopenharmony_ci			     &sprd_sc_gate_ops)
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_ci#define SPRD_GATE_CLK(_struct, _name, _parent, _reg,			\
678c2ecf20Sopenharmony_ci		      _enable_mask, _flags, _gate_flags)		\
688c2ecf20Sopenharmony_ci	SPRD_SC_GATE_CLK_OPS(_struct, _name, _parent, _reg, 0,		\
698c2ecf20Sopenharmony_ci			     _enable_mask, _flags, _gate_flags,		\
708c2ecf20Sopenharmony_ci			     &sprd_gate_ops)
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_ci#define SPRD_PLL_SC_GATE_CLK(_struct, _name, _parent, _reg, _sc_offset,	\
738c2ecf20Sopenharmony_ci			     _enable_mask, _flags, _gate_flags,		\
748c2ecf20Sopenharmony_ci			     _udelay)					\
758c2ecf20Sopenharmony_ci	SPRD_SC_GATE_CLK_OPS_UDELAY(_struct, _name, _parent, _reg,	\
768c2ecf20Sopenharmony_ci				    _sc_offset,	_enable_mask, _flags,	\
778c2ecf20Sopenharmony_ci				    _gate_flags, _udelay,		\
788c2ecf20Sopenharmony_ci				    &sprd_pll_sc_gate_ops)
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_ci#define SPRD_SC_GATE_CLK_HW_OPS_UDELAY(_struct, _name, _parent, _reg,	\
828c2ecf20Sopenharmony_ci				       _sc_offset, _enable_mask,	\
838c2ecf20Sopenharmony_ci				       _flags, _gate_flags,		\
848c2ecf20Sopenharmony_ci				       _udelay, _ops)			\
858c2ecf20Sopenharmony_ci	SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg,	\
868c2ecf20Sopenharmony_ci				    _sc_offset, _enable_mask, _flags,	\
878c2ecf20Sopenharmony_ci				    _gate_flags, _udelay, _ops,		\
888c2ecf20Sopenharmony_ci				    CLK_HW_INIT_HW)
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_ci#define SPRD_SC_GATE_CLK_HW_OPS(_struct, _name, _parent, _reg,		\
918c2ecf20Sopenharmony_ci				_sc_offset, _enable_mask, _flags,	\
928c2ecf20Sopenharmony_ci				_gate_flags, _ops)			\
938c2ecf20Sopenharmony_ci	SPRD_SC_GATE_CLK_HW_OPS_UDELAY(_struct, _name, _parent, _reg,	\
948c2ecf20Sopenharmony_ci				       _sc_offset, _enable_mask,	\
958c2ecf20Sopenharmony_ci				       _flags, _gate_flags, 0, _ops)
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_ci#define SPRD_SC_GATE_CLK_HW(_struct, _name, _parent, _reg,		\
988c2ecf20Sopenharmony_ci			    _sc_offset, _enable_mask, _flags,		\
998c2ecf20Sopenharmony_ci			    _gate_flags)				\
1008c2ecf20Sopenharmony_ci	SPRD_SC_GATE_CLK_HW_OPS(_struct, _name, _parent, _reg,		\
1018c2ecf20Sopenharmony_ci				_sc_offset, _enable_mask, _flags,	\
1028c2ecf20Sopenharmony_ci				_gate_flags, &sprd_sc_gate_ops)
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_ci#define SPRD_GATE_CLK_HW(_struct, _name, _parent, _reg,			\
1058c2ecf20Sopenharmony_ci			 _enable_mask, _flags, _gate_flags)		\
1068c2ecf20Sopenharmony_ci	SPRD_SC_GATE_CLK_HW_OPS(_struct, _name, _parent, _reg, 0,	\
1078c2ecf20Sopenharmony_ci				_enable_mask, _flags, _gate_flags,	\
1088c2ecf20Sopenharmony_ci				&sprd_gate_ops)
1098c2ecf20Sopenharmony_ci
1108c2ecf20Sopenharmony_ci#define SPRD_PLL_SC_GATE_CLK_HW(_struct, _name, _parent, _reg,		\
1118c2ecf20Sopenharmony_ci				_sc_offset, _enable_mask, _flags,	\
1128c2ecf20Sopenharmony_ci				_gate_flags, _udelay)			\
1138c2ecf20Sopenharmony_ci	SPRD_SC_GATE_CLK_HW_OPS_UDELAY(_struct, _name, _parent, _reg,	\
1148c2ecf20Sopenharmony_ci				       _sc_offset, _enable_mask,	\
1158c2ecf20Sopenharmony_ci				       _flags, _gate_flags, _udelay,	\
1168c2ecf20Sopenharmony_ci				       &sprd_pll_sc_gate_ops)
1178c2ecf20Sopenharmony_ci
1188c2ecf20Sopenharmony_ci#define SPRD_SC_GATE_CLK_FW_NAME_OPS_UDELAY(_struct, _name, _parent,	\
1198c2ecf20Sopenharmony_ci					    _reg, _sc_offset,		\
1208c2ecf20Sopenharmony_ci					    _enable_mask, _flags,	\
1218c2ecf20Sopenharmony_ci					    _gate_flags, _udelay, _ops)	\
1228c2ecf20Sopenharmony_ci	SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg,	\
1238c2ecf20Sopenharmony_ci				    _sc_offset, _enable_mask, _flags,	\
1248c2ecf20Sopenharmony_ci				    _gate_flags, _udelay, _ops,		\
1258c2ecf20Sopenharmony_ci				    CLK_HW_INIT_FW_NAME)
1268c2ecf20Sopenharmony_ci
1278c2ecf20Sopenharmony_ci#define SPRD_SC_GATE_CLK_FW_NAME_OPS(_struct, _name, _parent, _reg,	\
1288c2ecf20Sopenharmony_ci				     _sc_offset, _enable_mask, _flags,	\
1298c2ecf20Sopenharmony_ci				     _gate_flags, _ops)			\
1308c2ecf20Sopenharmony_ci	SPRD_SC_GATE_CLK_FW_NAME_OPS_UDELAY(_struct, _name, _parent,	\
1318c2ecf20Sopenharmony_ci					    _reg, _sc_offset,		\
1328c2ecf20Sopenharmony_ci					    _enable_mask, _flags,	\
1338c2ecf20Sopenharmony_ci					    _gate_flags, 0, _ops)
1348c2ecf20Sopenharmony_ci
1358c2ecf20Sopenharmony_ci#define SPRD_SC_GATE_CLK_FW_NAME(_struct, _name, _parent, _reg,		\
1368c2ecf20Sopenharmony_ci				 _sc_offset, _enable_mask, _flags,	\
1378c2ecf20Sopenharmony_ci				 _gate_flags)				\
1388c2ecf20Sopenharmony_ci	SPRD_SC_GATE_CLK_FW_NAME_OPS(_struct, _name, _parent, _reg,	\
1398c2ecf20Sopenharmony_ci				     _sc_offset, _enable_mask, _flags,	\
1408c2ecf20Sopenharmony_ci				     _gate_flags, &sprd_sc_gate_ops)
1418c2ecf20Sopenharmony_ci
1428c2ecf20Sopenharmony_ci#define SPRD_GATE_CLK_FW_NAME(_struct, _name, _parent, _reg,		\
1438c2ecf20Sopenharmony_ci			      _enable_mask, _flags, _gate_flags)	\
1448c2ecf20Sopenharmony_ci	SPRD_SC_GATE_CLK_FW_NAME_OPS(_struct, _name, _parent, _reg, 0,	\
1458c2ecf20Sopenharmony_ci				     _enable_mask, _flags, _gate_flags,	\
1468c2ecf20Sopenharmony_ci				     &sprd_gate_ops)
1478c2ecf20Sopenharmony_ci
1488c2ecf20Sopenharmony_ci#define SPRD_PLL_SC_GATE_CLK_FW_NAME(_struct, _name, _parent, _reg,	\
1498c2ecf20Sopenharmony_ci				     _sc_offset, _enable_mask, _flags,	\
1508c2ecf20Sopenharmony_ci				     _gate_flags, _udelay)		\
1518c2ecf20Sopenharmony_ci	SPRD_SC_GATE_CLK_FW_NAME_OPS_UDELAY(_struct, _name, _parent,	\
1528c2ecf20Sopenharmony_ci					    _reg, _sc_offset,		\
1538c2ecf20Sopenharmony_ci					    _enable_mask, _flags,	\
1548c2ecf20Sopenharmony_ci					    _gate_flags, _udelay,	\
1558c2ecf20Sopenharmony_ci					    &sprd_pll_sc_gate_ops)
1568c2ecf20Sopenharmony_ci
1578c2ecf20Sopenharmony_cistatic inline struct sprd_gate *hw_to_sprd_gate(const struct clk_hw *hw)
1588c2ecf20Sopenharmony_ci{
1598c2ecf20Sopenharmony_ci	struct sprd_clk_common *common = hw_to_sprd_clk_common(hw);
1608c2ecf20Sopenharmony_ci
1618c2ecf20Sopenharmony_ci	return container_of(common, struct sprd_gate, common);
1628c2ecf20Sopenharmony_ci}
1638c2ecf20Sopenharmony_ci
1648c2ecf20Sopenharmony_ciextern const struct clk_ops sprd_gate_ops;
1658c2ecf20Sopenharmony_ciextern const struct clk_ops sprd_sc_gate_ops;
1668c2ecf20Sopenharmony_ciextern const struct clk_ops sprd_pll_sc_gate_ops;
1678c2ecf20Sopenharmony_ci
1688c2ecf20Sopenharmony_ci#endif /* _SPRD_GATE_H_ */
169