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 13 struct 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 157 static 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 164 extern const struct clk_ops sprd_gate_ops; 165 extern const struct clk_ops sprd_sc_gate_ops; 166 extern const struct clk_ops sprd_pll_sc_gate_ops; 167 168 #endif /* _SPRD_GATE_H_ */ 169