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 10struct 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 22struct 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 32struct 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 42struct 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 54struct clk *sunxi_factors_register(struct device_node *node, 55 const struct factors_data *data, 56 spinlock_t *lock, 57 void __iomem *reg); 58struct clk *sunxi_factors_register_critical(struct device_node *node, 59 const struct factors_data *data, 60 spinlock_t *lock, 61 void __iomem *reg); 62 63void sunxi_factors_unregister(struct device_node *node, struct clk *clk); 64 65#endif 66