0001
0002
0003
0004
0005
0006
0007
0008 #ifndef _SPRD_GATE_H_
0009 #define _SPRD_GATE_H_
0010
0011 #include "common.h"
0012
0013 struct sprd_gate {
0014 u32 enable_mask;
0015 u16 flags;
0016 u16 sc_offset;
0017 u16 udelay;
0018
0019 struct sprd_clk_common common;
0020 };
0021
0022
0023
0024
0025
0026
0027
0028
0029 #define SPRD_GATE_NON_AON BIT(3)
0030
0031 #define SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \
0032 _sc_offset, _enable_mask, _flags, \
0033 _gate_flags, _udelay, _ops, _fn) \
0034 struct sprd_gate _struct = { \
0035 .enable_mask = _enable_mask, \
0036 .sc_offset = _sc_offset, \
0037 .flags = _gate_flags, \
0038 .udelay = _udelay, \
0039 .common = { \
0040 .regmap = NULL, \
0041 .reg = _reg, \
0042 .hw.init = _fn(_name, _parent, \
0043 _ops, _flags), \
0044 } \
0045 }
0046
0047 #define SPRD_SC_GATE_CLK_OPS_UDELAY(_struct, _name, _parent, _reg, \
0048 _sc_offset, _enable_mask, _flags, \
0049 _gate_flags, _udelay, _ops) \
0050 SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \
0051 _sc_offset, _enable_mask, _flags, \
0052 _gate_flags, _udelay, _ops, CLK_HW_INIT)
0053
0054 #define SPRD_SC_GATE_CLK_OPS(_struct, _name, _parent, _reg, _sc_offset, \
0055 _enable_mask, _flags, _gate_flags, _ops) \
0056 SPRD_SC_GATE_CLK_OPS_UDELAY(_struct, _name, _parent, _reg, \
0057 _sc_offset, _enable_mask, _flags, \
0058 _gate_flags, 0, _ops)
0059
0060 #define SPRD_SC_GATE_CLK(_struct, _name, _parent, _reg, _sc_offset, \
0061 _enable_mask, _flags, _gate_flags) \
0062 SPRD_SC_GATE_CLK_OPS(_struct, _name, _parent, _reg, _sc_offset, \
0063 _enable_mask, _flags, _gate_flags, \
0064 &sprd_sc_gate_ops)
0065
0066 #define SPRD_GATE_CLK(_struct, _name, _parent, _reg, \
0067 _enable_mask, _flags, _gate_flags) \
0068 SPRD_SC_GATE_CLK_OPS(_struct, _name, _parent, _reg, 0, \
0069 _enable_mask, _flags, _gate_flags, \
0070 &sprd_gate_ops)
0071
0072 #define SPRD_PLL_SC_GATE_CLK(_struct, _name, _parent, _reg, _sc_offset, \
0073 _enable_mask, _flags, _gate_flags, \
0074 _udelay) \
0075 SPRD_SC_GATE_CLK_OPS_UDELAY(_struct, _name, _parent, _reg, \
0076 _sc_offset, _enable_mask, _flags, \
0077 _gate_flags, _udelay, \
0078 &sprd_pll_sc_gate_ops)
0079
0080
0081 #define SPRD_SC_GATE_CLK_HW_OPS_UDELAY(_struct, _name, _parent, _reg, \
0082 _sc_offset, _enable_mask, \
0083 _flags, _gate_flags, \
0084 _udelay, _ops) \
0085 SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \
0086 _sc_offset, _enable_mask, _flags, \
0087 _gate_flags, _udelay, _ops, \
0088 CLK_HW_INIT_HW)
0089
0090 #define SPRD_SC_GATE_CLK_HW_OPS(_struct, _name, _parent, _reg, \
0091 _sc_offset, _enable_mask, _flags, \
0092 _gate_flags, _ops) \
0093 SPRD_SC_GATE_CLK_HW_OPS_UDELAY(_struct, _name, _parent, _reg, \
0094 _sc_offset, _enable_mask, \
0095 _flags, _gate_flags, 0, _ops)
0096
0097 #define SPRD_SC_GATE_CLK_HW(_struct, _name, _parent, _reg, \
0098 _sc_offset, _enable_mask, _flags, \
0099 _gate_flags) \
0100 SPRD_SC_GATE_CLK_HW_OPS(_struct, _name, _parent, _reg, \
0101 _sc_offset, _enable_mask, _flags, \
0102 _gate_flags, &sprd_sc_gate_ops)
0103
0104 #define SPRD_GATE_CLK_HW(_struct, _name, _parent, _reg, \
0105 _enable_mask, _flags, _gate_flags) \
0106 SPRD_SC_GATE_CLK_HW_OPS(_struct, _name, _parent, _reg, 0, \
0107 _enable_mask, _flags, _gate_flags, \
0108 &sprd_gate_ops)
0109
0110 #define SPRD_PLL_SC_GATE_CLK_HW(_struct, _name, _parent, _reg, \
0111 _sc_offset, _enable_mask, _flags, \
0112 _gate_flags, _udelay) \
0113 SPRD_SC_GATE_CLK_HW_OPS_UDELAY(_struct, _name, _parent, _reg, \
0114 _sc_offset, _enable_mask, \
0115 _flags, _gate_flags, _udelay, \
0116 &sprd_pll_sc_gate_ops)
0117
0118 #define SPRD_SC_GATE_CLK_FW_NAME_OPS_UDELAY(_struct, _name, _parent, \
0119 _reg, _sc_offset, \
0120 _enable_mask, _flags, \
0121 _gate_flags, _udelay, _ops) \
0122 SPRD_SC_GATE_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \
0123 _sc_offset, _enable_mask, _flags, \
0124 _gate_flags, _udelay, _ops, \
0125 CLK_HW_INIT_FW_NAME)
0126
0127 #define SPRD_SC_GATE_CLK_FW_NAME_OPS(_struct, _name, _parent, _reg, \
0128 _sc_offset, _enable_mask, _flags, \
0129 _gate_flags, _ops) \
0130 SPRD_SC_GATE_CLK_FW_NAME_OPS_UDELAY(_struct, _name, _parent, \
0131 _reg, _sc_offset, \
0132 _enable_mask, _flags, \
0133 _gate_flags, 0, _ops)
0134
0135 #define SPRD_SC_GATE_CLK_FW_NAME(_struct, _name, _parent, _reg, \
0136 _sc_offset, _enable_mask, _flags, \
0137 _gate_flags) \
0138 SPRD_SC_GATE_CLK_FW_NAME_OPS(_struct, _name, _parent, _reg, \
0139 _sc_offset, _enable_mask, _flags, \
0140 _gate_flags, &sprd_sc_gate_ops)
0141
0142 #define SPRD_GATE_CLK_FW_NAME(_struct, _name, _parent, _reg, \
0143 _enable_mask, _flags, _gate_flags) \
0144 SPRD_SC_GATE_CLK_FW_NAME_OPS(_struct, _name, _parent, _reg, 0, \
0145 _enable_mask, _flags, _gate_flags, \
0146 &sprd_gate_ops)
0147
0148 #define SPRD_PLL_SC_GATE_CLK_FW_NAME(_struct, _name, _parent, _reg, \
0149 _sc_offset, _enable_mask, _flags, \
0150 _gate_flags, _udelay) \
0151 SPRD_SC_GATE_CLK_FW_NAME_OPS_UDELAY(_struct, _name, _parent, \
0152 _reg, _sc_offset, \
0153 _enable_mask, _flags, \
0154 _gate_flags, _udelay, \
0155 &sprd_pll_sc_gate_ops)
0156
0157 static inline struct sprd_gate *hw_to_sprd_gate(const struct clk_hw *hw)
0158 {
0159 struct sprd_clk_common *common = hw_to_sprd_clk_common(hw);
0160
0161 return container_of(common, struct sprd_gate, common);
0162 }
0163
0164 extern const struct clk_ops sprd_gate_ops;
0165 extern const struct clk_ops sprd_sc_gate_ops;
0166 extern const struct clk_ops sprd_pll_sc_gate_ops;
0167
0168 #endif