xref: /linux/drivers/clk/sunxi/clk-factors.h (revision 827634added7f38b7d724cab1dccdb2b004c13c3)
1 #ifndef __MACH_SUNXI_CLK_FACTORS_H
2 #define __MACH_SUNXI_CLK_FACTORS_H
3 
4 #include <linux/clk-provider.h>
5 #include <linux/clkdev.h>
6 #include <linux/spinlock.h>
7 
8 #define SUNXI_FACTORS_NOT_APPLICABLE	(0)
9 
10 struct clk_factors_config {
11 	u8 nshift;
12 	u8 nwidth;
13 	u8 kshift;
14 	u8 kwidth;
15 	u8 mshift;
16 	u8 mwidth;
17 	u8 pshift;
18 	u8 pwidth;
19 	u8 n_start;
20 };
21 
22 struct factors_data {
23 	int enable;
24 	int mux;
25 	int muxmask;
26 	struct clk_factors_config *table;
27 	void (*getter) (u32 *rate, u32 parent_rate, u8 *n, u8 *k, u8 *m, u8 *p);
28 	const char *name;
29 };
30 
31 struct clk_factors {
32 	struct clk_hw hw;
33 	void __iomem *reg;
34 	struct clk_factors_config *config;
35 	void (*get_factors) (u32 *rate, u32 parent, u8 *n, u8 *k, u8 *m, u8 *p);
36 	spinlock_t *lock;
37 };
38 
39 struct clk *sunxi_factors_register(struct device_node *node,
40 				   const struct factors_data *data,
41 				   spinlock_t *lock,
42 				   void __iomem *reg);
43 
44 #endif
45