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 61