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 9struct 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 21struct 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 31struct 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 41struct 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 53struct clk *sunxi_factors_register(struct device_node *node, 54 const struct factors_data *data, 55 spinlock_t *lock, 56 void __iomem *reg); 57 58void sunxi_factors_unregister(struct device_node *node, struct clk *clk); 59 60#endif 61