Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 //
0003 // Spreadtrum gate clock driver
0004 //
0005 // Copyright (C) 2017 Spreadtrum, Inc.
0006 // Author: Chunyan Zhang <chunyan.zhang@spreadtrum.com>
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  * sprd_gate->flags is used for:
0024  * CLK_GATE_SET_TO_DISABLE  BIT(0)
0025  * CLK_GATE_HIWORD_MASK     BIT(1)
0026  * CLK_GATE_BIG_ENDIAN      BIT(2)
0027  * so we define new flags from  BIT(3)
0028  */
0029 #define SPRD_GATE_NON_AON BIT(3) /* not alway powered on, check before read */
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 /* _SPRD_GATE_H_ */