linux/drivers/clk/sunxi-ng/ccu_nm.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * Copyright (c) 2016 Maxime Ripard. All rights reserved.
   4 */
   5
   6#ifndef _CCU_NM_H_
   7#define _CCU_NM_H_
   8
   9#include <linux/clk-provider.h>
  10
  11#include "ccu_common.h"
  12#include "ccu_div.h"
  13#include "ccu_frac.h"
  14#include "ccu_mult.h"
  15#include "ccu_sdm.h"
  16
  17/*
  18 * struct ccu_nm - Definition of an N-M clock
  19 *
  20 * Clocks based on the formula parent * N / M
  21 */
  22struct ccu_nm {
  23        u32                     enable;
  24        u32                     lock;
  25
  26        struct ccu_mult_internal        n;
  27        struct ccu_div_internal         m;
  28        struct ccu_frac_internal        frac;
  29        struct ccu_sdm_internal         sdm;
  30
  31        unsigned int            fixed_post_div;
  32        unsigned int            min_rate;
  33        unsigned int            max_rate;
  34
  35        struct ccu_common       common;
  36};
  37
  38#define SUNXI_CCU_NM_WITH_SDM_GATE_LOCK(_struct, _name, _parent, _reg,  \
  39                                        _nshift, _nwidth,               \
  40                                        _mshift, _mwidth,               \
  41                                        _sdm_table, _sdm_en,            \
  42                                        _sdm_reg, _sdm_reg_en,          \
  43                                        _gate, _lock, _flags)           \
  44        struct ccu_nm _struct = {                                       \
  45                .enable         = _gate,                                \
  46                .lock           = _lock,                                \
  47                .n              = _SUNXI_CCU_MULT(_nshift, _nwidth),    \
  48                .m              = _SUNXI_CCU_DIV(_mshift, _mwidth),     \
  49                .sdm            = _SUNXI_CCU_SDM(_sdm_table, _sdm_en,   \
  50                                                 _sdm_reg, _sdm_reg_en),\
  51                .common         = {                                     \
  52                        .reg            = _reg,                         \
  53                        .features       = CCU_FEATURE_SIGMA_DELTA_MOD,  \
  54                        .hw.init        = CLK_HW_INIT(_name,            \
  55                                                      _parent,          \
  56                                                      &ccu_nm_ops,      \
  57                                                      _flags),          \
  58                },                                                      \
  59        }
  60
  61#define SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK(_struct, _name, _parent, _reg, \
  62                                         _nshift, _nwidth,              \
  63                                         _mshift, _mwidth,              \
  64                                         _frac_en, _frac_sel,           \
  65                                         _frac_rate_0, _frac_rate_1,    \
  66                                         _gate, _lock, _flags)          \
  67        struct ccu_nm _struct = {                                       \
  68                .enable         = _gate,                                \
  69                .lock           = _lock,                                \
  70                .n              = _SUNXI_CCU_MULT(_nshift, _nwidth),    \
  71                .m              = _SUNXI_CCU_DIV(_mshift, _mwidth),     \
  72                .frac           = _SUNXI_CCU_FRAC(_frac_en, _frac_sel,  \
  73                                                  _frac_rate_0,         \
  74                                                  _frac_rate_1),        \
  75                .common         = {                                     \
  76                        .reg            = _reg,                         \
  77                        .features       = CCU_FEATURE_FRACTIONAL,       \
  78                        .hw.init        = CLK_HW_INIT(_name,            \
  79                                                      _parent,          \
  80                                                      &ccu_nm_ops,      \
  81                                                      _flags),          \
  82                },                                                      \
  83        }
  84
  85#define SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN(_struct, _name, _parent,   \
  86                                             _reg, _min_rate,           \
  87                                             _nshift, _nwidth,          \
  88                                             _mshift, _mwidth,          \
  89                                             _frac_en, _frac_sel,       \
  90                                             _frac_rate_0, _frac_rate_1,\
  91                                             _gate, _lock, _flags)      \
  92        struct ccu_nm _struct = {                                       \
  93                .enable         = _gate,                                \
  94                .lock           = _lock,                                \
  95                .n              = _SUNXI_CCU_MULT(_nshift, _nwidth),    \
  96                .m              = _SUNXI_CCU_DIV(_mshift, _mwidth),     \
  97                .frac           = _SUNXI_CCU_FRAC(_frac_en, _frac_sel,  \
  98                                                  _frac_rate_0,         \
  99                                                  _frac_rate_1),        \
 100                .min_rate       = _min_rate,                            \
 101                .common         = {                                     \
 102                        .reg            = _reg,                         \
 103                        .features       = CCU_FEATURE_FRACTIONAL,       \
 104                        .hw.init        = CLK_HW_INIT(_name,            \
 105                                                      _parent,          \
 106                                                      &ccu_nm_ops,      \
 107                                                      _flags),          \
 108                },                                                      \
 109        }
 110
 111#define SUNXI_CCU_NM_WITH_FRAC_GATE_LOCK_MIN_MAX(_struct, _name,        \
 112                                                 _parent, _reg,         \
 113                                                 _min_rate, _max_rate,  \
 114                                                 _nshift, _nwidth,      \
 115                                                 _mshift, _mwidth,      \
 116                                                 _frac_en, _frac_sel,   \
 117                                                 _frac_rate_0,          \
 118                                                 _frac_rate_1,          \
 119                                                 _gate, _lock, _flags)  \
 120        struct ccu_nm _struct = {                                       \
 121                .enable         = _gate,                                \
 122                .lock           = _lock,                                \
 123                .n              = _SUNXI_CCU_MULT(_nshift, _nwidth),    \
 124                .m              = _SUNXI_CCU_DIV(_mshift, _mwidth),     \
 125                .frac           = _SUNXI_CCU_FRAC(_frac_en, _frac_sel,  \
 126                                                  _frac_rate_0,         \
 127                                                  _frac_rate_1),        \
 128                .min_rate       = _min_rate,                            \
 129                .max_rate       = _max_rate,                            \
 130                .common         = {                                     \
 131                        .reg            = _reg,                         \
 132                        .features       = CCU_FEATURE_FRACTIONAL,       \
 133                        .hw.init        = CLK_HW_INIT(_name,            \
 134                                                      _parent,          \
 135                                                      &ccu_nm_ops,      \
 136                                                      _flags),          \
 137                },                                                      \
 138        }
 139
 140#define SUNXI_CCU_NM_WITH_GATE_LOCK(_struct, _name, _parent, _reg,      \
 141                                    _nshift, _nwidth,                   \
 142                                    _mshift, _mwidth,                   \
 143                                    _gate, _lock, _flags)               \
 144        struct ccu_nm _struct = {                                       \
 145                .enable         = _gate,                                \
 146                .lock           = _lock,                                \
 147                .n              = _SUNXI_CCU_MULT(_nshift, _nwidth),    \
 148                .m              = _SUNXI_CCU_DIV(_mshift, _mwidth),     \
 149                .common         = {                                     \
 150                        .reg            = _reg,                         \
 151                        .hw.init        = CLK_HW_INIT(_name,            \
 152                                                      _parent,          \
 153                                                      &ccu_nm_ops,      \
 154                                                      _flags),          \
 155                },                                                      \
 156        }
 157
 158static inline struct ccu_nm *hw_to_ccu_nm(struct clk_hw *hw)
 159{
 160        struct ccu_common *common = hw_to_ccu_common(hw);
 161
 162        return container_of(common, struct ccu_nm, common);
 163}
 164
 165extern const struct clk_ops ccu_nm_ops;
 166
 167#endif /* _CCU_NM_H_ */
 168