1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | /* |
3 | * Copyright (c) 2017 Chen-Yu Tsai. All rights reserved. |
4 | */ |
5 | |
6 | #ifndef _CCU_SDM_H |
7 | #define _CCU_SDM_H |
8 | |
9 | #include <linux/clk-provider.h> |
10 | |
11 | #include "ccu_common.h" |
12 | |
13 | struct ccu_sdm_setting { |
14 | unsigned long rate; |
15 | |
16 | /* |
17 | * XXX We don't know what the step and bottom register fields |
18 | * mean. Just copy the whole register value from the vendor |
19 | * kernel for now. |
20 | */ |
21 | u32 pattern; |
22 | |
23 | /* |
24 | * M and N factors here should be the values used in |
25 | * calculation, not the raw values written to registers |
26 | */ |
27 | u32 m; |
28 | u32 n; |
29 | }; |
30 | |
31 | struct ccu_sdm_internal { |
32 | struct ccu_sdm_setting *table; |
33 | u32 table_size; |
34 | /* early SoCs don't have the SDM enable bit in the PLL register */ |
35 | u32 enable; |
36 | /* second enable bit in tuning register */ |
37 | u32 tuning_enable; |
38 | u16 tuning_reg; |
39 | }; |
40 | |
41 | #define _SUNXI_CCU_SDM(_table, _enable, \ |
42 | _reg, _reg_enable) \ |
43 | { \ |
44 | .table = _table, \ |
45 | .table_size = ARRAY_SIZE(_table), \ |
46 | .enable = _enable, \ |
47 | .tuning_enable = _reg_enable, \ |
48 | .tuning_reg = _reg, \ |
49 | } |
50 | |
51 | bool ccu_sdm_helper_is_enabled(struct ccu_common *common, |
52 | struct ccu_sdm_internal *sdm); |
53 | void ccu_sdm_helper_enable(struct ccu_common *common, |
54 | struct ccu_sdm_internal *sdm, |
55 | unsigned long rate); |
56 | void ccu_sdm_helper_disable(struct ccu_common *common, |
57 | struct ccu_sdm_internal *sdm); |
58 | |
59 | bool ccu_sdm_helper_has_rate(struct ccu_common *common, |
60 | struct ccu_sdm_internal *sdm, |
61 | unsigned long rate); |
62 | |
63 | unsigned long ccu_sdm_helper_read_rate(struct ccu_common *common, |
64 | struct ccu_sdm_internal *sdm, |
65 | u32 m, u32 n); |
66 | |
67 | int ccu_sdm_helper_get_factors(struct ccu_common *common, |
68 | struct ccu_sdm_internal *sdm, |
69 | unsigned long rate, |
70 | unsigned long *m, unsigned long *n); |
71 | |
72 | #endif |
73 | |