| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- /* SPDX-License-Identifier: GPL-2.0 */
- /*
- * Copyright (C) 2023 Inochi Amaoto <inochiama@outlook.com>
- */
- #ifndef _CLK_SOPHGO_CV1800_PLL_H_
- #define _CLK_SOPHGO_CV1800_PLL_H_
- #include "clk-cv18xx-common.h"
- struct cv1800_clk_pll_limit {
- struct {
- u8 min;
- u8 max;
- } pre_div, div, post_div, ictrl, mode;
- };
- #define _CV1800_PLL_LIMIT(_min, _max) \
- { \
- .min = _min, \
- .max = _max, \
- } \
- #define for_each_pll_limit_range(_var, _restrict) \
- for (_var = (_restrict)->min; _var <= (_restrict)->max; _var++)
- struct cv1800_clk_pll_synthesizer {
- struct cv1800_clk_regbit en;
- struct cv1800_clk_regbit clk_half;
- u32 ctrl;
- u32 set;
- };
- #define _PLL_PRE_DIV_SEL_FIELD GENMASK(6, 0)
- #define _PLL_POST_DIV_SEL_FIELD GENMASK(14, 8)
- #define _PLL_SEL_MODE_FIELD GENMASK(16, 15)
- #define _PLL_DIV_SEL_FIELD GENMASK(23, 17)
- #define _PLL_ICTRL_FIELD GENMASK(26, 24)
- #define _PLL_ALL_FIELD_MASK \
- (_PLL_PRE_DIV_SEL_FIELD | \
- _PLL_POST_DIV_SEL_FIELD | \
- _PLL_SEL_MODE_FIELD | \
- _PLL_DIV_SEL_FIELD | \
- _PLL_ICTRL_FIELD)
- #define PLL_COPY_REG(_dest, _src) \
- (((_dest) & (~_PLL_ALL_FIELD_MASK)) | ((_src) & _PLL_ALL_FIELD_MASK))
- #define PLL_GET_PRE_DIV_SEL(_reg) \
- FIELD_GET(_PLL_PRE_DIV_SEL_FIELD, (_reg))
- #define PLL_GET_POST_DIV_SEL(_reg) \
- FIELD_GET(_PLL_POST_DIV_SEL_FIELD, (_reg))
- #define PLL_GET_SEL_MODE(_reg) \
- FIELD_GET(_PLL_SEL_MODE_FIELD, (_reg))
- #define PLL_GET_DIV_SEL(_reg) \
- FIELD_GET(_PLL_DIV_SEL_FIELD, (_reg))
- #define PLL_GET_ICTRL(_reg) \
- FIELD_GET(_PLL_ICTRL_FIELD, (_reg))
- #define PLL_SET_PRE_DIV_SEL(_reg, _val) \
- _CV1800_SET_FIELD((_reg), (_val), _PLL_PRE_DIV_SEL_FIELD)
- #define PLL_SET_POST_DIV_SEL(_reg, _val) \
- _CV1800_SET_FIELD((_reg), (_val), _PLL_POST_DIV_SEL_FIELD)
- #define PLL_SET_SEL_MODE(_reg, _val) \
- _CV1800_SET_FIELD((_reg), (_val), _PLL_SEL_MODE_FIELD)
- #define PLL_SET_DIV_SEL(_reg, _val) \
- _CV1800_SET_FIELD((_reg), (_val), _PLL_DIV_SEL_FIELD)
- #define PLL_SET_ICTRL(_reg, _val) \
- _CV1800_SET_FIELD((_reg), (_val), _PLL_ICTRL_FIELD)
- struct cv1800_clk_pll {
- struct cv1800_clk_common common;
- u32 pll_reg;
- struct cv1800_clk_regbit pll_pwd;
- struct cv1800_clk_regbit pll_status;
- const struct cv1800_clk_pll_limit *pll_limit;
- struct cv1800_clk_pll_synthesizer *pll_syn;
- };
- #define CV1800_INTEGRAL_PLL(_name, _parent, _pll_reg, \
- _pll_pwd_reg, _pll_pwd_shift, \
- _pll_status_reg, _pll_status_shift, \
- _pll_limit, _flags) \
- struct cv1800_clk_pll _name = { \
- .common = CV1800_CLK_COMMON(#_name, _parent, \
- &cv1800_clk_ipll_ops,\
- _flags), \
- .pll_reg = _pll_reg, \
- .pll_pwd = CV1800_CLK_BIT(_pll_pwd_reg, \
- _pll_pwd_shift), \
- .pll_status = CV1800_CLK_BIT(_pll_status_reg, \
- _pll_status_shift), \
- .pll_limit = _pll_limit, \
- .pll_syn = NULL, \
- }
- #define CV1800_FACTIONAL_PLL(_name, _parent, _pll_reg, \
- _pll_pwd_reg, _pll_pwd_shift, \
- _pll_status_reg, _pll_status_shift, \
- _pll_limit, _pll_syn, _flags) \
- struct cv1800_clk_pll _name = { \
- .common = CV1800_CLK_COMMON(#_name, _parent, \
- &cv1800_clk_fpll_ops,\
- _flags), \
- .pll_reg = _pll_reg, \
- .pll_pwd = CV1800_CLK_BIT(_pll_pwd_reg, \
- _pll_pwd_shift), \
- .pll_status = CV1800_CLK_BIT(_pll_status_reg, \
- _pll_status_shift), \
- .pll_limit = _pll_limit, \
- .pll_syn = _pll_syn, \
- }
- extern const struct clk_ops cv1800_clk_ipll_ops;
- extern const struct clk_ops cv1800_clk_fpll_ops;
- #endif // _CLK_SOPHGO_CV1800_PLL_H_
|