linux/drivers/clk/sprd/gate.h
<<
>>
Prefs
   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_ */
 169