clk-starfive-jh7100.h (2976B)
1/* SPDX-License-Identifier: GPL-2.0 */ 2#ifndef __CLK_STARFIVE_JH7100_H 3#define __CLK_STARFIVE_JH7100_H 4 5#include <linux/bits.h> 6#include <linux/clk-provider.h> 7 8/* register fields */ 9#define JH7100_CLK_ENABLE BIT(31) 10#define JH7100_CLK_INVERT BIT(30) 11#define JH7100_CLK_MUX_MASK GENMASK(27, 24) 12#define JH7100_CLK_MUX_SHIFT 24 13#define JH7100_CLK_DIV_MASK GENMASK(23, 0) 14#define JH7100_CLK_FRAC_MASK GENMASK(15, 8) 15#define JH7100_CLK_FRAC_SHIFT 8 16#define JH7100_CLK_INT_MASK GENMASK(7, 0) 17 18/* fractional divider min/max */ 19#define JH7100_CLK_FRAC_MIN 100UL 20#define JH7100_CLK_FRAC_MAX 25599UL 21 22/* clock data */ 23struct jh7100_clk_data { 24 const char *name; 25 unsigned long flags; 26 u32 max; 27 u8 parents[4]; 28}; 29 30#define JH7100_GATE(_idx, _name, _flags, _parent) [_idx] = { \ 31 .name = _name, \ 32 .flags = CLK_SET_RATE_PARENT | (_flags), \ 33 .max = JH7100_CLK_ENABLE, \ 34 .parents = { [0] = _parent }, \ 35} 36 37#define JH7100__DIV(_idx, _name, _max, _parent) [_idx] = { \ 38 .name = _name, \ 39 .flags = 0, \ 40 .max = _max, \ 41 .parents = { [0] = _parent }, \ 42} 43 44#define JH7100_GDIV(_idx, _name, _flags, _max, _parent) [_idx] = { \ 45 .name = _name, \ 46 .flags = _flags, \ 47 .max = JH7100_CLK_ENABLE | (_max), \ 48 .parents = { [0] = _parent }, \ 49} 50 51#define JH7100_FDIV(_idx, _name, _parent) [_idx] = { \ 52 .name = _name, \ 53 .flags = 0, \ 54 .max = JH7100_CLK_FRAC_MAX, \ 55 .parents = { [0] = _parent }, \ 56} 57 58#define JH7100__MUX(_idx, _name, _nparents, ...) [_idx] = { \ 59 .name = _name, \ 60 .flags = 0, \ 61 .max = ((_nparents) - 1) << JH7100_CLK_MUX_SHIFT, \ 62 .parents = { __VA_ARGS__ }, \ 63} 64 65#define JH7100_GMUX(_idx, _name, _flags, _nparents, ...) [_idx] = { \ 66 .name = _name, \ 67 .flags = _flags, \ 68 .max = JH7100_CLK_ENABLE | \ 69 (((_nparents) - 1) << JH7100_CLK_MUX_SHIFT), \ 70 .parents = { __VA_ARGS__ }, \ 71} 72 73#define JH7100_MDIV(_idx, _name, _max, _nparents, ...) [_idx] = { \ 74 .name = _name, \ 75 .flags = 0, \ 76 .max = (((_nparents) - 1) << JH7100_CLK_MUX_SHIFT) | (_max), \ 77 .parents = { __VA_ARGS__ }, \ 78} 79 80#define JH7100__GMD(_idx, _name, _flags, _max, _nparents, ...) [_idx] = { \ 81 .name = _name, \ 82 .flags = _flags, \ 83 .max = JH7100_CLK_ENABLE | \ 84 (((_nparents) - 1) << JH7100_CLK_MUX_SHIFT) | (_max), \ 85 .parents = { __VA_ARGS__ }, \ 86} 87 88#define JH7100__INV(_idx, _name, _parent) [_idx] = { \ 89 .name = _name, \ 90 .flags = CLK_SET_RATE_PARENT, \ 91 .max = JH7100_CLK_INVERT, \ 92 .parents = { [0] = _parent }, \ 93} 94 95struct jh7100_clk { 96 struct clk_hw hw; 97 unsigned int idx; 98 unsigned int max_div; 99}; 100 101struct jh7100_clk_priv { 102 /* protect clk enable and set rate/parent from happening at the same time */ 103 spinlock_t rmw_lock; 104 struct device *dev; 105 void __iomem *base; 106 struct clk_hw *pll[3]; 107 struct jh7100_clk reg[]; 108}; 109 110const struct clk_ops *starfive_jh7100_clk_ops(u32 max); 111 112#endif