66 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 */
 | |
| #ifndef __MACH_SUNXI_CLK_FACTORS_H
 | |
| #define __MACH_SUNXI_CLK_FACTORS_H
 | |
| 
 | |
| #include <linux/clk-provider.h>
 | |
| #include <linux/spinlock.h>
 | |
| 
 | |
| #define SUNXI_FACTORS_NOT_APPLICABLE	(0)
 | |
| 
 | |
| struct clk_factors_config {
 | |
| 	u8 nshift;
 | |
| 	u8 nwidth;
 | |
| 	u8 kshift;
 | |
| 	u8 kwidth;
 | |
| 	u8 mshift;
 | |
| 	u8 mwidth;
 | |
| 	u8 pshift;
 | |
| 	u8 pwidth;
 | |
| 	u8 n_start;
 | |
| };
 | |
| 
 | |
| struct factors_request {
 | |
| 	unsigned long rate;
 | |
| 	unsigned long parent_rate;
 | |
| 	u8 parent_index;
 | |
| 	u8 n;
 | |
| 	u8 k;
 | |
| 	u8 m;
 | |
| 	u8 p;
 | |
| };
 | |
| 
 | |
| struct factors_data {
 | |
| 	int enable;
 | |
| 	int mux;
 | |
| 	int muxmask;
 | |
| 	const struct clk_factors_config *table;
 | |
| 	void (*getter)(struct factors_request *req);
 | |
| 	void (*recalc)(struct factors_request *req);
 | |
| 	const char *name;
 | |
| };
 | |
| 
 | |
| struct clk_factors {
 | |
| 	struct clk_hw hw;
 | |
| 	void __iomem *reg;
 | |
| 	const struct clk_factors_config *config;
 | |
| 	void (*get_factors)(struct factors_request *req);
 | |
| 	void (*recalc)(struct factors_request *req);
 | |
| 	spinlock_t *lock;
 | |
| 	/* for cleanup */
 | |
| 	struct clk_mux *mux;
 | |
| 	struct clk_gate *gate;
 | |
| };
 | |
| 
 | |
| struct clk *sunxi_factors_register(struct device_node *node,
 | |
| 				   const struct factors_data *data,
 | |
| 				   spinlock_t *lock,
 | |
| 				   void __iomem *reg);
 | |
| struct clk *sunxi_factors_register_critical(struct device_node *node,
 | |
| 					    const struct factors_data *data,
 | |
| 					    spinlock_t *lock,
 | |
| 					    void __iomem *reg);
 | |
| 
 | |
| void sunxi_factors_unregister(struct device_node *node, struct clk *clk);
 | |
| 
 | |
| #endif
 |