1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* |
3 | * Copyright (c) 2014 Marvell Technology Group Ltd. |
4 | * |
5 | * Alexandre Belloni <alexandre.belloni@free-electrons.com> |
6 | * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> |
7 | */ |
8 | #ifndef __BERLIN2_DIV_H |
9 | #define __BERLIN2_DIV_H |
10 | |
11 | struct clk_hw; |
12 | |
13 | #define BERLIN2_DIV_HAS_GATE BIT(0) |
14 | #define BERLIN2_DIV_HAS_MUX BIT(1) |
15 | |
16 | #define BERLIN2_PLL_SELECT(_off, _sh) \ |
17 | .pll_select_offs = _off, \ |
18 | .pll_select_shift = _sh |
19 | |
20 | #define BERLIN2_PLL_SWITCH(_off, _sh) \ |
21 | .pll_switch_offs = _off, \ |
22 | .pll_switch_shift = _sh |
23 | |
24 | #define BERLIN2_DIV_SELECT(_off, _sh) \ |
25 | .div_select_offs = _off, \ |
26 | .div_select_shift = _sh |
27 | |
28 | #define BERLIN2_DIV_SWITCH(_off, _sh) \ |
29 | .div_switch_offs = _off, \ |
30 | .div_switch_shift = _sh |
31 | |
32 | #define BERLIN2_DIV_D3SWITCH(_off, _sh) \ |
33 | .div3_switch_offs = _off, \ |
34 | .div3_switch_shift = _sh |
35 | |
36 | #define BERLIN2_DIV_GATE(_off, _sh) \ |
37 | .gate_offs = _off, \ |
38 | .gate_shift = _sh |
39 | |
40 | #define BERLIN2_SINGLE_DIV(_off) \ |
41 | BERLIN2_DIV_GATE(_off, 0), \ |
42 | BERLIN2_PLL_SELECT(_off, 1), \ |
43 | BERLIN2_PLL_SWITCH(_off, 4), \ |
44 | BERLIN2_DIV_SWITCH(_off, 5), \ |
45 | BERLIN2_DIV_D3SWITCH(_off, 6), \ |
46 | BERLIN2_DIV_SELECT(_off, 7) |
47 | |
48 | struct berlin2_div_map { |
49 | u16 pll_select_offs; |
50 | u16 pll_switch_offs; |
51 | u16 div_select_offs; |
52 | u16 div_switch_offs; |
53 | u16 div3_switch_offs; |
54 | u16 gate_offs; |
55 | u8 pll_select_shift; |
56 | u8 pll_switch_shift; |
57 | u8 div_select_shift; |
58 | u8 div_switch_shift; |
59 | u8 div3_switch_shift; |
60 | u8 gate_shift; |
61 | }; |
62 | |
63 | struct berlin2_div_data { |
64 | const char *name; |
65 | const u8 *parent_ids; |
66 | int num_parents; |
67 | unsigned long flags; |
68 | struct berlin2_div_map map; |
69 | u8 div_flags; |
70 | }; |
71 | |
72 | struct clk_hw * |
73 | berlin2_div_register(const struct berlin2_div_map *map, |
74 | void __iomem *base, const char *name, u8 div_flags, |
75 | const char **parent_names, int num_parents, |
76 | unsigned long flags, spinlock_t *lock); |
77 | |
78 | #endif /* __BERLIN2_DIV_H */ |
79 | |