1e63c5b2d5f4cb6866127100be2274a7095641cd
[sfrench/cifs-2.6.git] / drivers / clk / sunxi / clk-factors.h
1 #ifndef __MACH_SUNXI_CLK_FACTORS_H
2 #define __MACH_SUNXI_CLK_FACTORS_H
3
4 #include <linux/clk-provider.h>
5 #include <linux/spinlock.h>
6
7 #define SUNXI_FACTORS_NOT_APPLICABLE    (0)
8
9 struct clk_factors_config {
10         u8 nshift;
11         u8 nwidth;
12         u8 kshift;
13         u8 kwidth;
14         u8 mshift;
15         u8 mwidth;
16         u8 pshift;
17         u8 pwidth;
18         u8 n_start;
19 };
20
21 struct factors_request {
22         unsigned long rate;
23         unsigned long parent_rate;
24         u8 parent_index;
25         u8 n;
26         u8 k;
27         u8 m;
28         u8 p;
29 };
30
31 struct factors_data {
32         int enable;
33         int mux;
34         int muxmask;
35         const struct clk_factors_config *table;
36         void (*getter)(struct factors_request *req);
37         void (*recalc)(struct factors_request *req);
38         const char *name;
39 };
40
41 struct clk_factors {
42         struct clk_hw hw;
43         void __iomem *reg;
44         const struct clk_factors_config *config;
45         void (*get_factors)(struct factors_request *req);
46         void (*recalc)(struct factors_request *req);
47         spinlock_t *lock;
48         /* for cleanup */
49         struct clk_mux *mux;
50         struct clk_gate *gate;
51 };
52
53 struct clk *sunxi_factors_register(struct device_node *node,
54                                    const struct factors_data *data,
55                                    spinlock_t *lock,
56                                    void __iomem *reg);
57
58 void sunxi_factors_unregister(struct device_node *node, struct clk *clk);
59
60 #endif