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