1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef __MACH_SUNXI_CLK_FACTORS_H 3 #define __MACH_SUNXI_CLK_FACTORS_H 4 5 #include <linux/clk-provider.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_request { 23 unsigned long rate; 24 unsigned long parent_rate; 25 u8 parent_index; 26 u8 n; 27 u8 k; 28 u8 m; 29 u8 p; 30 }; 31 32 struct factors_data { 33 int enable; 34 int mux; 35 int muxmask; 36 const struct clk_factors_config *table; 37 void (*getter)(struct factors_request *req); 38 void (*recalc)(struct factors_request *req); 39 const char *name; 40 }; 41 42 struct clk_factors { 43 struct clk_hw hw; 44 void __iomem *reg; 45 const struct clk_factors_config *config; 46 void (*get_factors)(struct factors_request *req); 47 void (*recalc)(struct factors_request *req); 48 spinlock_t *lock; 49 /* for cleanup */ 50 struct clk_mux *mux; 51 struct clk_gate *gate; 52 }; 53 54 struct clk *sunxi_factors_register(struct device_node *node, 55 const struct factors_data *data, 56 spinlock_t *lock, 57 void __iomem *reg); 58 struct clk *sunxi_factors_register_critical(struct device_node *node, 59 const struct factors_data *data, 60 spinlock_t *lock, 61 void __iomem *reg); 62 63 void sunxi_factors_unregister(struct device_node *node, struct clk *clk); 64 65 #endif 66