10Sstevel@tonic-gate/* SPDX-License-Identifier: GPL-2.0 */
20Sstevel@tonic-gate//
30Sstevel@tonic-gate// Spreadtrum gate clock driver
40Sstevel@tonic-gate//
51103Sjbeloro// Copyright (C) 2017 Spreadtrum, Inc.
61103Sjbeloro// Author: Chunyan Zhang <chunyan.zhang@spreadtrum.com>
70Sstevel@tonic-gate
80Sstevel@tonic-gate#ifndef _SPRD_GATE_H_
90Sstevel@tonic-gate#define _SPRD_GATE_H_
100Sstevel@tonic-gate
110Sstevel@tonic-gate#include "common.h"
120Sstevel@tonic-gate
130Sstevel@tonic-gatestruct sprd_gate {
140Sstevel@tonic-gate	u32			enable_mask;
150Sstevel@tonic-gate	u16			flags;
160Sstevel@tonic-gate	u16			sc_offset;
170Sstevel@tonic-gate	u16			udelay;
180Sstevel@tonic-gate
190Sstevel@tonic-gate	struct sprd_clk_common	common;
200Sstevel@tonic-gate};
211103Sjbeloro
220Sstevel@tonic-gate/*
238574SJason.Beloro@Sun.COM * sprd_gate->flags is used for:
240Sstevel@tonic-gate * CLK_GATE_SET_TO_DISABLE	BIT(0)
250Sstevel@tonic-gate * CLK_GATE_HIWORD_MASK		BIT(1)
260Sstevel@tonic-gate * CLK_GATE_BIG_ENDIAN		BIT(2)
270Sstevel@tonic-gate * so we define new flags from	BIT(3)
280Sstevel@tonic-gate */
290Sstevel@tonic-gate#define SPRD_GATE_NON_AON BIT(3) /* not alway powered on, check before read */
300Sstevel@tonic-gate
310Sstevel@tonic-gate#define SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg,	\
320Sstevel@tonic-gate				    _sc_offset, _enable_mask, _flags,	\
330Sstevel@tonic-gate				    _gate_flags, _udelay, _ops, _fn)	\
340Sstevel@tonic-gate	struct sprd_gate _struct = {					\
350Sstevel@tonic-gate		.enable_mask	= _enable_mask,				\
360Sstevel@tonic-gate		.sc_offset	= _sc_offset,				\
370Sstevel@tonic-gate		.flags		= _gate_flags,				\
380Sstevel@tonic-gate		.udelay		= _udelay,				\
390Sstevel@tonic-gate		.common	= {						\
400Sstevel@tonic-gate			.regmap		= NULL,				\
410Sstevel@tonic-gate			.reg		= _reg,				\
420Sstevel@tonic-gate			.hw.init	= _fn(_name, _parent,		\
430Sstevel@tonic-gate					      _ops, _flags),		\
440Sstevel@tonic-gate		}							\
450Sstevel@tonic-gate	}
460Sstevel@tonic-gate
470Sstevel@tonic-gate#define SPRD_SC_GATE_CLK_OPS_UDELAY(_struct, _name, _parent, _reg,	\
480Sstevel@tonic-gate				    _sc_offset, _enable_mask, _flags,	\
490Sstevel@tonic-gate				    _gate_flags, _udelay, _ops)		\
500Sstevel@tonic-gate	SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg,	\
510Sstevel@tonic-gate				    _sc_offset, _enable_mask, _flags,	\
529249SJaven.Wu@Sun.COM				    _gate_flags, _udelay, _ops, CLK_HW_INIT)
530Sstevel@tonic-gate
540Sstevel@tonic-gate#define SPRD_SC_GATE_CLK_OPS(_struct, _name, _parent, _reg, _sc_offset,	\
550Sstevel@tonic-gate			     _enable_mask, _flags, _gate_flags, _ops)	\
560Sstevel@tonic-gate	SPRD_SC_GATE_CLK_OPS_UDELAY(_struct, _name, _parent, _reg,	\
570Sstevel@tonic-gate				    _sc_offset, _enable_mask, _flags,	\
580Sstevel@tonic-gate				    _gate_flags, 0, _ops)
590Sstevel@tonic-gate
600Sstevel@tonic-gate#define SPRD_SC_GATE_CLK(_struct, _name, _parent, _reg, _sc_offset,	\
610Sstevel@tonic-gate			 _enable_mask, _flags, _gate_flags)		\
620Sstevel@tonic-gate	SPRD_SC_GATE_CLK_OPS(_struct, _name, _parent, _reg, _sc_offset,	\
630Sstevel@tonic-gate			     _enable_mask, _flags, _gate_flags,		\
640Sstevel@tonic-gate			     &sprd_sc_gate_ops)
650Sstevel@tonic-gate
660Sstevel@tonic-gate#define SPRD_GATE_CLK(_struct, _name, _parent, _reg,			\
670Sstevel@tonic-gate		      _enable_mask, _flags, _gate_flags)		\
680Sstevel@tonic-gate	SPRD_SC_GATE_CLK_OPS(_struct, _name, _parent, _reg, 0,		\
690Sstevel@tonic-gate			     _enable_mask, _flags, _gate_flags,		\
700Sstevel@tonic-gate			     &sprd_gate_ops)
710Sstevel@tonic-gate
720Sstevel@tonic-gate#define SPRD_PLL_SC_GATE_CLK(_struct, _name, _parent, _reg, _sc_offset,	\
730Sstevel@tonic-gate			     _enable_mask, _flags, _gate_flags,		\
740Sstevel@tonic-gate			     _udelay)					\
750Sstevel@tonic-gate	SPRD_SC_GATE_CLK_OPS_UDELAY(_struct, _name, _parent, _reg,	\
760Sstevel@tonic-gate				    _sc_offset,	_enable_mask, _flags,	\
770Sstevel@tonic-gate				    _gate_flags, _udelay,		\
780Sstevel@tonic-gate				    &sprd_pll_sc_gate_ops)
790Sstevel@tonic-gate
800Sstevel@tonic-gate
810Sstevel@tonic-gate#define SPRD_SC_GATE_CLK_HW_OPS_UDELAY(_struct, _name, _parent, _reg,	\
820Sstevel@tonic-gate				       _sc_offset, _enable_mask,	\
830Sstevel@tonic-gate				       _flags, _gate_flags,		\
840Sstevel@tonic-gate				       _udelay, _ops)			\
850Sstevel@tonic-gate	SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg,	\
860Sstevel@tonic-gate				    _sc_offset, _enable_mask, _flags,	\
870Sstevel@tonic-gate				    _gate_flags, _udelay, _ops,		\
88944Svenki				    CLK_HW_INIT_HW)
890Sstevel@tonic-gate
900Sstevel@tonic-gate#define SPRD_SC_GATE_CLK_HW_OPS(_struct, _name, _parent, _reg,		\
910Sstevel@tonic-gate				_sc_offset, _enable_mask, _flags,	\
920Sstevel@tonic-gate				_gate_flags, _ops)			\
930Sstevel@tonic-gate	SPRD_SC_GATE_CLK_HW_OPS_UDELAY(_struct, _name, _parent, _reg,	\
940Sstevel@tonic-gate				       _sc_offset, _enable_mask,	\
950Sstevel@tonic-gate				       _flags, _gate_flags, 0, _ops)
960Sstevel@tonic-gate
970Sstevel@tonic-gate#define SPRD_SC_GATE_CLK_HW(_struct, _name, _parent, _reg,		\
980Sstevel@tonic-gate			    _sc_offset, _enable_mask, _flags,		\
990Sstevel@tonic-gate			    _gate_flags)				\
1000Sstevel@tonic-gate	SPRD_SC_GATE_CLK_HW_OPS(_struct, _name, _parent, _reg,		\
1010Sstevel@tonic-gate				_sc_offset, _enable_mask, _flags,	\
1020Sstevel@tonic-gate				_gate_flags, &sprd_sc_gate_ops)
1030Sstevel@tonic-gate
1040Sstevel@tonic-gate#define SPRD_GATE_CLK_HW(_struct, _name, _parent, _reg,			\
1050Sstevel@tonic-gate			 _enable_mask, _flags, _gate_flags)		\
1060Sstevel@tonic-gate	SPRD_SC_GATE_CLK_HW_OPS(_struct, _name, _parent, _reg, 0,	\
1070Sstevel@tonic-gate				_enable_mask, _flags, _gate_flags,	\
1080Sstevel@tonic-gate				&sprd_gate_ops)
1091103Sjbeloro
1107834SMichael.Bergknoff@Sun.COM#define SPRD_PLL_SC_GATE_CLK_HW(_struct, _name, _parent, _reg,		\
1110Sstevel@tonic-gate				_sc_offset, _enable_mask, _flags,	\
1120Sstevel@tonic-gate				_gate_flags, _udelay)			\
1133941Svenki	SPRD_SC_GATE_CLK_HW_OPS_UDELAY(_struct, _name, _parent, _reg,	\
1143941Svenki				       _sc_offset, _enable_mask,	\
1153941Svenki				       _flags, _gate_flags, _udelay,	\
1163941Svenki				       &sprd_pll_sc_gate_ops)
1173941Svenki
1183941Svenki#define SPRD_SC_GATE_CLK_FW_NAME_OPS_UDELAY(_struct, _name, _parent,	\
1193941Svenki					    _reg, _sc_offset,		\
1203941Svenki					    _enable_mask, _flags,	\
1213941Svenki					    _gate_flags, _udelay, _ops)	\
1223941Svenki	SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg,	\
1233941Svenki				    _sc_offset, _enable_mask, _flags,	\
1243941Svenki				    _gate_flags, _udelay, _ops,		\
1253941Svenki				    CLK_HW_INIT_FW_NAME)
1263941Svenki
1273941Svenki#define SPRD_SC_GATE_CLK_FW_NAME_OPS(_struct, _name, _parent, _reg,	\
1283941Svenki				     _sc_offset, _enable_mask, _flags,	\
1293941Svenki				     _gate_flags, _ops)			\
1303941Svenki	SPRD_SC_GATE_CLK_FW_NAME_OPS_UDELAY(_struct, _name, _parent,	\
1313941Svenki					    _reg, _sc_offset,		\
1323941Svenki					    _enable_mask, _flags,	\
1333941Svenki					    _gate_flags, 0, _ops)
1340Sstevel@tonic-gate
1350Sstevel@tonic-gate#define SPRD_SC_GATE_CLK_FW_NAME(_struct, _name, _parent, _reg,		\
1360Sstevel@tonic-gate				 _sc_offset, _enable_mask, _flags,	\
1370Sstevel@tonic-gate				 _gate_flags)				\
1380Sstevel@tonic-gate	SPRD_SC_GATE_CLK_FW_NAME_OPS(_struct, _name, _parent, _reg,	\
1390Sstevel@tonic-gate				     _sc_offset, _enable_mask, _flags,	\
1400Sstevel@tonic-gate				     _gate_flags, &sprd_sc_gate_ops)
1410Sstevel@tonic-gate
1420Sstevel@tonic-gate#define SPRD_GATE_CLK_FW_NAME(_struct, _name, _parent, _reg,		\
1430Sstevel@tonic-gate			      _enable_mask, _flags, _gate_flags)	\
1440Sstevel@tonic-gate	SPRD_SC_GATE_CLK_FW_NAME_OPS(_struct, _name, _parent, _reg, 0,	\
1450Sstevel@tonic-gate				     _enable_mask, _flags, _gate_flags,	\
1460Sstevel@tonic-gate				     &sprd_gate_ops)
1470Sstevel@tonic-gate
1480Sstevel@tonic-gate#define SPRD_PLL_SC_GATE_CLK_FW_NAME(_struct, _name, _parent, _reg,	\
1490Sstevel@tonic-gate				     _sc_offset, _enable_mask, _flags,	\
1500Sstevel@tonic-gate				     _gate_flags, _udelay)		\
1510Sstevel@tonic-gate	SPRD_SC_GATE_CLK_FW_NAME_OPS_UDELAY(_struct, _name, _parent,	\
1520Sstevel@tonic-gate					    _reg, _sc_offset,		\
1530Sstevel@tonic-gate					    _enable_mask, _flags,	\
1540Sstevel@tonic-gate					    _gate_flags, _udelay,	\
1550Sstevel@tonic-gate					    &sprd_pll_sc_gate_ops)
1560Sstevel@tonic-gate
1570Sstevel@tonic-gatestatic inline struct sprd_gate *hw_to_sprd_gate(const struct clk_hw *hw)
1580Sstevel@tonic-gate{
1590Sstevel@tonic-gate	struct sprd_clk_common *common = hw_to_sprd_clk_common(hw);
1600Sstevel@tonic-gate
1610Sstevel@tonic-gate	return container_of(common, struct sprd_gate, common);
1620Sstevel@tonic-gate}
1630Sstevel@tonic-gate
1640Sstevel@tonic-gateextern const struct clk_ops sprd_gate_ops;
1650Sstevel@tonic-gateextern const struct clk_ops sprd_sc_gate_ops;
1660Sstevel@tonic-gateextern const struct clk_ops sprd_pll_sc_gate_ops;
1670Sstevel@tonic-gate
1680Sstevel@tonic-gate#endif /* _SPRD_GATE_H_ */
1690Sstevel@tonic-gate