Linux Audio

Check our new training course

Linux debugging, profiling, tracing and performance analysis training

Apr 14-17, 2025
Register
Loading...
Note: File does not exist in v3.5.6.
  1/* SPDX-License-Identifier: GPL-2.0 */
  2//
  3// Spreadtrum gate clock driver
  4//
  5// Copyright (C) 2017 Spreadtrum, Inc.
  6// Author: Chunyan Zhang <chunyan.zhang@spreadtrum.com>
  7
  8#ifndef _SPRD_GATE_H_
  9#define _SPRD_GATE_H_
 10
 11#include "common.h"
 12
 13struct sprd_gate {
 14	u32			enable_mask;
 15	u16			flags;
 16	u16			sc_offset;
 17	u16			udelay;
 18
 19	struct sprd_clk_common	common;
 20};
 21
 22/*
 23 * sprd_gate->flags is used for:
 24 * CLK_GATE_SET_TO_DISABLE	BIT(0)
 25 * CLK_GATE_HIWORD_MASK		BIT(1)
 26 * CLK_GATE_BIG_ENDIAN		BIT(2)
 27 * so we define new flags from	BIT(3)
 28 */
 29#define SPRD_GATE_NON_AON BIT(3) /* not alway powered on, check before read */
 30
 31#define SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg,	\
 32				    _sc_offset, _enable_mask, _flags,	\
 33				    _gate_flags, _udelay, _ops, _fn)	\
 34	struct sprd_gate _struct = {					\
 35		.enable_mask	= _enable_mask,				\
 36		.sc_offset	= _sc_offset,				\
 37		.flags		= _gate_flags,				\
 38		.udelay		= _udelay,				\
 39		.common	= {						\
 40			.regmap		= NULL,				\
 41			.reg		= _reg,				\
 42			.hw.init	= _fn(_name, _parent,		\
 43					      _ops, _flags),		\
 44		}							\
 45	}
 46
 47#define SPRD_SC_GATE_CLK_OPS_UDELAY(_struct, _name, _parent, _reg,	\
 48				    _sc_offset, _enable_mask, _flags,	\
 49				    _gate_flags, _udelay, _ops)		\
 50	SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg,	\
 51				    _sc_offset, _enable_mask, _flags,	\
 52				    _gate_flags, _udelay, _ops, CLK_HW_INIT)
 53
 54#define SPRD_SC_GATE_CLK_OPS(_struct, _name, _parent, _reg, _sc_offset,	\
 55			     _enable_mask, _flags, _gate_flags, _ops)	\
 56	SPRD_SC_GATE_CLK_OPS_UDELAY(_struct, _name, _parent, _reg,	\
 57				    _sc_offset, _enable_mask, _flags,	\
 58				    _gate_flags, 0, _ops)
 59
 60#define SPRD_SC_GATE_CLK(_struct, _name, _parent, _reg, _sc_offset,	\
 61			 _enable_mask, _flags, _gate_flags)		\
 62	SPRD_SC_GATE_CLK_OPS(_struct, _name, _parent, _reg, _sc_offset,	\
 63			     _enable_mask, _flags, _gate_flags,		\
 64			     &sprd_sc_gate_ops)
 65
 66#define SPRD_GATE_CLK(_struct, _name, _parent, _reg,			\
 67		      _enable_mask, _flags, _gate_flags)		\
 68	SPRD_SC_GATE_CLK_OPS(_struct, _name, _parent, _reg, 0,		\
 69			     _enable_mask, _flags, _gate_flags,		\
 70			     &sprd_gate_ops)
 71
 72#define SPRD_PLL_SC_GATE_CLK(_struct, _name, _parent, _reg, _sc_offset,	\
 73			     _enable_mask, _flags, _gate_flags,		\
 74			     _udelay)					\
 75	SPRD_SC_GATE_CLK_OPS_UDELAY(_struct, _name, _parent, _reg,	\
 76				    _sc_offset,	_enable_mask, _flags,	\
 77				    _gate_flags, _udelay,		\
 78				    &sprd_pll_sc_gate_ops)
 79
 80
 81#define SPRD_SC_GATE_CLK_HW_OPS_UDELAY(_struct, _name, _parent, _reg,	\
 82				       _sc_offset, _enable_mask,	\
 83				       _flags, _gate_flags,		\
 84				       _udelay, _ops)			\
 85	SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg,	\
 86				    _sc_offset, _enable_mask, _flags,	\
 87				    _gate_flags, _udelay, _ops,		\
 88				    CLK_HW_INIT_HW)
 89
 90#define SPRD_SC_GATE_CLK_HW_OPS(_struct, _name, _parent, _reg,		\
 91				_sc_offset, _enable_mask, _flags,	\
 92				_gate_flags, _ops)			\
 93	SPRD_SC_GATE_CLK_HW_OPS_UDELAY(_struct, _name, _parent, _reg,	\
 94				       _sc_offset, _enable_mask,	\
 95				       _flags, _gate_flags, 0, _ops)
 96
 97#define SPRD_SC_GATE_CLK_HW(_struct, _name, _parent, _reg,		\
 98			    _sc_offset, _enable_mask, _flags,		\
 99			    _gate_flags)				\
100	SPRD_SC_GATE_CLK_HW_OPS(_struct, _name, _parent, _reg,		\
101				_sc_offset, _enable_mask, _flags,	\
102				_gate_flags, &sprd_sc_gate_ops)
103
104#define SPRD_GATE_CLK_HW(_struct, _name, _parent, _reg,			\
105			 _enable_mask, _flags, _gate_flags)		\
106	SPRD_SC_GATE_CLK_HW_OPS(_struct, _name, _parent, _reg, 0,	\
107				_enable_mask, _flags, _gate_flags,	\
108				&sprd_gate_ops)
109
110#define SPRD_PLL_SC_GATE_CLK_HW(_struct, _name, _parent, _reg,		\
111				_sc_offset, _enable_mask, _flags,	\
112				_gate_flags, _udelay)			\
113	SPRD_SC_GATE_CLK_HW_OPS_UDELAY(_struct, _name, _parent, _reg,	\
114				       _sc_offset, _enable_mask,	\
115				       _flags, _gate_flags, _udelay,	\
116				       &sprd_pll_sc_gate_ops)
117
118#define SPRD_SC_GATE_CLK_FW_NAME_OPS_UDELAY(_struct, _name, _parent,	\
119					    _reg, _sc_offset,		\
120					    _enable_mask, _flags,	\
121					    _gate_flags, _udelay, _ops)	\
122	SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg,	\
123				    _sc_offset, _enable_mask, _flags,	\
124				    _gate_flags, _udelay, _ops,		\
125				    CLK_HW_INIT_FW_NAME)
126
127#define SPRD_SC_GATE_CLK_FW_NAME_OPS(_struct, _name, _parent, _reg,	\
128				     _sc_offset, _enable_mask, _flags,	\
129				     _gate_flags, _ops)			\
130	SPRD_SC_GATE_CLK_FW_NAME_OPS_UDELAY(_struct, _name, _parent,	\
131					    _reg, _sc_offset,		\
132					    _enable_mask, _flags,	\
133					    _gate_flags, 0, _ops)
134
135#define SPRD_SC_GATE_CLK_FW_NAME(_struct, _name, _parent, _reg,		\
136				 _sc_offset, _enable_mask, _flags,	\
137				 _gate_flags)				\
138	SPRD_SC_GATE_CLK_FW_NAME_OPS(_struct, _name, _parent, _reg,	\
139				     _sc_offset, _enable_mask, _flags,	\
140				     _gate_flags, &sprd_sc_gate_ops)
141
142#define SPRD_GATE_CLK_FW_NAME(_struct, _name, _parent, _reg,		\
143			      _enable_mask, _flags, _gate_flags)	\
144	SPRD_SC_GATE_CLK_FW_NAME_OPS(_struct, _name, _parent, _reg, 0,	\
145				     _enable_mask, _flags, _gate_flags,	\
146				     &sprd_gate_ops)
147
148#define SPRD_PLL_SC_GATE_CLK_FW_NAME(_struct, _name, _parent, _reg,	\
149				     _sc_offset, _enable_mask, _flags,	\
150				     _gate_flags, _udelay)		\
151	SPRD_SC_GATE_CLK_FW_NAME_OPS_UDELAY(_struct, _name, _parent,	\
152					    _reg, _sc_offset,		\
153					    _enable_mask, _flags,	\
154					    _gate_flags, _udelay,	\
155					    &sprd_pll_sc_gate_ops)
156
157static inline struct sprd_gate *hw_to_sprd_gate(const struct clk_hw *hw)
158{
159	struct sprd_clk_common *common = hw_to_sprd_clk_common(hw);
160
161	return container_of(common, struct sprd_gate, common);
162}
163
164extern const struct clk_ops sprd_gate_ops;
165extern const struct clk_ops sprd_sc_gate_ops;
166extern const struct clk_ops sprd_pll_sc_gate_ops;
167
168#endif /* _SPRD_GATE_H_ */