brintos

brintos / linux-shallow public Read only

0
0
Text · 5.6 KiB · e738daf Raw
169 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2//3// Spreadtrum gate clock driver4//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_ */169