1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __CLK_STARFIVE_JH71X0_H
3 #define __CLK_STARFIVE_JH71X0_H
5 #include <linux/bits.h>
6 #include <linux/clk-provider.h>
7 #include <linux/device.h>
8 #include <linux/spinlock.h>
11 #define JH71X0_CLK_ENABLE BIT(31)
12 #define JH71X0_CLK_INVERT BIT(30)
13 #define JH71X0_CLK_MUX_MASK GENMASK(27, 24)
14 #define JH71X0_CLK_MUX_SHIFT 24
15 #define JH71X0_CLK_DIV_MASK GENMASK(23, 0)
16 #define JH71X0_CLK_FRAC_MASK GENMASK(15, 8)
17 #define JH71X0_CLK_FRAC_SHIFT 8
18 #define JH71X0_CLK_INT_MASK GENMASK(7, 0)
20 /* fractional divider min/max */
21 #define JH71X0_CLK_FRAC_MIN 100UL
22 #define JH71X0_CLK_FRAC_MAX 25599UL
25 struct jh71x0_clk_data {
32 #define JH71X0_GATE(_idx, _name, _flags, _parent) [_idx] = { \
34 .flags = CLK_SET_RATE_PARENT | (_flags), \
35 .max = JH71X0_CLK_ENABLE, \
36 .parents = { [0] = _parent }, \
39 #define JH71X0__DIV(_idx, _name, _max, _parent) [_idx] = { \
43 .parents = { [0] = _parent }, \
46 #define JH71X0_GDIV(_idx, _name, _flags, _max, _parent) [_idx] = { \
49 .max = JH71X0_CLK_ENABLE | (_max), \
50 .parents = { [0] = _parent }, \
53 #define JH71X0_FDIV(_idx, _name, _parent) [_idx] = { \
56 .max = JH71X0_CLK_FRAC_MAX, \
57 .parents = { [0] = _parent }, \
60 #define JH71X0__MUX(_idx, _name, _nparents, ...) [_idx] = { \
63 .max = ((_nparents) - 1) << JH71X0_CLK_MUX_SHIFT, \
64 .parents = { __VA_ARGS__ }, \
67 #define JH71X0_GMUX(_idx, _name, _flags, _nparents, ...) [_idx] = { \
70 .max = JH71X0_CLK_ENABLE | \
71 (((_nparents) - 1) << JH71X0_CLK_MUX_SHIFT), \
72 .parents = { __VA_ARGS__ }, \
75 #define JH71X0_MDIV(_idx, _name, _max, _nparents, ...) [_idx] = { \
78 .max = (((_nparents) - 1) << JH71X0_CLK_MUX_SHIFT) | (_max), \
79 .parents = { __VA_ARGS__ }, \
82 #define JH71X0__GMD(_idx, _name, _flags, _max, _nparents, ...) [_idx] = { \
85 .max = JH71X0_CLK_ENABLE | \
86 (((_nparents) - 1) << JH71X0_CLK_MUX_SHIFT) | (_max), \
87 .parents = { __VA_ARGS__ }, \
90 #define JH71X0__INV(_idx, _name, _parent) [_idx] = { \
92 .flags = CLK_SET_RATE_PARENT, \
93 .max = JH71X0_CLK_INVERT, \
94 .parents = { [0] = _parent }, \
100 unsigned int max_div;
103 struct jh71x0_clk_priv {
104 /* protect clk enable and set rate/parent from happening at the same time */
108 struct clk_hw *pll[3];
109 struct jh71x0_clk reg[];
112 const struct clk_ops *starfive_jh71x0_clk_ops(u32 max);