Merge tag 'idmapped-mounts-v5.12' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / drivers / clk / sunxi-ng / ccu_sdm.h
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